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

题意:给出一个$1$到$N$的全排列,对其进行$M$次排序,每次排序将区间$[l,r]$从小到大或从大到小排序,求排序完后位置$q$上的数字。$N,M \leq 10^5$,时限$6s$


名字挂羊头卖狗肉……

暴力排序$O(NMlogN)$神级常数才能过,故考虑在排序上降低复杂度

考虑二分答案,将小于等于当前答案的设为$0$,大于当前答案的设为$1$,这样修改就变成$0,1$排序,可以使用线段树区间覆盖实现

时间复杂度$O(Mlog^2N)$

 #include<bits/stdc++.h>
 #define MAXN 100005
 using namespace std;
 inline int read(){
     ;
     char c = getchar();
     while(!isdigit(c))
         c = getchar();
     while(isdigit(c)){
         a = (a << ) + (a << ) + (c ^ ');
         c = getchar();
     }
     return a;
 }

 struct node{
     int l , r , mark , num1;
 }Tree[MAXN << ];
 ] , M , askNum , mid;

 inline void pushup(int dir){
     Tree[dir].num1 = Tree[dir << ].num1 + Tree[dir <<  | ].num1;
 }

 inline void pushdown(int dir){
     )
         Tree[dir << ].mark = Tree[dir <<  | ].mark = Tree[dir << ].num1 = Tree[dir <<  | ].num1 = ;
     else
         ){
             Tree[dir << ].mark = Tree[dir <<  | ].mark = ;
             Tree[dir << ].num1 = Tree[dir << ].r - Tree[dir << ].l + ;
             Tree[dir <<  | ].num1 = Tree[dir <<  | ].r - Tree[dir <<  | ].l + ;
         }
     Tree[dir].mark = -;
 }

 void init(int l , int r , int dir){
     Tree[dir].l = l;
     Tree[dir].r = r;
     Tree[dir].mark = -;
     if(l == r)
         Tree[dir].num1 = num[l] > mid;
     else{
         init(l , l + r >>  , dir << );
         init((l + r >> ) +  , r , dir <<  | );
         pushup(dir);
     }
 }

 void change(int l , int r , int dir , int mark){
     if(Tree[dir].l >= l && Tree[dir].r <= r){
         Tree[dir].mark = mark;
         Tree[dir].num1 = mark * (Tree[dir].r - Tree[dir].l + );
         return;
     }
     pushdown(dir);
     )
         change(l , r , dir <<  , mark);
     )
         change(l , r , dir <<  |  , mark);
     pushup(dir);
 }

 int ask(int l , int r , int dir){
     if(Tree[dir].l >= l && Tree[dir].r <= r)
         return Tree[dir].num1;
     ;
     pushdown(dir);
     )
         sum += ask(l , r , dir << );
     )
         sum += ask(l , r , dir <<  | );
     return sum;
 }

 inline bool check(){
     init( , N , );
      ; i <= M ; i++){
         ] , sortNum[i][] , );
         ]){
             change(sortNum[i][] , sortNum[i][] + t -  ,  , );
             ] + t <= sortNum[i][])
                 change(sortNum[i][] + t , sortNum[i][] ,  , );
         }
         else{
             change(sortNum[i][] - t + ,  sortNum[i][] ,  , );
             ] - t >= sortNum[i][])
                 change(sortNum[i][] , sortNum[i][] - t ,  , );
         }
     }
     );
 }
 int main(){
     N = read();
     M = read();
      ; i <= N ; i++)
         num[i] = read();
      ; i <= M ; i++){
         sortNum[i][] = read();
         sortNum[i][] = read();
         sortNum[i][] = read();
     }
     askNum = read();
      , r = N;
     while(l < r){
         mid = l + r >> ;
         if(check())
             r = mid;
         else
             l = mid + ;
     }
     cout << l;
     ;
 }

