【BZOJ】4552 排序
来源:互联网 发布:好用的日记本软件 编辑:程序博客网 时间:2024/06/06 00:10
讲道理省选场上出现这种bc#76 原题的行为真的不厚道。。。。一是因为规模这么大一比赛很少有人不知道,二是人家题解就摆在网上的。。。丫样例都不改
难不成把多组数据改成一组数据也叫改编?(23333
主要思路就是二分猜答案之后,将原序列改成01序列(小于等于mid的变成0,否则变成1)用线段树维护排序操作。
题解传送门
/************************************************************** Problem: 4552 User: RicardoWang Language: C++ Result: Accepted Time:12976 ms Memory:11428 kb****************************************************************/ #include<cstdlib>#include<cstdio>#include<iostream>#include<cstring>#include<cmath>#include<algorithm>#include<queue>#include<vector>#define maxn 200005using namespace std; int A[maxn],v[maxn];struct data{ int op,x,y;}B[maxn];int n,M,q; void Init(){ scanf("%d%d",&n,&M); for(int i=1;i<=n;i++)scanf("%d",&A[i]); for(int i=1;i<=M;i++)scanf("%d%d%d",&B[i].op,&B[i].x,&B[i].y); scanf("%d",&q); return ;}int np,rt;int cnt[2*maxn],chi[2*maxn][2],down[2*maxn];void build(int &now,int L,int R){ now=++np;cnt[now]=down[now]=0; chi[now][0]=chi[now][1]=0; if(L==R) { cnt[now]=v[L]; return ; } int mid =(L+R)>>1; build(chi[now][0],L,mid); build(chi[now][1],mid+1,R); cnt[now]=cnt[chi[now][0]]+cnt[chi[now][1]]; return ;}void pushdown(int now,int L,int R){ int mid=(L+R)>>1; if(down[now]) { down[chi[now][0]]=down[chi[now][1]]=down[now]; cnt[chi[now][0]]=(mid-L+1)*(down[now]-1); cnt[chi[now][1]]=(R-mid)*(down[now]-1); } down[now]=0; return ;}void update(int now,int L,int R,int x,int y,int v){ if(x<=L && R<=y) { down[now]=v+1; cnt[now]=v*(R-L+1); return ; } pushdown(now,L,R); int mid=(L+R)>>1; if(x<=mid)update(chi[now][0],L,mid,x,y,v); if(y>mid)update(chi[now][1],mid+1,R,x,y,v); cnt[now]=cnt[chi[now][0]]+cnt[chi[now][1]]; return;}int query(int now,int L,int R,int x,int y){ if(x<=L && R<=y) { return cnt[now]; } pushdown(now,L,R); int mid=(L+R)>>1; int t1=0,t2=0; if(x<=mid)t1=query(chi[now][0],L,mid,x,y); if(y>mid)t2=query(chi[now][1],mid+1,R,x,y);cnt[now]=cnt[chi[now][0]]+cnt[chi[now][1]]; return t1+t2; }bool check(int x){ for(int i=1;i<=n;i++) { v[i]=A[i]<=x? 0:1; } np=0;int ct; build(rt,1,n); for(int i=1;i<=M;i++) { ct=query(rt,1,n,B[i].x,B[i].y); if(B[i].op==0) { ct=B[i].y-B[i].x+1-ct; if(ct>0)update(rt,1,n,B[i].x,B[i].x+ct-1,0); if(ct<=B[i].y-B[i].x)update(rt,1,n,B[i].x+ct,B[i].y,1); } else { if(ct>0)update(rt,1,n,B[i].x,B[i].x+ct-1,1); if(ct<=B[i].y-B[i].x)update(rt,1,n,B[i].x+ct,B[i].y,0); } // for(int j=1;j<=n;j++)printf("%d ",query(rt,1,n,j,j)); // putchar('\n'); } return query(rt,1,n,q,q)==0;}void work(){ int l=1,r=n,mid,ans; while(l<=r) { mid=(l+r)>>1; if(check(mid)) { r=mid-1; ans=mid; } else { l=mid+1; } } printf("%d\n",ans); return ;}int main(){// freopen("in.txt","r",stdin); int T=1; while(T--) { Init(); work(); } return 0;}
0 0
- 【BZOJ】4552 排序
- BZOJ 4552 排序 Heoi2016
- BZOJ 4552: [Tjoi2016&Heoi2016]排序
- 【JZOJ 4605】【BZOJ 4552】排序
- BZOJ 4552 [Tjoi2016&Heoi2016]排序
- BZOJ 4552: [Tjoi2016&Heoi2016]排序
- BZOJ 4552 [Tjoi2016&Heoi2016]排序
- bzoj 4552: [Tjoi2016&Heoi2016]排序
- BZOJ 4552 [Tjoi2016&Heoi2016]排序
- [BZOJ]4552 [TJOI2016] 排序 二分 + 线段树
- bzoj 3580: 冒泡排序
- 【BZOJ 3990】 [SDOI2015]排序
- BZOJ 3990: [SDOI2015]排序
- 【BZOJ 3990】 [SDOI2015]排序
- BZOJ 3990 [SDOI2015] 排序
- 【TJOI & HEOI 2016】【JZOJ 4605】 【BZOJ 4552】排序
- bzoj 4552: [Tjoi2016&Heoi2016]排序 二分答案+线段树
- BZOJ 4552 排序(二分 || 线段树合并)
- folly->set_sorted_vector
- netty in action fifth chapter Summary
- Ubuntu 搭建PHP环境
- Android开发:相册读取、拍照、图片裁剪和图片上传服务器等功能的实现
- 大话设计模式java版--简单工厂模式
- 【BZOJ】4552 排序
- Mapreduce Patterns, Algorithms, and use cases
- [Modern OpenGL系列(一)]十步搞定OpenGL开发环境
- 系统调用与库函数
- Ubuntu12.04编译openwrt过程中遇到的一些问题及处理方法
- pwnable.kr之bof
- sprlie3创建表
- Java技术要求大杂烩
- spline3 插入