Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
为什么又wa了呢。。。。。。。( ⊙ o ⊙ )!#include<iostream> #include<algorithm> #include<cmath> using namespace std; int a[100006],sum[100006]; int index[100006]; int data[100006]; struct interval { int l,r,k; }in[50005]; inline bool operator<(const interval &a,const interval &b) { return a.l!=b.l?a.l<b.l:a.r<=b.r; } inline int lowbit(int t) { return t&(-t); } void update(int i,int s,int ind) { while(i<=ind) { sum[i]+=s; i+=lowbit(i); } return ; } int getsum(int i) { int ans=0; while(i>=1) { ans+=sum[i]; i-=lowbit(i); } return ans; } int find(int d,int ind) { int left=1,right=ind,mid; if(index[left]==d) return left; if(index[right]==d) return right; while(1) { mid=(left+right)>>1; if(index[mid]==d) break; if(index[mid]>d) right=mid; else left=mid; } return mid; } int process(int k,int ind) { int left=1,right=ind,mid; int p; p=getsum(left); if(a[left]&&p>=k&&p-a[left]<=k) return left; p=getsum(right); if(a[right]&&p>=k&&p-a[right]<=k) return right; while(1) { mid=(left+right)>>1; p=getsum(mid); if(a[mid]&&p>=k&&p-a[mid]<=k) break; if(p>=k) right=mid; else left=mid; } return mid; } int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { for(int i=1;i<=n;i++) scanf("%d",data+i); memcpy(index,data,sizeof(data)); memset(a,0,sizeof(a)); memset(sum,0,sizeof(sum)); sort(index+1,index+1+n); int ind=1; for(int i=1;i<n;i++) if(index[i]!=index[i+1]) index[ind++]=index[i]; index[ind]=index[n]; for(int i=1;i<=m;i++) scanf("%d%d%d",&in[i].l,&in[i].r,&in[i].k); sort(in+1,in+1+m); for(int i=in[1].l;i<=in[1].r;i++) { int p=find(data[i],ind); update(p,1,ind); a[p]++; } for(int i=1;i<=m;i++) { if(i!=1) { if(in[i].l==in[i-1].l) { for(int j=in[i-1].r+1;j<=in[i].r;j++) { int p=find(data[j],ind); update(p,1,ind); a[p]++; } } else if(in[i].l<in[i-1].r) { for(int j=in[i-1].l;j<in[i].l;j++) { int p=find(data[j],ind); update(p,-1,ind); a[p]--; } for(int j=in[i-1].r+1;j<=in[i].r;j++) { int p=find(data[j],ind); update(p,1,ind); a[p]++; } } else if(in[i].l==in[i-1].r) { for(int j=in[i-1].l;j<in[i-1].r;j++) { int p=find(data[j],ind); update(p,-1,ind); a[p]--; } for(int j=in[i-1].r+1;j<=in[i].r;j++) { int p=find(data[j],ind); update(p,1,ind); a[p]++; } } else { for(int j=in[i-1].l;j<in[i-1].r+1;j++) { int p=find(data[j],ind); update(p,-1,ind); a[p]--; } for(int j=in[i].l;j<=in[i].r;j++) { int p=find(data[j],ind); update(p,1,ind); a[p]++; } } } printf("%d\n",index[process(in[i].k,ind)]); } } } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator