bzoj 4604: The kth maximum number
2017-12-09 10:41
169 查看
题意:
待修改矩阵k大值。题解:
整体二分套cdq。讲道理挺暴力的,但跑的飞快。
就是整体二分中用cdq做三维偏序判断。
code:
#include<cstdio> #include<cstring> #include<iostream> #include<cstdlib> using namespace std; struct node{ int op,x,y,c; }Q[200010],q[200010],q1[200010],q2[200010],tmp[200010];int cnt=0,qcnt=0; const int inf=1e9; int n,m,K[50010],ans[50010],num[50010],tr[500010],re[200010],tim=0,C[50010]; void change(int k,int c) {for(int i=k;i<=n;i+=(i&-i)) tr[i]+=c;} int get(int k) {int ans=0;for(int i=k;i>=1;i-=(i&-i)) ans+=tr[i];return ans;} int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } void cdq(int l,int r,int Mid) { if(l==r) return; int mid=(l+r)/2; cdq(l,mid,Mid);cdq(mid+1,r,Mid); int i=l,j=mid+1,len=0,st=0; while(i<=mid&&j<=r) { if(Q[i].x<=Q[j].x) { if(Q[i].op==1&&Q[i].c>Mid) change(Q[i].y,1),re[++st]=Q[i].y; tmp[++len]=Q[i++]; } else { if(Q[j].op==2) num[Q[j].c]+=get(Q[j].y); if(Q[j].op==3) num[Q[j].c]-=get(Q[j].y); tmp[++len]=Q[j++]; } } while(i<=mid) tmp[++len]=Q[i++]; while(j<=r) { if(Q[j].op==2) num[Q[j].c]+=get(Q[j].y); if(Q[j].op==3) num[Q[j].c]-=get(Q[j].y); tmp[++len]=Q[j++]; } for(i=1;i<=st;i++) change(re[i],-1); for(i=1;i<=len;i++) Q[l+i-1]=tmp[i]; } void solve(int l,int r,int L,int R) { if(l>r) return; if(L==R) { for(int i=l;i<=r;i++) {if(q[i].op!=1) num[q[i].c]=0;Q[i]=q[i];} cdq(l,r,L-1); for(int i=l;i<=r;i++) if(q[i].op!=1) if(K[q[i].c]==num[q[i].c]) ans[q[i].c]=L; else ans[q[i].c]=-1; return; } int mid=(L+R)/2,l1=0,l2=0; for(int i=l;i<=r;i++) {if(q[i].op!=1) num[q[i].c]=0;Q[i]=q[i];} cdq(l,r,mid); for(int i=l;i<=r;i++) { if(q[i].op==1) { if(q[i].c<=mid) q1[++l1]=q[i]; else q2[++l2]=q[i]; } else { if(num[q[i].c]<K[q[i].c]) q1[++l1]=q[i]; else q2[++l2]=q[i]; } } tim++; for(int i=l;i<=r;i++) if(q[i].op!=1&&num[q[i].c]<K[q[i].c]&&C[q[i].c]!=tim) K[q[i].c]-=num[q[i].c],C[q[i].c]=tim; for(int i=1;i<=l1;i++) q[l+i-1]=q1[i]; for(int i=1;i<=l2;i++) q[l+i+l1-1]=q2[i]; solve(l,l+l1-1,L,mid);solve(l+l1,r,mid+1,R); } int main() { n=read();m=read(); for(int i=1;i<=m;i++) { int op;op=read(); if(op==1) { int x,y,c;x=read();y=read();c=read(); q[++cnt].op=1;q[cnt].x=x;q[cnt].y=y;q[cnt].c=c; } else { int x,y,x1,y1;qcnt++;x=read();y=read();x1=read();y1=read();K[qcnt]=read(); q[++cnt].op=2;q[cnt].x=x1;q[cnt].y=y1;q[cnt].c=qcnt; q[++cnt].op=3;q[cnt].x=x-1;q[cnt].y=y1;q[cnt].c=qcnt; q[++cnt].op=3;q[cnt].x=x1;q[cnt].y=y-1;q[cnt].c=qcnt; q[++cnt].op=2;q[cnt].x=x-1;q[cnt].y=y-1;q[cnt].c=qcnt; } } solve(1,cnt,1,inf); for(int i=1;i<=qcnt;i++) { if(ans[i]==-1) printf("NAIVE!ORZzyz.\n"); else printf("%d\n",ans[i]); } }
相关文章推荐
- 【bzoj4604】The kth maximum number
- bzoj4604 The kth maximum number && bzoj4605 崂山白花蛇草水
- hdu 4006 The kth great number
- The kth great number(优先队列)
- BZOJ2456 Mode & zju2132 The Most Frequent Number(众数性质)
- 【HDU4006】The kth great number
- #736 – 通过代码获取硬件支持的最大触摸点数(Finding the Maximum Number of Touch Points at Run-time)
- HDU 4006 The kth great number
- POJ 2699 The Maximum Number of Strong Kings
- Leetcode--->Given n points on a 2D plane, find the maximum number of points that lie on the same str
- [省选前题目整理][POJ 2699]The Maximum Number of Strong Kings(暴力枚举+最大流)
- 数据结构与算法分析:第一章:Finding the kth largest number and The four basic rules of recursion
- More than the maximum number of request parameters
- HDU 4006 The kth great number(multiset(或者)优先队列)
- HDU 4006-The kth great number
- HDU - 4006 The kth great number (set&数据结构)
- HDOJ 4006 The kth great number
- HDU4006 The kth great number
- hdu 4006__The kth great number(STL)
- HDU 4006 The kth great number(STL)