听说是BC原题。

好题,二分答案变成01序列,就可以方便的用线段树维护了。

然后就是区间查询和覆盖了。

#include <map>
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define ll long long
#define mp make_pair
#define maxn 200005int cnt[maxn<<2][2],data[maxn],n,m,a[maxn];
int opt[maxn],x[maxn],y[maxn],tag[maxn<<2],q;void update(int o)
{F(i,0,1) cnt[o][i]=cnt[o<<1][i]+cnt[o<<1|1][i];
}void build(int o,int l,int r)
{if (l==r){cnt[o][data[l]]=1;cnt[o][1-data[l]]=0;tag[o]=-1;return ;}tag[o]=-1; int mid=l+r>>1;build(o<<1,l,mid); build(o<<1|1,mid+1,r);update(o);
}void pushdown(int o,int l,int r)
{if (tag[o]!=-1){int mid=l+r>>1;tag[o<<1]=tag[o<<1|1]=tag[o];cnt[o<<1][tag[o]]=mid-l+1;cnt[o<<1|1][tag[o]]=r-mid;cnt[o<<1][1-tag[o]]=0;cnt[o<<1|1][1-tag[o]]=0;tag[o]=-1;}
}int query(int o,int l,int r,int L,int R)
{if (L<=l&&r<=R) return cnt[o][1];int mid=l+r>>1; pushdown(o,l,r);if (R<=mid) return query(o<<1,l,mid,L,R);else if (L>mid) return query(o<<1|1,mid+1,r,L,R);else return query(o<<1,l,mid,L,R)+query(o<<1|1,mid+1,r,L,R);
}void modify(int o,int l,int r,int L,int R,int f)
{if (L>R) return ;if (L<=l&&r<=R){tag[o]=f;cnt[o][f]=r-l+1;cnt[o][1-f]=0;return;}int mid=l+r>>1; pushdown(o,l,r);if (L<=mid) modify(o<<1,l,mid,L,R,f);if (R>mid)  modify(o<<1|1,mid+1,r,L,R,f);update(o);
}void st_sort(int typ,int l,int r)
{int cnt1=query(1,1,n,l,r),cnt0=r-l+1-cnt1;if (typ==0){modify(1,1,n,l,l+cnt0-1,0);modify(1,1,n,l+cnt0,r,1);}else{modify(1,1,n,l,l+cnt1-1,1);modify(1,1,n,l+cnt1,r,0); }
}bool check(int mid)
{F(i,1,n) data[i]=(a[i]>=mid); build(1,1,n);F(i,1,m){st_sort(opt[i],x[i],y[i]);}if (query(1,1,n,q,q)) return true;else return false;
}int main()
{scanf("%d%d",&n,&m);F(i,1,n) scanf("%d",&a[i]);F(i,1,m) scanf("%d%d%d",&opt[i],&x[i],&y[i]);int l=1,r=n;scanf("%d",&q);while(l<r){int mid=(l+r)/2+1;if (check(mid)) l=mid;else r=mid-1;}printf("%d\n",l);
}

  

转载于:https://www.cnblogs.com/SfailSth/p/6737767.html

