题目传送门: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. SuperMap空间数据处理与制图操作短视频汇总

    转自:http://blog.csdn.net/supermapsupport/article/details/70227669 空间数据处理与制图是GIS系统建设最基础的部分,这里利用超图桌面软件- ...

  2. loadrunner 脚本开发-文件读写操作

    脚本开发-文件读写操作 by:授客 QQ:1033553122 函数说明 函数原型: size_t fwrite( const void *buffer, size_t size, size_t co ...

  3. loadrunner 脚本开发-参数化之将内容保存为参数、参数数组及参数值获取Part 2

    脚本开发-参数化之将内容保存为参数.参数数组及参数值获取 by:授客 QQ:1033553122 ----------------接 Part 1--------------- 把内容保存到参数数组 ...

  4. Expo大作战(三十八)--expo sdk api之 FileSystem(文件操作系统)

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  5. 洗礼灵魂,修炼python(29)--装饰器(1)—>利用经典案例解析装饰器概念

    前提必备 不急着进入正题,在前面函数作用域那一章介绍了闭包,全局变量局部变量,这里再看几个简单的闭包案例: 1):不带参数 注意: 1.这里的name属性是每个函数都有的,可以反馈函数名 2.temp ...

  6. 高德地图JS API 开发小结

    项目中有一块功能要用到高德地图,所以,想把编码小结一下. 首先是地图的初始化 var map = new AMap.Map("mapDiv", {                  ...

  7. Maven将依赖包、jar/war包及配置文件输出到指定目录

    使用Maven插件将依赖包 jar包 war包及配置文件输出到指定目录 写在前面 ​ 最近遇到一个朋友遇到一个项目需要将 maven 的依赖包和配置文件分开打包然后用脚本执行程序.这样的好处在于可以随 ...

  8. 使用KeePass管理两步验证

    目录 使用KeePass管理两步验证 两步验证 KeePass中管理两步验证 KeeTrayTOTP插件使用 使用KeePass管理两步验证 文:铁乐与猫 2018-9-9 KeePass 是一款管理 ...

  9. Appium 实战练习一

    # -*- coding:utf-8 -*- ''' Created on Sep 30, 2018 @author: SaShuangYiBing Comment: ''' import time ...

  10. [android]android Task 任务 简介

    http://blog.csdn.net/guomeijuan916/article/details/8121468 关于Android中的组件和应用,之前涉及,大都是静态的概念.而当一个应用运行起来 ...