Function---hdu5875(大连网选,区间连续求余)

Posted 西瓜不懂柠檬的酸

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Function---hdu5875(大连网选,区间连续求余)相关的知识,希望对你有一定的参考价值。

题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5875

题意:有n个数,m个查询,每个查询有一个区间[L, R], 求ans, ans = a[L]%a[L+1]%a[L+2]%...%a[R];

方法一:算是暴力吧,只能说数据太水;

用pos[i] = j 表示第 i 个元素后面的一个<= a[i]的下标是 j ;

然后直接跳到当前位置即可,(我感觉如果数中有10e5个严格递减或者严格递增的序列是会TLE吧)但是这个还是过了,我想应该是数据太弱了吧

技术分享
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
#define met(a, b) memset(a, b, sizeof(a))
#define N 100005
#define INF 0x3f3f3f3f
typedef long long LL;
#define Lson r<<1
#define Rson r<<1|1

int n, a[N], pos[N], m;

int main()
{
    int T;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d", &n);
        for(int i=1; i<=n; i++)
            scanf("%d", &a[i]);

        a[0] = INF;

        for(int i=1; i<=n; i++)
        {
            for(int j=i+1; j<=n; j++)
            {
                if(a[j] <= a[i])
                {
                    pos[i] = j;
                    break;
                }
            }
        }
        scanf("%d", &m);
        for(int i=1; i<=m; i++)
        {
            int L, R;
            scanf("%d %d", &L, &R);
            int ans = a[L];
            while(ans && pos[L]<=R && L)
            {
                ans = ans%a[pos[L]];
                L = pos[L];
            }
            printf("%d\n", ans);
        }
    }
    return 0;
}
View Code

方法二:在每个查询的时候,用线段树优化,当在区间[L, R]中找到第一个<=num的位置即可;

 

以上是关于Function---hdu5875(大连网选,区间连续求余)的主要内容,如果未能解决你的问题,请参考以下文章

HDU 5875 Function -2016 ICPC 大连赛区网络赛

HDU 5875 Function (大连网络赛 H 线段树+gcd)

2016大连网络赛 1008 & hdu5875 (优先队列+离线)=不确定暴力

2016大连网赛

(转)大连患癌出走父亲甘区一山上被找到 已自杀身亡

2019沈阳网选——模拟