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 ...
随机推荐
- lintcode 66.67.68 二叉树遍历(前序、中序、后序)
AC代码: /** * Definition of TreeNode: * public class TreeNode { * public int val; * public TreeNode le ...
- input只读属性readonly和disabled的区别
主要区别: 参考: http://bbs.html5cn.org/forum.php?mod=viewthread&tid=84113&highlight=input http://b ...
- 【译】第五篇 SQL Server代理理解代理错误日志
本篇文章是SQL Server代理系列的第五篇,详细内容请参考原文. 正如这一系列的前几篇所述,SQL Server代理作业是由一系列的作业步骤组成,每个步骤由一个独立的类型去执行.在第四篇中我们看到 ...
- 【Tomcat】 windows下注册tomcat服务以及设置jvm参数
注册服务: 1 >cd /d D:\Java\tomcat-7.0.57-Css\bin //进入目录 1 >service.bat install //注册服务,同理删除服务为 rem ...
- SPI协议及其工作原理浅析【转】
转自:http://www.laoliu-soft.net/category/tech_chap/tech_linux/ 一.概述. SPI, Serial Perripheral Interface ...
- 高通msm mdm 总结
1. svn 获取工程代码命令:svn co svn+ssh://10.20.30.18/svn-repos/msm8916/branches/LA1.1-CS-r113502.2 2. 如何确定那些 ...
- tomcat+ngnix单机搭建集群及端口占用问题
1.将tomcat复制两份,如下: 2.新建环境变量,如下: 3.修改其中一个的配置文件,另一个保持不变,修改server.xml配置文件如下: <Server port="9005& ...
- 关于Java代码优化的35条建议
代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是, ...
- java版云笔记(五)
下来是创建笔记本,创建笔记,这个没什么难点和前面是一样的. 创建笔记本 首先点击"+"弹出添加笔记的对话框,然后点击确定按钮创建笔记本. //点击"+"弹出添加 ...
- linux和windows下TIME_WAIT过多的解决办法
http://www.51testing.com/html/48/202848-249774.html linux和windows下TIME_WAIT过多的解决办法 http://m.sohu.com ...