• 2016大连网络赛 Function


    Function

    Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)


    Problem Description
    The shorter, the simpler. With this problem, you should be convinced of this truth.
      
      You are given an array A of N postive integers, and M queries in the form (l,r). A function F(l,r) (1lrN) is defined as:
    F(l,r)={AlF(l,r1) modArl=r;l<r.
    You job is to calculate F(l,r), for each query (l,r).
     
    Input
    There are multiple test cases.
      
      The first line of input contains a integer T, indicating number of test cases, and T test cases follow.
      
      For each test case, the first line contains an integer N(1N100000).
      The second line contains N space-separated positive integers: A1,,AN (0Ai109).
      The third line contains an integer M denoting the number of queries.
      The following M lines each contain two integers l,r (1lrN), representing a query.
     
    Output
    For each query(l,r), output F(l,r) on one line.
     
    Sample Input
    1 3 2 3 3 1 1 3
     
    Sample Output
    2
    分析:每次取模第一个比当前答案小于等于的数,RMQ+二分;
    代码:
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cmath>
    #include <algorithm>
    #include <climits>
    #include <cstring>
    #include <string>
    #include <set>
    #include <map>
    #include <queue>
    #include <stack>
    #include <vector>
    #include <list>
    #define rep(i,m,n) for(i=m;i<=n;i++)
    #define rsp(it,s) for(set<int>::iterator it=s.begin();it!=s.end();it++)
    #define mod 1000000007
    #define inf 0x3f3f3f3f
    #define vi vector<int>
    #define pb push_back
    #define mp make_pair
    #define fi first
    #define se second
    #define ll long long
    #define pi acos(-1.0)
    #define pii pair<int,int>
    #define Lson L, mid, rt<<1
    #define Rson mid+1, R, rt<<1|1
    const int maxn=1e5+10;
    using namespace std;
    ll gcd(ll p,ll q){return q==0?p:gcd(q,p%q);}
    ll qpow(ll p,ll q){ll f=1;while(q){if(q&1)f=f*p;p=p*p;q>>=1;}return f;}
    int n,m,k,t,q,a[30][maxn],p[maxn];
    void init()
    {
        for(int i=1;i<=29;i++)
            for(int j=1;(ll)j+(1<<i)-1<=n;j++)
                a[i][j]=min(a[i-1][j],a[i-1][j+(1<<(i-1))]);
    }
    int get(int l,int r)
    {
        int x=p[r-l+1];
        return min(a[x][l],a[x][r-(1<<x)+1]);
    }
    int main()
    {
        int i,j;
        for(i=2;i<=maxn-10;i++)p[i]=1+p[i>>1];
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d",&n);
            rep(i,1,n)scanf("%d",&a[0][i]);
            init();
            scanf("%d",&q);
            while(q--)
            {
                int l,r;
                scanf("%d%d",&l,&r);
                int ans=a[0][l],_r=r;
                l++;
                while(1)
                {
                    int b=l,r=_r,pos=-1;
                    while(l<=r)
                    {
                        int mid=l+r>>1;
                        if(get(b,mid)<=ans)pos=mid,r=mid-1;
                        else l=mid+1;
                    }
                    if(pos==-1)break;
                    else ans%=a[0][pos],l=pos+1;
                }
                printf("%d
    ",ans);
            }
        }
        //system("Pause");
        return 0;
    }
  • 相关阅读:
    第10件事 向优秀产品学习的学问
    第9件事 产品定位要解决的6个问题
    第8件事 3步打造产品的独特气质
    Git 从服务器取得最新代码覆盖本地
    Git:代码冲突常见解决方法
    oracle线程数更改
    从Git仓库中恢复已删除的分支、文件或丢失的commit
    Sublime 3114 + 转换GBK方法
    教你快速写出多线程Junit单元测试用例
    Spring中加载xml配置文件的六种方式
  • 原文地址:https://www.cnblogs.com/dyzll/p/5860723.html
Copyright © 2020-2023  润新知