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 ...
随机推荐
- 自己封装的ASP.NET的MYSQL的数据库操作类
/** * 作者:牛腩 * 创建时间:2010年3月7日17时35分 * 类说明:对MYSQL数据库的操作类 */ using System; using System.Data; using MyS ...
- IO流-LineNumberReader
LineNumberReader继承自BufferedReader,比其多了两个方法,用于设置和获取当前行号, setLineNumber(); getLineNumber();
- HDU 5914 Triangle 斐波纳契数列 && 二进制切金条
HDU5914 题目链接 题意:有n根长度从1到n的木棒,问最少拿走多少根,使得剩下的木棒无论怎样都不能构成三角形. 题解:斐波纳契数列,a+b=c恰好不能构成三角形,暴力就好,推一下也可以. #in ...
- 【leetcode 简单】第十三题 最大子序和
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和. 示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 ...
- python基础===猴子补丁
>>> class test: def A(self, x, y): return x+y >>> t = test() >>> t.A(10,2 ...
- 生成器(generator)和迭代(iterable , iterator, iteration)
在搞清楚Generator之前,我们先讨论一下 iterable , iterator, iteration 1.Iterable 我们知道,在Python中所有东西都是object, 比如说变量,容 ...
- VC RichEdit中英文关键字标红
最近需要做vc的RichEdit控件里的内容关键字标红,由于RichEdit的内容可能是中英文混合的,所以需要先转成Unicode,再用wcsstr函数找到关键字出现的位置,再用SetSel.SelS ...
- jmeter主要组件
1.测试计划(Test plan) 2.线程组(Thread Group) 3.配置原件(Configuration) 4.逻辑控制器(Login Controller) 5.取样器(Sampler) ...
- ERROR in vc 6.0 (LINK : fatal error LNK1561: entry point must be defined)
导致错误 LINK : fatal error LNK1561: entry point must be defined 的原因有很多种, 网上可以搜到很多, 一般是函数入口没定义, 或者修改为/su ...
- mui app页面刷新问题 plus.webview.getWebviewById("").reload()
/** * 放回指定页面,并且刷新指定页面 * @param {Object} pageId 指定页面ID */ mui.app_refresh=function(pageId){ if(!mui.i ...