题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4552

二分答案,把 >= mid 的设成1、< mid 的设成0,之后排序就变成区间赋值了。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #define ls Ls[cr]
  5. #define rs Rs[cr]
  6. using namespace std;
  7. const int N=1e5+,M=N<<;
  8. int n,m,a[N],ps; bool b[N];
  9. int tot,Ls[M],Rs[M],sm[M],len[M],tg[M];
  10. struct Node{bool op;int l,r;}q[N];
  11. int rdn()
  12. {
  13. int ret=;bool fx=;char ch=getchar();
  14. while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
  15. while(ch>=''&&ch<='')ret=ret*+ch-'',ch=getchar();
  16. return fx?ret:-ret;
  17. }
  18. void init(int l,int r,int cr)
  19. {
  20. len[cr]=r-l+;
  21. if(l==r)return; int mid=l+r>>;
  22. ls=++tot;init(l,mid,ls);
  23. rs=++tot;init(mid+,r,rs);
  24. }
  25. void build(int l,int r,int cr)
  26. {
  27. tg[cr]=-;//
  28. if(l==r){sm[cr]=b[l];return;}
  29. int mid=l+r>>;
  30. build(l,mid,ls); build(mid+,r,rs);
  31. sm[cr]=sm[ls]+sm[rs];
  32. }
  33. void pshd(int cr)
  34. {
  35. if(tg[cr]<)return;tg[ls]=tg[rs]=tg[cr];
  36. sm[ls]=(tg[cr]?len[ls]:);sm[rs]=(tg[cr]?len[rs]:);
  37. tg[cr]=-;
  38. }
  39. void mdfy(int l,int r,int cr,int L,int R,bool k)
  40. {
  41. if(L>R)return;////
  42. if(l>=L&&r<=R){tg[cr]=k;sm[cr]=(k?len[cr]:);return;}
  43. int mid=l+r>>;pshd(cr);
  44. if(L<=mid)mdfy(l,mid,ls,L,R,k);
  45. if(mid<R)mdfy(mid+,r,rs,L,R,k);
  46. sm[cr]=sm[ls]+sm[rs];
  47. }
  48. int query(int l,int r,int cr,int L,int R)
  49. {
  50. if(l>=L&&r<=R)return sm[cr];
  51. int mid=l+r>>; pshd(cr);
  52. if(L>mid)return query(mid+,r,rs,L,R);
  53. if(R<=mid)return query(l,mid,ls,L,R);
  54. return query(l,mid,ls,L,R)+query(mid+,r,rs,L,R);
  55. }
  56. bool chk(int mid)
  57. {
  58. for(int i=;i<=n;i++)b[i]=(a[i]>=mid);
  59. build(,n,);
  60. for(int i=;i<=m;i++)
  61. {
  62. int d=query(,n,,q[i].l,q[i].r);
  63. if(q[i].op)
  64. {
  65. mdfy(,n,,q[i].l,q[i].l+d-,);
  66. mdfy(,n,,q[i].l+d,q[i].r,);
  67. }
  68. else
  69. {
  70. mdfy(,n,,q[i].r-d+,q[i].r,);
  71. mdfy(,n,,q[i].l,q[i].r-d,);
  72. }
  73. }
  74. return query(,n,,ps,ps);
  75. }
  76. int main()
  77. {
  78. n=rdn();m=rdn();tot=;init(,n,);
  79. for(int i=;i<=n;i++)a[i]=rdn();
  80. for(int i=;i<=m;i++)q[i].op=rdn(),q[i].l=rdn(),q[i].r=rdn();
  81. ps=rdn();
  82. int l=,r=n,ans;
  83. while(l<=r)
  84. {
  85. int mid=l+r>>;
  86. if(chk(mid))ans=mid,l=mid+;
  87. else r=mid-;
  88. }
  89. printf("%d\n",ans);
  90. return ;
  91. }