BZOJ4552 HEOI/TJOI2016 排序 线段树、二分答案的更多相关文章

  1. [Luogu P2824] [HEOI2016/TJOI2016]排序 (线段树+二分答案)

    题面 传送门:https://www.luogu.org/problemnew/show/P2824 Solution 这题极其巧妙. 首先,如果直接做m次排序,显然会T得起飞. 注意一点:我们只需要 ...

  2. 洛谷$P2824\ [HEOI2016/TJOI2016]$ 排序 线段树+二分

    正解:线段树+二分 解题报告: 传送门$QwQ$ 昂着题好神噢我$jio$得$QwQQQQQ$,,, 开始看到长得很像之前考试题的亚子,,,然后仔细康康发现不一样昂$kk$,就这里范围是$[1,n]$ ...

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

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

  4. [HEOI2016/TJOI2016]排序 线段树+二分

    [HEOI2016/TJOI2016]排序 内存限制:256 MiB 时间限制:6000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目描述 在2016年,佳媛姐姐喜欢上了数字序列.因而 ...

  5. [BZOJ 2653] middle(可持久化线段树+二分答案)

    [BZOJ 2653] middle(可持久化线段树+二分答案) 题面 一个长度为n的序列a,设其排过序之后为b,其中位数定义为b[n/2],其中a,b从0开始标号,除法取下整. 给你一个长度为n的序 ...

  6. 洛谷P4344 脑洞治疗仪 [SHOI2015] 线段树+二分答案/分块

    !!!一道巨恶心的数据结构题,做完当场爆炸:) 首先,如果你用位运算的时候不小心<<打成>>了,你就可以像我一样陷入疯狂的死循环改半个小时 然后,如果你改出来之后忘记把陷入死循 ...

  7. BZOJ4552:[TJOI2016&HEOI2016]排序(线段树,二分)

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

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

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

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

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

随机推荐

  1. 【读书笔记】iOS-微信公众平台开发最佳实践

    一,微信是由腾讯公司广州研发中心产品团队开发,该团队经理张小龙被称为“微信之父”,公司总裁马化腾确定该产品名称为“微信”. 二,常见问题及解决方案. 1,请求URL超时. 这种情况一般是由于服务器网速 ...

  2. twindows下omcat8安装后,不能启动服务

    原因可能是cmd安装时,不是以管理员的身份运行cmd命令的.解决办法,以管理员身份运行cmd,进入tomcat安装/解压的bin目录下,先执行 service.bat remove 命令卸载服务,之后 ...

  3. loadrunner 11 安装与使用

    注:以下链接均为转载,详细内容请查看原文. 安装教程: https://blog.csdn.net/u010731693/article/details/78986840 使用教程: https:// ...

  4. Java并发编程(十)阻塞队列

    使用非阻塞队列的时候有一个很大问题就是:它不会对当前线程产生阻塞,那么在面对类似消费者-生产者的模型时,就必须额外地实现同步策略以及线程间唤醒策略,这个实现起来就非常麻烦.但是有了阻塞队列就不一样了, ...

  5. (网页)20个JS 小技巧超级实用

    转自CSDN: 1. 将彻底屏蔽鼠标右键 oncontextmenu=”window.event.returnValue=false”< table border oncontextmenu=r ...

  6. ext与xfs文件系统比较与总结

    centos7.0开始默认文件系统是xfs,centos6是ext4,centos5是ext3 1.EXT2简介 EXT2第二代扩展文件系统(英语:second extended filesystem ...

  7. January 17th, 2018 Week 03rd Wednesday

    Don't let go too soon, but don't hold on too long. 不要太快放手,也别紧握太久. It is inevitalbe to encounter with ...

  8. 浅析Java中的23种设计模式

    前言 设计模式不论是在我们学习编程,还是在工作和面试过程中,都会涉及到的一个问题,所以了解和学习好设计模式,是我们每一位码农必须要具备的技能,对以后的发展和自己技能的提升都有好处. 什么是设计模式(D ...

  9. 使用idea搭建SSM框架

    搭建个SSM框架居然花费了我好长时间!特此记录! 需要准备的环境: idea 2017.1 jdk1.8 Maven 3.3.9  请提前将idea与Maven.jdk配置好,本次项目用的都是比较新的 ...

  10. Spring Boot属性配置文件详解

    相信很多人选择Spring Boot主要是考虑到它既能兼顾Spring的强大功能,还能实现快速开发的便捷.我们在Spring Boot使用过程中,最直观的感受就是没有了原来自己整合Spring应用时繁 ...