洛谷$P2824\ [HEOI2016/TJOI2016]$ 排序 线段树+二分
正解:线段树+二分
解题报告:
昂着题好神噢我$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]$ 排序 线段树+二分的更多相关文章
- [Luogu P2824] [HEOI2016/TJOI2016]排序 (线段树+二分答案)
题面 传送门:https://www.luogu.org/problemnew/show/P2824 Solution 这题极其巧妙. 首先,如果直接做m次排序,显然会T得起飞. 注意一点:我们只需要 ...
- [HEOI2016/TJOI2016]排序 线段树+二分
[HEOI2016/TJOI2016]排序 内存限制:256 MiB 时间限制:6000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目描述 在2016年,佳媛姐姐喜欢上了数字序列.因而 ...
- Luogu P2824 [HEOI2016/TJOI2016]排序 线段树+脑子
只会两个$log$的$qwq$ 我们二分答案:设答案为$ans$,则我们把$a[i]<=ans$全部设成$0$,把$a[i]>ans$全部设成$1$,扔到线段树里,这样区间排序(升序)就是 ...
- day 1 晚上 P2824 [HEOI2016/TJOI2016]排序 线段树
#include<iostream> #include<cstdio> #include<cstdlib> #include<cmath> #inclu ...
- 洛谷 P2824 [HEOI2016/TJOI2016]排序 解题报告
P2824 [HEOI2016/TJOI2016]排序 题意: 有一个长度为\(n\)的1-n的排列\(m\)次操作 \((0,l,r)\)表示序列从\(l\)到\(r\)降序 \((1,l,r)\) ...
- 洛谷P4344 脑洞治疗仪 [SHOI2015] 线段树+二分答案/分块
!!!一道巨恶心的数据结构题,做完当场爆炸:) 首先,如果你用位运算的时候不小心<<打成>>了,你就可以像我一样陷入疯狂的死循环改半个小时 然后,如果你改出来之后忘记把陷入死循 ...
- 洛谷P2824 [HEOI2016/TJOI2016]排序(线段树)
传送门 这题的思路好清奇 因为只有一次查询,我们考虑二分这个值为多少 将原序列转化为一个$01$序列,如果原序列上的值大于$mid$则为$1$否则为$0$ 那么排序就可以用线段树优化,设该区间内$1$ ...
- 洛谷 P2824 [HEOI2016/TJOI2016]排序 (线段树合并)
(另外:题解中有一种思路很高妙而且看上去可以适用一些其他情况的离线方法) 线段树合并&复杂度的简单说明:https://blog.csdn.net/zawedx/article/details ...
- BZOJ4552:[TJOI2016&HEOI2016]排序(线段树,二分)
Description 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他. 这个难题是这样子的:给出一个1到n的全排列,现在对这 ...
随机推荐
- Knative 初体验:Eventing Hello World
作者 | 阿里云智能事业群高级开发工程师 元毅 基于事件驱动是Serveless的核心功能之一,通过事件驱动服务,满足了用户按需付费(Pay-as-you-go)的需求.在之前的文章中我们介绍过 Kn ...
- P2P需集齐四大证照
今后做P2P需集齐四大证照 比牌照制还严 2016-09-05 11:53:24 分类:热点观察 作者:汪祖刚 8月24日,P2P网贷监管细则在千呼万唤中始出来,整个行业内外的关注热度可谓史无前例.有 ...
- Django之内置组件
Django组件介绍 分页器的使用 Form modelForm orm cookie和session 中间件 信号 ...
- 详解Python中内置的NotImplemented类型的用法
它是什么? ? 1 2 >>> type(NotImplemented) <type 'NotImplementedType'> NotImplemented 是Pyth ...
- @雅礼集训01/06 - T3@ math
目录 @description@ @solution@ @accepted code@ @details@ @description@ 给出 n, m, x,你需要求出下列式子的值: \[\sum_{ ...
- uva 11665 Chinese Ink (几何+并查集)
UVA 11665 随便给12的找了一道我没做过的几何基础题.这题挺简单的,不过uva上通过率挺低,通过人数也不多. 题意是要求给出的若干多边形组成多少个联通块.做的时候要注意这题是不能用double ...
- Bert源码阅读
前言 对Google开源出来的bert代码,来阅读下.不纠结于代码组织形式,而只是梳理下其训练集的生成,训练的self-attention和multi-head的具体实现. 训练集的生成 主要实现在c ...
- g++ 编译单个文件和多个文件
转载:https://www.cnblogs.com/battlescars/p/cpp_linux_gcc.html 1.单个源文件生成可执行程序 下面是一个保存在文件 helloworld.cpp ...
- angular input框点击别处 变成不可输入状态
<input type="text" ng-model="edit" ng-disabled="!editable" focus-me ...
- HTTP协议---三次握手
HTTP协议 关于协议 对于应用层开发人员,接触最多的网络协议通常都是传输层的TCP,为什么这么说,因为再往上的应用层协议,如:HTTP.HTTPS.POP3.SMTP.RPC.FTP.TELNE ...