题目传送门: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. long数值 转换为时间

    项目中,服务器端经常给客户端开发人员传一个长整形的时间数据, 对于一个 长整形 1446801883000,可以明显的看出 是以毫秒为单位的,因为最后有三个零,如果没有连续3个零的话就要判断单位了 那 ...

  2. Angular基础(七) HTTP & Routing

    ​ 一.HTTP a)Angular提供了自己的HTTP库来调用外部API,为了能够在等待API响应的过程中继续与界面交互,采用异步HTTP请求的方式. b)Get请求,首先导入Http, Respo ...

  3. 自己搭建git 代码服务器

    使用git服务器的工程师都需要生成一个ssh的公钥 ~/.ssh$ ssh-keygen Generating public/private rsa key pair. …………………… ……………… ...

  4. Python:BeautifulSoup移除某些不需要的属性

    很久之前,我看到一个问题,大概是: 他爬了一段html,他获取下了所需的部分(img标签部分),但是不想保留img标签的某些属性, 比如 <img width="147" h ...

  5. js计算两个日期的天数差值

    js计算两个日期的天数差值 通过两个日期计算这两个日期之间的天数差值 /** * 计算天数差的函数,通用 * @param sDate1 * @param sDate2 * @returns {Num ...

  6. nginx基础知识总结

    1.nginx的工作模式 master/worker工作模式: 一个master进程: 负载加载和分析配置文件.管理worker进程.平滑重启升级等. 一个或多个worker进程 处理并响应用户请求 ...

  7. Categories  VS Extensions (分类 vs 扩展)

    转载翻译自:http://rypress.com/tutorials/objective-c/categories 一.Categories(分类)      Categories是一个把单个类定义分 ...

  8. 阿里八八β阶段Scrum(1/5)

    今日进度 叶文滔: 修改了α阶段遗留的部分界面BUG,比如状态栏白底等 张岳: 修复用户模块信息修改返回失败的BUG 林炜鸿: 重构了添加事件的代码,增加可修改的特性 黄梅玲: 绘制了新的日程显示格界 ...

  9. SpringMVC: web.xml中声明DispatcherServlet时一定要添加load-on-startup标签

    游历SpringMVC源码后发现,在web.xml中注册的ContextLoaderListener监听器只是初始化了一个根上下文,仅仅完成了组件扫描和与容器初始化相关的一些工作,并没有探测到具体每个 ...

  10. 转://SIHA环境修改主机名实施步骤

    目 录1 实施需求 2 修改主机名 2.1 停止HAS服务 2.2 修改主机名 3 重新配置服务 3.1 使用root用户重新配置CSS & OHAS服务 3.2 设置cssd自动启动属性 3 ...