HDU 5875 Function 2016 ACM/ICPC Asia Regional Dalian Online

来源:互联网 发布:aws windows vpn 配置 编辑:程序博客网 时间:2024/04/28 01:11

一个小的数mod大于它的数等于它本身,考虑从左往右遍历,但是要每次跳过比它大的那些数,直接指向它右边第一个比它小的。

显然这样做的这样复杂度是不定的……最坏的情况还是O(logNM),即所有的数据都是降序且余数一直递减。为什么是logN,如果a>=b,a%b<=a/2,所以是2^n递减的,谢谢2楼评论的提醒……。

【代码】

<span style="font-size:14px;">/* ***********************************************Author        :angon************************************************ */#include <stdio.h>#include <string.h>#include <iostream>#include <algorithm>#include <stack>#include <vector>#include <queue>#include <set>#include <map>#include <string>#include <math.h>#include <stdlib.h>#include <time.h>using namespace std;#define showtime fprintf(stderr,"time = %.15f\n",clock() / (double)CLOCKS_PER_SEC)#define lld %I64d#define REP(i,k,n) for(int i=k;i<n;i++)#define REPP(i,k,n) for(int i=k;i<=n;i++)#define scan(d) scanf("%d",&d)#define scanl(d) scanf("%I64d",&d)#define scann(n,m) scanf("%d%d",&n,&m)#define scannl(n,m) scanf("%I64d%I64d",&n,&m)#define mst(a,k)  memset(a,k,sizeof(a))#define LL long long#define N 100005#define mod 1000000007const int INF = 0x3f3f3f3f;int a[N],r[N];int main(){    //freopen("in.txt","r",stdin);    //freopen("out.txt","w",stdout);    int T;    scan(T);    while(T--)    {        int n;        scan(n);        REPP(i,1,n) scan(a[i]);        mst(r,INF);        for(int i=n-1;i>=1;i--)        {            int k = i+1;            while(1)            {                if(a[i]>a[k])                {                    r[i] = k;                    break;                }                if(r[k]==INF)                    break;                k = r[k];            }        }        int q;        scan(q);        while(q--)        {            int x,y;            scann(x,y);            int ans = a[x];            x = r[x];            while(x <= y)            {                ans %= a[x];                if(ans == 0)                    break;               x = r[x];            }            printf("%d\n",ans);        }    }    return 0;}</span>



0 0
原创粉丝点击