标签:rip mod contest others col char for input key
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6621
Time Limit: 20000/15000 MS (Java/Others) Memory Limit: 524288/524288 K (Java/Others)
Total Submission(s): 2426 Accepted Submission(s): 871
#include<iostream> #include<vector> #include<cstdio> #include<algorithm> #include<math.h> using namespace std; typedef long long LL; const int maxn=1e5+5; int N,M; int sz,cnt=0,sum=0; int root[maxn],a[maxn],v[maxn]; int L,R,P,K,X=0; struct Node { int l,r,sum; Node() { l=r=sum=0; } }T[maxn<<6]; void Init() { cnt=0;root[0]=0;T[cnt].l=T[cnt].r=T[cnt].sum=0;X=0; } void Read(int &n)//只能读入整数 { n=0; int f=1;//用于记录正负 char ch=getchar(); while(ch<‘0‘||ch>‘9‘)// { if(ch==‘-‘) f=-1; ch=getchar(); } while(ch>=‘0‘&&ch<=‘9‘)//下面两种用法都可以 { //n=(n<<1)+(n<<3)+(ch-‘0‘);// n=(n<<1)+(n<<3)+(ch^48);//相当于 x*10+ch-‘0‘; ch=getchar(); } n=n*f;//切记乘以f (记录的是+ -) return ; } void Update(int l,int r,int &x,int y,int pos) { T[++cnt]=T[y];T[cnt].sum++;x=cnt; if(l==r) return ; int mid=(l+r)>>1; if(pos<=mid) Update(l,mid,T[x].l,T[y].l,pos); else Update(mid+1,r,T[x].r,T[y].r,pos); } int getid(int x) { return lower_bound(v+1,v+1+sz,x)-(v); } void Query(int l,int r,int x,int y,int h) { // cout<<"l:"<<l<<" r:"<<r<<" sum:"<<sum<<endl; if(l==r) { if(h>=v[l]) sum+=T[x].sum-T[y].sum; return ; } int mid=(l+r)>>1; if(h<=v[mid]) Query(l,mid,T[x].l,T[y].l,h); else { sum+=T[T[x].l].sum-T[T[y].l].sum; Query(mid+1,r,T[x].r,T[y].r,h); } } bool judge(int x) { sum=0;Query(1,sz,root[R],root[L-1],P+x); int sum1=sum; sum=0;Query(1,sz,root[R],root[L-1],P-x-1); int sum2=sum; return sum1-sum2>=K; } int main() { int T; // scanf("%d",&T); Read(T); int ca=1; while(T--) { Init(); // scanf("%d%d",&N,&M); Read(N);Read(M); for(int i=1;i<=N;i++) { scanf("%d",&a[i]);v[i]=a[i]; } sort(v+1,v+1+N);sz=unique(v+1,v+1+N)-(v+1); // for(int i=1;i<=sz;i++) cout<<v[i]<<" ";cout<<endl; // for(int i=1;i<=N;i++) cout<<getid(a[i])<<" ";cout<<endl; for(int i=1;i<=N;i++) Update(1,sz,root[i],root[i-1],getid(a[i])); while(M--) { sum=0; // scanf("%d%d%d%d",&L,&R,&P,&K); Read(L);Read(R);Read(P);Read(K); L^=X;R^=X;P^=X;K^=X; int l=0,r=1e6,ans; while(l<=r)//二分答案 { int mid=(l+r)>>1; if(judge(mid)) { ans=mid;r=mid-1; } else l=mid+1; } printf("%d\n",ans); X=ans; } } return 0; }
标签:rip mod contest others col char for input key
原文地址:https://www.cnblogs.com/caijiaming/p/11289099.html