码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-09-15 16:24:21      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:

题目链接: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(大连网选,区间连续求余)

标签:

原文地址:http://www.cnblogs.com/zhengguiping--9876/p/5874937.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!