标签:i++ submit ble 带来 rip zoj 好运 bzoj 取出
对于20%的数据,N ≤ 100,M ≤ 1000;
对于40%的数据,N ≤ 3000,M ≤ 200000;
对于100%的数据,N ≤ 50000,M ≤ 200000。
#include<cstdio> #include<cstring> #include<algorithm> #include<cmath> using namespace std; #define N 1000010 struct data { int l,r,block,id; }q[N]; int n,m,tot; int a[N],ans[N],num[N]; bool cp(data x,data y) { if(x.block!=y.block) return x.block<y.block; return x.r<y.r; } void add(int pos) { if(num[a[pos]]==0) tot++; num[a[pos]]++; } void deltete(int pos) { num[a[pos]]--; if(!num[a[pos]]) tot--; } void solve() { sort(q+1,q+m+1,cp); int l=1,r=1; tot=1; num[a[1]]=1; for(int i=1;i<=m;i++) { while(l<q[i].l) { deltete(l); l++; } while(l>q[i].l) { l--; add(l); } while(r<q[i].r) { r++; add(r); } while(r>q[i].r) { deltete(r); r--; } ans[q[i].id]=tot; } for(int i=1;i<=m;i++) { printf("%d\n",ans[i]); } } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); scanf("%d",&m); int block=(int)(sqrt(n)); for(int i=1;i<=m;i++) { scanf("%d%d",&q[i].l,&q[i].r); q[i].block=(q[i].l-1)/block; q[i].id=i; } solve(); return 0; }
标签:i++ submit ble 带来 rip zoj 好运 bzoj 取出
原文地址:http://www.cnblogs.com/19992147orz/p/6286350.html