BZOJ 4552 [Tjoi2016Heoi2016]排序 ——线段树 二分答案相关推荐

  1. bzoj 4743: [Usaco2016 Dec]Robotic Cow Herd 线段树+二分答案

    题意 有n个数集,每个数集里最多只有10个元素,现在从每个数集里面选数一个数,假设选出的数的和是p,给出k,问前k小的p的和. n,k<=100000 分析 首先二分答案lim,然后考虑如何找到 ...

  2. [BZOJ] 4552: [Tjoi2016Heoi2016]排序

    通过各种手段把序列问题变成01序列问题可以简化问题 这里可以用二分答案,把大于等于的变成1,小于的变成0 然后区间排序就是线段树区间赋值操作啦 复杂度\(O(nlog^2n)\) #include&l ...

  3. bzoj 4552: [Tjoi2016Heoi2016]排序

    Description 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这个 ...

  4. 线段树 + 二分答案:Haybale Guessing G

    参考文献:题解 P2898 [[USACO08JAN]haybale猜测Haybale Guessing] - レムの小屋 - 洛谷博客 题目链接:[USACO08JAN]Haybale Guessi ...

  5. codeforces 609F Frogs and mosquitoes 线段树+二分+multiset

    http://codeforces.com/problemset/problem/609/F There are n frogs sitting on the coordinate axis Ox. ...

  6. 牛客小白月赛28 E-会当凌绝顶,一览众山小 线段树+二分暴力模拟

    牛客小白月赛28 E-会当凌绝顶,一览众山小 线段树+二分暴力模拟 题意 思路 Code 传送门: https://ac.nowcoder.com/acm/contest/16081/E 题意 登山顺 ...

  7. BZOJ.4552.[HEOI2016/TJOI2016]排序(线段树合并/二分 线段树)

    题目链接 对于序列上每一段连续区间的数我们都可以动态开点建一棵值域线段树.初始时就是\(n\)棵. 对于每次操作,我们可以将\([l,r]\)的数分别从之前它所属的若干段区间中分离出来,合并. 对于升 ...

  8. 【题解】 [HEOI2016]排序题解 (二分答案,线段树)

    题目描述 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这个全排列序列进行 ...

  9. P2824-[HEOI2016/TJOI2016]排序【线段树,二分】

    正题 题目链接:https://www.luogu.com.cn/problem/P2824 题目大意 nnn个数,每次将一个区间正序或者倒序排序,求最后位置ppp的数. 解题思路 思路确实巧妙 二分 ...

  10. 线段树分裂与合并 ----- P2824 [HEOI2016/TJOI2016]排序 [线段树分裂合并 OR 01序列排序+二分线段树]

    题目链接 题目大意: 对一个序列,每次按照升序或者降序排序序列某一段,问你最后的序列是什么? 解法1:二分+线段树 首先我们知道对一个01序列进行排序是很快的!我们只要知道里面有多少个1和多少个0,那 ...

最新文章

  1. CVPR 2021|三维视觉相关论文汇总
  2. 【API】网络编程模型、多线程
  3. Fedora 24的用户,千万不要在桌面里运行 `dnf update`
  4. sqlite 可视化_知乎人均985?Python爬50W数据,BI做出可视化后,我有了答案
  5. javaweb基础----使用ajax校验用户名是否重复
  6. Java 私塾面试系列
  7. 关于黑马JavaWeb教程注册登录案例报错
  8. cnpack代码输入助手失效的解决办法
  9. NASA 用哈勃望远镜定格你的星空
  10. python程序员工资待遇-为什么企业很难招聘到好的python程序员?
  11. Java个人网站设计与实现毕业
  12. 计算机内存清理原理,怎样清理计算机内存
  13. 计算机硬件环境指啥,硬件环境指的是什么呢?
  14. 经管文本分析 | 基于年报文本构建管理层讨论与分析披露的信息含量
  15. 内耗自救指南|5招停止内耗让你逆风翻盘
  16. 2.4.2 死锁的处理策略-预防死锁(破坏互斥条件、破坏不可剥夺条件、破坏请求和保持条件、破坏循环等待条件)
  17. 人体热释电红外传感器 PIR 原理详解
  18. 基于Windows8与Visual Studio11开发第一个内核驱动程序
  19. 微软2017校招笔试题2 composition
  20. 配置squid 代理

热门文章

  1. IOS第11天(4:UIDatePicker时间选择,和键盘处理,加载xib文件,代理模式)
  2. Hierarchical clustering
  3. 使用OpenCV需要注意的小细节
  4. 相称显微镜下细胞群体跟踪
  5. DJ Mix Pads 2 - Remix Version Mac - DJ混音音乐制作板
  6. 使用iMazing将图书应用程序的ePub文件导出至电脑
  7. 企业数据安全防护不可忽视,数据丢失/损坏如何处理?
  8. Puppet 实验十三 Foreman 基础使用
  9. WebLogic简单的备份和恢复
  10. Linux管理员常用网络资源(收集帖)