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 ...
随机推荐
- [Mac]一些命令技巧
Git相关 mac下git默认不区分大小写,通过下面脚本可以改变 #!/bin/bash # 让git区分大小写 cd 'path-of-project' git config core.ignore ...
- 使用 pjax 载入的新页面,新页面上 类方法 无法被触发?
在父页面上有定义类似 $(".class").click(function(){ ... }) 经过pjax 载入后的新页面 点击后没有触发事件 在segmentfault 上提问 ...
- 面试整理(1):原生ajax
接到电话面试,有一些送分题答的不好,在这里整理一下 问题:原生ajax的工作流程是怎么样的? 老用封装好的工具,原生的ajax其实并不熟悉,今天复习一下.主要参考http://www.w3school ...
- 爬虫实战--使用Selenium模拟浏览器抓取淘宝商品美食信息
from selenium import webdriver from selenium.webdriver.common.by import By from selenium.common.exce ...
- Django之ModelForm(二)-----ModelForm组件
a. class Meta: model, # 对应Model的 fields=None, ...
- 继电器是如何成为CPU的(1)【转】
转自:http://www.cnblogs.com/bitzhuwei/p/from_relay_to_tiny_CPU.html 阅读目录(Content) 从电池.开关和继电器开始 用继电器做个与 ...
- 架构师必须搞懂DNS【转】
DNS,全称Domain Name System,即域名系统,搞清楚,它不是DNF地下城与勇士. DNS是怎么来的,我们知道要访问一个服务器的资源可以通过IP的形式访问,但IP地址比较难记,也不方便读 ...
- [ python ] 网络编程(1)
在本地电脑上有两个python文件 regist.py .login.py 一个注册,一个登录.这两个python一个是写用户信息,一个是读用户信息,要怎么做呢? 通过之前的知识,我们可以通过 reg ...
- C# 下载文件的四种方法
C# 文件下载四方法 - CSDN论坛 - CSDN.NET using System; using System.Data; using System.Configuration; using Sy ...
- LINUX gcc安装rpm包顺序
rpm -ivh cpp-4.1.2-42.el5.i386.rpm rpm -ihv kernel-headers-2.6.18-92.el5.i386.rpm rpm -ivh glibc-hea ...