bzoj 4552 [Tjoi2016&Heoi2016]排序——二分答案的更多相关文章

  1. BZOJ 4552 [Tjoi2016&Heoi2016]排序 | 二分答案 线段树

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

  2. bzoj 4552 [Tjoi2016&Heoi2016]排序 (二分答案 线段树)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4552 题意: 给你一个1-n的全排列,m次操作,操作由两种:1.将[l,r]升序排序,2 ...

  3. bzoj 4552: [Tjoi2016&Heoi2016]排序——二分+线段树

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

  4. BZOJ 4552: [Tjoi2016&Heoi2016]排序

    4552: [Tjoi2016&Heoi2016]排序 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 579  Solved: 322[Sub ...

  5. BZOJ 4552 [Tjoi2016&Heoi2016]排序 ——线段树 二分答案

    听说是BC原题. 好题,二分答案变成01序列,就可以方便的用线段树维护了. 然后就是区间查询和覆盖了. #include <map> #include <cmath> #inc ...

  6. BZOJ 4552: [Tjoi2016&Heoi2016]排序 线段树 二分

    目录 此代码是个假代码,只能糊弄luogu,以后再改,路过大佬也可以帮一下辣 update 10.6 此代码是个假代码,只能糊弄luogu,以后再改,路过大佬也可以帮一下辣 /* //fang zhi ...

  7. [BZOJ4552][TJOI2016&&HEOI2016]排序(二分答案+线段树/线段树分裂与合并)

    解法一:二分答案+线段树 首先我们知道,对于一个01序列排序,用线段树维护的话可以做到单次排序复杂度仅为log级别. 这道题只有一个询问,所以离线没有意义,而一个询问让我们很自然的想到二分答案.先二分 ...

  8. bzoj 4552: [Tjoi2016&Heoi2016]排序【二分+线段树】

    二分值mid,然后把>=mid的赋值为1,其他赋值为0,每次排序就是算出区间内01的个数,然后分别把0和1放到连续的一段内,这些都可以用线段树来维护 二分的判断条件是操作完之后q位置上是否为1 ...

  9. BZOJ 4552 [Tjoi2016&Heoi2016]排序 线段树的分裂和合并

    https://www.lydsy.com/JudgeOnline/problem.php?id=4552 https://blog.csdn.net/zawedx/article/details/5 ...

随机推荐

  1. [oracle原]访问局域网内出现“ORA-12541:TNS:无监听程序”

    近日在服务器局域网内27电脑上安装了oracle11g,本机上访问此数据库正常.但在局域网内其它机器上访问27上的数据库时,出现“ORA-12541:TNS:无监听程序”错误. 查27上的配置:D:\ ...

  2. 重新学习MySQL数据库2:『浅入浅出』MySQL 和 InnoDB

    重新学习Mysql数据库2:『浅入浅出』MySQL 和 InnoDB 作为一名开发人员,在日常的工作中会难以避免地接触到数据库,无论是基于文件的 sqlite 还是工程上使用非常广泛的 MySQL.P ...

  3. yum离线安装

    安装yum-plugin-downloadonly插件 yum install -y yum-plugin-downloadonly 下载对应的软件包,我们以mysql为例,终端输入如下命令 yum ...

  4. Personal Introduction

    专业:计算机科学与技术 我是博客园的新人,虽然接触编程世界只有一年,基础知识比较差,编程能力差,但对于这个专业,我还是充满兴趣,希望有一天能独当一面,从今天起,我将分享一些在学习web前端和其他方面的 ...

  5. LeetCode OJ:Word Pattern(单词模式)

    Given a pattern and a string str, find if str follows the same pattern. Here follow means a full mat ...

  6. gradle 删除指定目录中的文件和目录

    // 删除bakAPk下的所有非母包文件 task deleTask(type: Delete){ FileTree tree = fileTree(dir: bakPath) tree.each { ...

  7. CRect类 的介绍

    类CRect是对Windows结构RECT的封装,凡是能用RECT结构的地方都可以用CRect代替. 结构RECT表示一个矩形的位置和尺寸,其定义为: typedef struct tagRECT{ ...

  8. 一名十年Java程序员回忆阿里面试经历——揭开阿里面试的“遮羞布”

    阿里面试经历 去阿里面试可以说非常非常的偶然和戏剧性,因为本人根本没投简历,以至于阿里hr给我电话的时候我一度认为是诈骗电话.因为深圳这家公司不错我还想在这里干个两年左右再考虑考虑. 这个时候的本人已 ...

  9. 解决TensorFlow最新代码编译错误问题

    老是有个习惯,看到开源代码更新了,总是想更新到最新版,如果置之不理的话,就感觉自己懒惰了或有的不负责任了,这个也可能是一种形式的强迫症吧: 前几天晚上git pull TensorFlow,完事后也没 ...

  10. 【剑指offer】不使用除法,构建乘积数组,C++实现

    # 题目 # 思路 设C[i] = A[0] * A[1] * - * A[i-1],D[i] =  A[i+1] * - * A[n-1],则C[i]按照从上到下的顺序计算,即C[i] = C[i- ...