bzoj4552 [ TJOI2016 && HEOI2016 ] -- 二分+线段树
来源:互联网 发布:hex editor怎么修改mac 编辑:程序博客网 时间:2024/06/09 13:43
二分答案。将大于等于答案的值设为1,小于的设为0,然后每次操作就变成了区间覆盖。线段树即可。
代码
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;#define N 100010struct Q{ int l,r; bool d;}q[N];int a[N],l,r,Mid;int i,j,k,n,m,c[N<<2],p[N<<2];inline void Update_set(int x,int L,int y){ p[x]=y;c[x]=L*y;}inline void Down(int x,int L){ if(p[x]!=-1){ Update_set(x<<1,L+1>>1,p[x]); Update_set(x<<1|1,L>>1,p[x]); p[x]=-1; }}inline void Build(int x,int l,int r,int y){ p[x]=-1; if(l==r){ c[x]=(a[l]>=y); return; } int Mid=l+r>>1; Build(x<<1,l,Mid,y);Build(x<<1|1,Mid+1,r,y); c[x]=c[x<<1]+c[x<<1|1];}inline void Update(int x,int l,int r,int L,int R,int y){ if(l>R||r<L)return; Down(x,r-l+1); if(l>=L&&r<=R){ c[x]=(r-l+1)*y;p[x]=y; return; } int Mid=l+r>>1; Update(x<<1,l,Mid,L,R,y);Update(x<<1|1,Mid+1,r,L,R,y); c[x]=c[x<<1]+c[x<<1|1];}inline int Query(int x,int l,int r,int L,int R){ if(l>R||r<L)return 0; Down(x,r-l+1); if(l>=L&&r<=R)return c[x]; int Mid=l+r>>1; return Query(x<<1,l,Mid,L,R)+Query(x<<1|1,Mid+1,r,L,R);}inline bool Check(int x){ Build(1,1,n,x); for(i=1;i<=m;i++){ int y=Query(1,1,n,q[i].l,q[i].r); if(q[i].d)Update(1,1,n,q[i].l,q[i].l+y-1,1),Update(1,1,n,q[i].l+y,q[i].r,0); else Update(1,1,n,q[i].r-y+1,q[i].r,1),Update(1,1,n,q[i].l,q[i].r-y,0); } return !Query(1,1,n,k,k);}int main(){ scanf("%d%d",&n,&m); for(i=1;i<=n;i++)scanf("%d",&a[i]); for(i=1;i<=m;i++)scanf("%d%d%d",&q[i].d,&q[i].l,&q[i].r); scanf("%d",&k); l=1;r=n; while(l<=r){ Mid=l+r>>1; if(Check(Mid))r=Mid-1;else l=Mid+1; } cout<<r<<endl; return 0;}
阅读全文
0 0
- bzoj4552 [ TJOI2016 && HEOI2016 ] -- 二分+线段树
- [BZOJ4552][Tjoi2016&Heoi2016][线段树][二分]排序
- [bzoj4552][Tjoi2016&Heoi2016]排序 二分+线段树
- [bzoj4552][Tjoi2016&Heoi2016]排序-二分+线段树
- 【bzoj4552】【Tjoi2016】【Heoi2016】【排序】【二分答案】【线段树】
- [BZOJ4552][Tjoi2016&Heoi2016]排序 二分答案+线段树
- 【二分+线段树】BZOJ4552(Tjoi2016&Heoi2016)[排序]题解
- 【bzoj4552】【Tjoi2016&Heoi2016】【排序】【线段树】
- BZOJ4552: [Tjoi2016&Heoi2016]排序 线段树
- [BZOJ4552][TJOI2016&HEOI2016]排序-线段树合并
- [ 线段树套treap ] [ TJOI2016&&HEOI2016 ] BZOJ4552
- TJOI2016&HEOI2016 排序 线段树+二分答案
- BZOJ4552 [Tjoi2016&Heoi2016]排序
- bzoj4552【TJOI2016&HEOI2016】排序
- 【bzoj4552】 [Tjoi2016&Heoi2016]排序
- [bzoj4552][Tjoi2016&Heoi2016]排序
- bzoj4552: [Tjoi2016&Heoi2016]排序
- bzoj 4552: [Tjoi2016&Heoi2016]排序 二分答案+线段树
- 二叉树的先序、中序、后序和中序遍历——Java实现
- 数据结构第三周项目二
- uboot-Makefile分析
- Python 继承
- Eclipse+CDT编写C程序,eclipse新建项目添加到编译选项及其配置
- bzoj4552 [ TJOI2016 && HEOI2016 ] -- 二分+线段树
- 线程池之饱和策略
- jQuery
- Spring之自动装配
- Exceptionin thread "main" java.lang.UnsatisfiedLinkError问题
- 算法基础——插入排序
- Servlet
- touch事件的简单封装
- mybatis配置文件