题目传送门: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. Spark jdbc postgresql数据库连接和写入操作源码解读

    概述:Spark postgresql jdbc 数据库连接和写入操作源码解读,详细记录了SparkSQL对数据库的操作,通过java程序,在本地开发和运行.整体为,Spark建立数据库连接,读取数据 ...

  2. Ubuntu18.4中Apache在加不同端口的虚拟主机

    1.添加监听端口 sudo vim /etc/apache2/ports.conf Listen 80 Listen 6080 <IfModule ssl_module>         ...

  3. 排错-Loadrunner添加Windows Resource计数器提示“找不到网络路径”解决方法

    Loadrunner添加Windows Resource计数器提示“找不到网络路径”解决方法 by:授客 QQ:1033553122 1.启动windows相关服务 win->services. ...

  4. (后端)Java中关于金额大小写的工具类

    /** * 金额小数转换成中文大写金额 * * @author Neil Han * */ private static final String UNIT[] = { "万", ...

  5. vs下开发windows服务程序

    一. VS2012下开发Windows服务 1. 打开VS2012,新建项目,选择Windows服务,此处我以开发一个定时自动发送邮件的服务来做介绍,如下图: 2. 创建好后,编译器会自动创建一些文件 ...

  6. 性能测试—认识JMeter(三)

    <零成本web性能测试>第二章 JMeter基础知识总结和自己的理解 一.JMeter百度词条概念 Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件 ...

  7. Sql Server 判断字符串是否可以转数字

    主要是在sql server的内置系统函数ISNUMERIC的基础上,将例外的“+”.“-”.“$”等也进行判断. CREATE FUNCTION [dbo].[fn_IsNumberic]( @st ...

  8. 代理ARP--善意的欺骗

    1. 代理ARP(Proxy ARP)是什么? 顾名思义,它指通过中间设备(通常为Router)代替其他主机响应ARP请求.对于没有配置默认网关的主机想要与其他网络的另一台主机通信时,网关收到源主机的 ...

  9. javascript获取DOM对象三种方法

    1. getElementByID() getElementByID()方法可返回对拥有指定ID的第一个对象的引用 2. getElementByTagName() getElementByTagNa ...

  10. 五、git创建及合并分支

    1. 创建并切换到dev分支 git checkout -b dev // git checkout命令加上-b参数表示创建并切换,相当于以下两条命令 git branch dev git check ...