HDU 5172 GTY's gay friends(线段树)

来源:互联网 发布:微信群怎么推广淘宝客 编辑:程序博客网 时间:2024/04/20 07:48

题意:给你n个数,有m次询问,每次询问[l,r]的区间内是否为1到r-l+1的全排列。

对于1到r-l+1的全排列,和可以通过一个数组记录前缀和。接下来就是去重,我们可以用线段树储存每个数上一个相同的数的位置,线段树的每个点即为区间内上一个数位置的最大值,若求得的值小于l,即满足条件,输出YES。

#include<stdio.h>#include<queue>#include<cstring>#include<iostream>#include<cmath>#include<algorithm>#include<assert.h>#include<stdlib.h>#include<time.h>#include<stack>#include<vector>#include<map>#include<set>#include<fstream>#define pi acos(-1.0)#define INF 0x3f3f3f3f#define debug printf("---------------\n");using namespace std;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1const int NV = 1000005;int sum[NV<<2];void PushUp(int rt){    sum[rt]=max(sum[rt<<1],sum[rt<<1|1]);}void build(int l,int r,int rt=1){    if (l == r)    {        sum[rt]=0;        return ;    }    int m = (l + r) >> 1;    build(lson);    build(rson);    PushUp(rt);}void update(int L,int c,int l,int r,int rt=1){    if (L == l && l == r)    {        sum[rt] += c;        return ;    }    int m = (l + r) >> 1;    if (L <= m) update(L , c , lson);    else update(L , c , rson);    PushUp(rt);}int query(int L,int R,int l,int r,int rt=1){    if (L <= l && r <= R)        return sum[rt];    int m = (l + r) >> 1;    int ret = 0;    if (L <= m) ret =max(ret, query(L , R , lson));    if (m < R) ret =max(ret, query(L , R , rson));    return ret;}int last[NV];long long suma[NV];int main(){    //freopen("input.txt", "r", stdin);    //freopen("output.txt", "w", stdout);    int n,m,a,b;    while(scanf("%d%d",&n,&m)!=EOF)    {        memset(suma,0,sizeof(suma));        memset(last,0,sizeof(last));        build(1,n);        for(int i=1;i<=n;i++)        {            scanf("%d",&a);            suma[i]=suma[i-1]+(long long)a;            if(last[a])            {                update(i,last[a],1,n);            }            last[a]=i;        }        for(int i=1;i<=m;i++)        {            scanf("%d%d",&a,&b);            long long len=b-a+1;            //printf("a=%d b=%d query=%d suma[b,a]=%d %d\n",a,b,query(a,b,1,n),suma[b],suma[a-1]);            if(((suma[b]-suma[a-1])==(1+len)*len/2)&&(query(a,b,1,n)<a))            {                printf("YES\n");            }            else            {                printf("NO\n");            }        }    }    return 0;}
0 0
原创粉丝点击