HDU 5875 Function ST + 二分区间

来源:互联网 发布:dell网络驱动如何安装 编辑:程序博客网 时间:2024/05/19 18:14

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

代码:

#include <bits/stdc++.h>#define sf scanf#define pf printfusing namespace std;const int maxn = 100000 + 5;int MIN[maxn][32];int n;void INIT_RMQ(){    for(int j = 1;(1 << j) <= n;++j){        for(int i = 1;(i + (1 << j) - 1)<= n;++i){            MIN[i][j] = min(MIN[i][j - 1],MIN[i + (1 << (j - 1))][j - 1]);        }    }}int RMQ(int l,int r){    int LEN = r - l + 1;    int k = 0;    while ((1 << (k + 1)) <= LEN) k++;    return min(MIN[l][k], MIN[r - (1 << k) + 1][k]);}int main(){    int T,q,l,r,value;sf("%d",&T);    while( T-- ){        sf("%d",&n);        for(int i = 1;i <= n;++i) sf("%d",&MIN[i][0]);        INIT_RMQ();        sf("%d",&q);        while(q--){            sf("%d %d",&l,&r);            value = MIN[l++][0];            while(l <= r){                int L = l,R = r;                while(L < R){                    if(RMQ(L,L + R >> 1) <= value){                        R = L + R >> 1;                    }                    else if(RMQ((L + R >> 1) + 1,R) <= value){                        L = (L + R >> 1) + 1;                    }                    else break;                }                if(MIN[L][0] > value) break;                else value %= MIN[L][0];                if(value == 0) break;                l = L + 1;            }            pf("%d\n",value);        }    }}
0 0
原创粉丝点击