正解:线段树+二分

解题报告:

传送门$QwQ$

昂着题好神噢我$jio$得$QwQQQQQ$,,,

开始看到长得很像之前考试题的亚子,,,然后仔细康康发现不一样昂$kk$,就这里范围是$[1,n]$,而且每个数字只出现了一次,显然就不能用线段树维护每个数字的出现次数了$QAQ$

考虑先二分这个位置上的数字,然后把所有大于这个数字的赋值为1其他赋值为0,然后就直接按01排序,最后$check$这个位置是0还是1就成$QwQ$

$over$

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define gc getchar()
#define ri register int
#define rc register char
#define rb register bool
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i) const int N=1e5+,inf=1e9;
int n,m,q,a[N],st[N],l=inf,r,tr[N<<],tag[N<<],as;
struct node{int op,l,r;}nod[N]; il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
void build(ri nw,ri l,ri r)
{
if(l==r)return void(tr[nw]=st[l]);
ri mid=(l+r)>>;build(nw<<,l,mid);build(nw<<|,mid+,r);tr[nw]=tr[nw<<]+tr[nw<<|];
}
void pushdown(ri x,ri l,ri r)
{
if(tag[x]==-)return;
ri mid=(l+r)>>;tr[x<<]=tag[x]*(mid-l+);tr[x<<|]=tag[x]*(r-mid);tag[x<<]=tag[x<<|]=tag[x];tag[x]=-;
}
int query(ri nw,ri l,ri r,ri to_l,ri to_r)
{
if(to_l<=l && r<=to_r)return tr[nw];
ri mid=(l+r)>>,ret=;pushdown(nw,l,r);
if(mid>=to_l)ret+=query(nw<<,l,mid,to_l,to_r);
if(mid<to_r)ret+=query(nw<<|,mid+,r,to_l,to_r);
tr[nw]=tr[nw<<]+tr[nw<<|];
return ret;
}
void modify(ri nw,ri l,ri r,ri to_l,ri to_r,ri dat)
{
if(to_l>to_r)return;
if(to_l<=l && r<=to_r){tag[nw]=dat,tr[nw]=dat*(r-l+);return;}
ri mid=(l+r)>>;pushdown(nw,l,r);
if(mid>=to_l)modify(nw<<,l,mid,to_l,to_r,dat);
if(mid<to_r)modify(nw<<|,mid+,r,to_l,to_r,dat);
tr[nw]=tr[nw<<]+tr[nw<<|];
}
il bool check(ri d)
{
rp(i,,n)st[i]=a[i]>=d;
build(,,n);memset(tag,-,sizeof(tag));
rp(i,,m)
{
ri dat=query(,,n,nod[i].l,nod[i].r);
if(nod[i].op){modify(,,n,nod[i].l,nod[i].l+dat-,);modify(,,n,nod[i].l+dat,nod[i].r,);}
else{modify(,,n,nod[i].r-dat+,nod[i].r,);modify(,,n,nod[i].l,nod[i].r-dat,);}
}
return query(,,n,q,q);
} int main()
{
l=;r=n=read();m=read();memset(tag,-,sizeof(tag));
rp(i,,n)a[i]=read();rp(i,,m)nod[i]=(node){read(),read(),read()};q=read();
while(l<=r){ri mid=(l+r)>>;if(check(mid))l=mid+,as=mid;else r=mid-;}printf("%d\n",as);
return ;
}

洛谷$P2824\ [HEOI2016/TJOI2016]$ 排序 线段树+二分的更多相关文章

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

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

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

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

  3. Luogu P2824 [HEOI2016/TJOI2016]排序 线段树+脑子

    只会两个$log$的$qwq$ 我们二分答案:设答案为$ans$,则我们把$a[i]<=ans$全部设成$0$,把$a[i]>ans$全部设成$1$,扔到线段树里,这样区间排序(升序)就是 ...

  4. day 1 晚上 P2824 [HEOI2016/TJOI2016]排序 线段树

    #include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> #inclu ...

  5. 洛谷 P2824 [HEOI2016/TJOI2016]排序 解题报告

    P2824 [HEOI2016/TJOI2016]排序 题意: 有一个长度为\(n\)的1-n的排列\(m\)次操作 \((0,l,r)\)表示序列从\(l\)到\(r\)降序 \((1,l,r)\) ...

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

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

  7. 洛谷P2824 [HEOI2016/TJOI2016]排序(线段树)

    传送门 这题的思路好清奇 因为只有一次查询,我们考虑二分这个值为多少 将原序列转化为一个$01$序列,如果原序列上的值大于$mid$则为$1$否则为$0$ 那么排序就可以用线段树优化,设该区间内$1$ ...

  8. 洛谷 P2824 [HEOI2016/TJOI2016]排序 (线段树合并)

    (另外:题解中有一种思路很高妙而且看上去可以适用一些其他情况的离线方法) 线段树合并&复杂度的简单说明:https://blog.csdn.net/zawedx/article/details ...

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

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

随机推荐

  1. python3中的zip函数

    zip函数的作用: zip函数接受任意多个可迭代对象作为参数,将对象中对应的元素打包成一个tuple,然后返回一个可迭代的zip对象. 这个可迭代对象可以使用循环的方式列出其元素 若多个可迭代对象的长 ...

  2. Python深入:02浅拷贝深拷贝

    对象赋值实际上是简单的对象引用.也就是说当你创建一个对象,然后把它赋给另一个变量的时候,Python并没有拷贝这个对象,而只是拷贝了这个对象的引用. 假设想创建一对小夫妻的通用档案,名为person. ...

  3. HZOJ string

    正解炸了…… 考试的时候想到了正解,非常高兴的打出来了线段树,又调了好长时间,对拍了一下发现除了非常大的点跑的有点慢外其他还行.因为复杂度算着有点高…… 最后正解死于常数太大……旁边的lyl用同样的算 ...

  4. linux扫盲之CPU模式

    相信研究linux的大大都知道linux有实模式.保护模式.虚拟模式三种. 不多说,拷贝黏贴!  80386开始,cpu有三种工作方式:实模式,保护模式和虚拟8086模式.只有在刚刚启动的时候是rea ...

  5. 可运行的js代码

    canrun <html> <head> <title>测试博客园HTML源码运行程序</title> <meta http-equiv=&quo ...

  6. log4js的简单配置

    js记录日志工具log4js,参数请参考官网文档https://log4js-node.github.io/log4js-node/index.html const log4js = require( ...

  7. 洛谷P3377 【模板】左偏树(可并堆) 题解

    作者:zifeiy 标签:左偏树 这篇随笔需要你在之前掌握 堆 和 二叉树 的相关知识点. 堆支持在 \(O(\log n)\) 的时间内进行插入元素.查询最值和删除最值的操作.在这里,如果最值是最小 ...

  8. 用diiv实现多个方块居中嵌套--margin

    文章地址 https://www.cnblogs.com/sandraryan/ 案例:用diiv嵌套多个正方形,配合盒模型相关知识,使每个div在他的父元素上居中.(每个div中心点对齐) 涉及到m ...

  9. Python--day64--author表多对多关联book表

    数据库数据结构设计:

  10. H3C PPP基本概念