8 5 2 1 3 4 5 2 3 1 1 3 1 1 2 2 4 8 1 5 3 2 1 1 1 1 1 1 2
YES NO YES YES YES YES NO
#include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<string> #include<iostream> #include<queue> #include<cmath> #include<map> #include<stack> #include<bitset> using namespace std; #define REPF( i , a , b ) for ( int i = a ; i <= b ; ++ i ) #define REP( i , n ) for ( int i = 0 ; i < n ; ++ i ) #define CLEAR( a , x ) memset ( a , x , sizeof a ) typedef long long LL; typedef pair<int,int>pil; const int MOD = 10000007; const int INF=0x3f3f3f3f; const int maxn=1000000+10; int mp[maxn]; int ans[maxn],pre[maxn]; LL s[maxn]; int num[maxn],sum[maxn<<2]; int n,m; void pushup(int rs) { sum[rs]=max(sum[rs<<1],sum[rs<<1|1]); } void build(int rs,int l,int r) { sum[rs]=0; if(l==r) return ; int mid=(l+r)>>1; build(rs<<1,l,mid); build(rs<<1|1,mid+1,r); } void update(int x,int c,int l,int r,int rs) { if(l==r) { sum[rs]=c; return ; } int mid=(l+r)>>1; if(x<=mid) update(x,c,l,mid,rs<<1); else update(x,c,mid+1,r,rs<<1|1); pushup(rs); } int query(int x,int y,int l,int r,int rs) { if(l>=x&&r<=y) return sum[rs]; int mid=(l+r)>>1; int res=0; if(x<=mid) res=max(res,query(x,y,l,mid,rs<<1)); if(y>mid) res=max(res,query(x,y,mid+1,r,rs<<1|1)); pushup(rs); return res; } int main() { int x,y; while(~scanf("%d%d",&n,&m)) { s[0]=0; CLEAR(mp,0); CLEAR(ans,0); REPF(i,1,n) { scanf("%d",&num[i]); s[i]=s[i-1]+num[i]; if(!mp[num[i]]) { pre[i]=0; mp[num[i]]=i; } else { pre[i]=mp[num[i]]; mp[num[i]]=i; } update(i,pre[i],1,n,1); } while(m--)//离线做法超时了 { scanf("%d%d",&x,&y); LL temp=(1+y-x+1)*(y-x+1)/2; if(s[y]-s[x-1]==temp&&query(x,y,1,n,1)<x) puts("YES"); else puts("NO"); } } return 0; }
HDU 5172 GTY's gay friends(线段树)
原文:http://blog.csdn.net/u013582254/article/details/43638807