BZOJ4552 HEOI2016排序
太棒了!思路很不错。
没想到HEOID1三道线段树。
这题我们可以二分答案,将小于他的在线段树中设成0,大于他的设成1然后模拟操作复杂度O(mlog^2n)
By:大奕哥
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+;
struct node
{
int l,s,lz;
}t[N<<];
int n,m,a[N],p;
struct que
{
int f,l,r;
}q[N];
void build(int p,int l,int r)
{
if(l==r){
t[p].l=;return;
}
int mid=l+r>>;t[p].l=r-l+;
build(p<<,l,mid);build(p<<|,mid+,r);
}
void pushdown(int p)
{
if(t[p].lz)
{
if(t[p].lz==)t[p<<].s=t[p<<].l,t[p<<|].s=t[p<<|].l;
if(t[p].lz==-)t[p<<].s=t[p<<|].s=;
t[p<<].lz=t[p<<|].lz=t[p].lz;t[p].lz=;
}
}
int query(int p,int l,int r,int L,int R)
{
if(l==L&&r==R)return t[p].s;
int mid=l+r>>;pushdown(p);
if(mid>=R)return query(p<<,l,mid,L,R);
else if(L>mid)return query(p<<|,mid+,r,L,R);
else return query(p<<,l,mid,L,mid)+query(p<<|,mid+,r,mid+,R);
}
void change(int p,int l,int r,int L,int R,int w)
{
if(L>R)return;
if(l==L&&r==R)
{
if(w)t[p].s=t[p].l,t[p].lz=;else t[p].s=,t[p].lz=-;return;
}
int mid=l+r>>;pushdown(p);
if(mid>=R)change(p<<,l,mid,L,R,w);
else if(L>mid)change(p<<|,mid+,r,L,R,w);
else change(p<<,l,mid,L,mid,w),change(p<<|,mid+,r,mid+,R,w);
t[p].s=t[p<<].s+t[p<<|].s;
}
bool check(int x)
{
for(int i=;i<=n;++i)
{
if(a[i]<x)change(,,n,i,i,);
else change(,,n,i,i,);
}
for(int i=;i<=m;++i)
{
int tmp=query(,,n,q[i].l,q[i].r);
if(q[i].f)
{
change(,,n,q[i].l,q[i].l+tmp-,);
change(,,n,q[i].l+tmp,q[i].r,);
}
else
{
change(,,n,q[i].r-tmp+,q[i].r,);
change(,,n,q[i].l,q[i].r-tmp,);
}
}
return query(,,n,p,p);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;++i)scanf("%d",&a[i]);
for(int i=;i<=m;++i)scanf("%d%d%d",&q[i].f,&q[i].l,&q[i].r);
scanf("%d",&p);
int ans,l=,r=n;
build(,,n);
while(l<=r)
{
int mid=l+r>>;
if(check(mid))ans=mid,l=mid+;
else r=mid-;
}
printf("%d",ans);
return ;
}
BZOJ4552 HEOI2016排序的更多相关文章
- 【BZOJ4552】[Tjoi2016&Heoi2016]排序 二分+线段树
[BZOJ4552][Tjoi2016&Heoi2016]排序 Description 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题 ...
- bzoj千题计划128:bzoj4552: [Tjoi2016&Heoi2016]排序
http://www.lydsy.com/JudgeOnline/problem.php?id=4552 二分答案 把>=mid 的数看做1,<mid 的数看做0 这样升序.降序排列相当于 ...
- BZOJ 4552: [Tjoi2016&Heoi2016]排序
4552: [Tjoi2016&Heoi2016]排序 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 579 Solved: 322[Sub ...
- 【BZOJ4552】排序(线段树,二分答案)
[BZOJ4552]排序(线段树,二分答案) 题面 BZOJ 题解 好神的题啊 直接排序我们做不到 怎么维护? 考虑一下,如果我们随便假设一个答案 怎么检验它是否成立? 把这个数设成\(1\),其他的 ...
- [Tjoi2016&Heoi2016]排序[01序列]
4552: [Tjoi2016&Heoi2016]排序 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 994 Solved: 546[Sub ...
- 4552: [Tjoi2016&Heoi2016]排序
4552: [Tjoi2016&Heoi2016]排序 链接 分析: 因为只询问一次,所以考虑二分这个数.显然是没有单调性的,但是我们可以二分所有大于等于mid的数中,是否有满足条件的x(而不 ...
- [BZOJ4552][TJOI2016&&HEOI2016]排序(二分答案+线段树/线段树分裂与合并)
解法一:二分答案+线段树 首先我们知道,对于一个01序列排序,用线段树维护的话可以做到单次排序复杂度仅为log级别. 这道题只有一个询问,所以离线没有意义,而一个询问让我们很自然的想到二分答案.先二分 ...
- BZOJ4552 [Tjoi2016&Heoi2016]排序 【二分 + 线段树】
题目链接 BZOJ4552 题解 之前去雅礼培训做过一道题,\(O(nlogn)\)维护区间排序并能在线查询 可惜我至今不能get 但这道题有着\(O(nlog^2n)\)的离线算法 我们看到询问只有 ...
- [bzoj4552][Tjoi2016][Heoi2016]排序
Description 给出一个$1$到$n$的全排列,现在对这个全排列序列进行$m$次局部排序,排序分为$2$种: $1.(0,l,r)$表示将区间$[l,r]$的数字升序排序; $2.(1,l,r ...
随机推荐
- 【BZOJ】1143: [CTSC2008]祭祀river
[题意]求DAG上最多的点使得互不可达. [算法]floyd+最大匹配 [题解] 链是DAG上的一个点集,集合内的点相互单向可达. 反链是DAG上的一个点集,集合内的点相互不可达. 题目显然是求最长反 ...
- Node.js的开源博客系统Ghost搭建教程
准备工作 Node.js版本:0.10.x.0.12.x.4.2.x.安装步骤可参考:Node.js环境搭建 Ghost版本:0.7.4:中文集成版(33.6M),中文标准版(3.39M),英文原版( ...
- 爬虫--selenium
什么是selenium? 基本使用 from selenium import webdriver from selenium.webdriver.common.by import By from se ...
- 关于angularJS的一些用法
AngularJS 事件指令: ng-click/dblclick ng-mousedown/up ng-mouseenter/leave ng-mousemove/over/out ng-keydo ...
- Callback2.0
Callback定义? a callback is a piece of executable code that is passed as an argument to other code, wh ...
- RF, GBDT, XGB区别
GBDT与XGB区别 1. 传统GBDT以CART作为基分类器,xgboost还支持线性分类器(gblinear),这个时候xgboost相当于带L1和L2正则化项的逻辑斯蒂回归(分类问题)或者线性回 ...
- AUC画图与计算
利用sklearn画AUC曲线 from sklearn.metrics import roc_curve labels=[1,1,0,0,1] preds=[0.8,0.7,0.3,0.6,0.5] ...
- sar命令使用【转】
sar(System Activity Reporter系统活动情况报告)是目前 Linux 上最为全面的系统性能分析工具之一,可以从多方面对系统的活动进行报告,包括:文件的读写情况.系统调用的使用情 ...
- openjudge-NOI 2.6-2718 移动路线
题目链接:http://noi.openjudge.cn/ch0206/2718/ 题解: 递推,某一个点只能从其左边或者下边走过来 f[i][j]存储(i,j)这个点上的结果,即f[i][j]=f[ ...
- ELK简单使用
原作者:http://www.cnblogs.com/snidget/p/6269383.html ELK ELK是什么? Elasticsearch LogStash Kibana 1,简单 ...