BZOJ 4552 排序 Heoi2016
记得当年省选的时候 这道题连暴力都没写对(尴尬ing)
(当年天真的认为sort是左闭右闭的hhhhhh)
思路:
首先 二分答案
线段树
首先二分答案,然后需要知道进行m次排序后p位置上的数字是否大于mid。
对于一个mid,我们可以把序列里的数字分为两类,即大于mid的数和小于等于mid的数,分别用1和0表示。
对这些0和1进行排序时,对于一个区间[l,r]进行升序排序,等价于把所有的0放在前面,所有的1放在后面;降序排序反之。
用线段树支持区间求和及区间修改即可。
-----YOUSIKI
//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 100050
int n,m,a[N],askx[N],asky[N],op[N],l=1,r,xx,tree[N*16],lazy[N*16],ans;
void insert(int l,int r,int pos,int id,int wei){
if(l==r){tree[pos]+=wei;return;}
int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
if(mid<id)insert(mid+1,r,rson,id,wei);
else insert(l,mid,lson,id,wei);
tree[pos]=tree[lson]+tree[rson];
}
void push_down(int pos,int num){
int lson=pos<<1,rson=pos<<1|1;
tree[lson]=(num-num/2)*lazy[pos],tree[rson]=(num>>1)*lazy[pos];
lazy[lson]=lazy[rson]=lazy[pos];
lazy[pos]=-1;
}
int query(int l,int r,int pos,int L,int R){
if(~lazy[pos])push_down(pos,r-l+1);
if(l>=L&&r<=R)return tree[pos];
int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
if(mid<L)return query(mid+1,r,rson,L,R);
else if(mid>=R)return query(l,mid,lson,L,R);
else return query(l,mid,lson,L,R)+query(mid+1,r,rson,L,R);
}
void modify(int l,int r,int pos,int L,int R,int wei){
if(L>R)return;
if(l>=L&&r<=R){tree[pos]=(r-l+1)*wei,lazy[pos]=wei;return;}
if(~lazy[pos])push_down(pos,r-l+1);
int mid=(l+r)>>1,lson=pos<<1,rson=pos<<1|1;
if(mid<L)modify(mid+1,r,rson,L,R,wei);
else if(mid>=R)modify(l,mid,lson,L,R,wei);
else modify(l,mid,lson,L,R,wei),modify(mid+1,r,rson,L,R,wei);
tree[pos]=tree[lson]+tree[rson];
}
int main(){
scanf("%d%d",&n,&m),r=n;
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=m;i++)scanf("%d%d%d",&op[i],&askx[i],&asky[i]);
scanf("%d",&xx);
while(l<=r){
memset(tree,0,sizeof(tree)),memset(lazy,-1,sizeof(lazy));
int mid=(l+r)>>1;
for(int i=1;i<=n;i++)insert(1,n,1,i,a[i]<=mid);
for(int i=1;i<=m;i++){
int num=query(1,n,1,askx[i],asky[i]);
modify(1,n,1,askx[i],asky[i],0);
if(!op[i])modify(1,n,1,askx[i],askx[i]+num-1,1);
else modify(1,n,1,asky[i]-num+1,asky[i],1);
}
if(query(1,n,1,xx,xx))r=mid-1,ans=mid;
else l=mid+1;
}
printf("%d\n",ans);
}
BZOJ 4552 排序 Heoi2016的更多相关文章
- BZOJ 4552: [Tjoi2016&Heoi2016]排序
4552: [Tjoi2016&Heoi2016]排序 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 579 Solved: 322[Sub ...
- bzoj 4552 [Tjoi2016&Heoi2016]排序 (二分答案 线段树)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4552 题意: 给你一个1-n的全排列,m次操作,操作由两种:1.将[l,r]升序排序,2 ...
- BZOJ 4552 [Tjoi2016&Heoi2016]排序 线段树的分裂和合并
https://www.lydsy.com/JudgeOnline/problem.php?id=4552 https://blog.csdn.net/zawedx/article/details/5 ...
- bzoj 4552 [Tjoi2016&Heoi2016]排序——二分答案
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4552 二分答案,把 >= mid 的设成1.< mid 的设成0,之后排序就变成 ...
- BZOJ 4552 [Tjoi2016&Heoi2016]排序 | 二分答案 线段树
题目链接 题面 题目描述 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这 ...
- BZOJ 4552: [Tjoi2016&Heoi2016]排序 线段树 二分
目录 此代码是个假代码,只能糊弄luogu,以后再改,路过大佬也可以帮一下辣 update 10.6 此代码是个假代码,只能糊弄luogu,以后再改,路过大佬也可以帮一下辣 /* //fang zhi ...
- bzoj 4552: [Tjoi2016&Heoi2016]排序——二分+线段树
Description 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题 ,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这 ...
- bzoj 4552: [Tjoi2016&Heoi2016]排序【二分+线段树】
二分值mid,然后把>=mid的赋值为1,其他赋值为0,每次排序就是算出区间内01的个数,然后分别把0和1放到连续的一段内,这些都可以用线段树来维护 二分的判断条件是操作完之后q位置上是否为1 ...
- BZOJ 4552 [Tjoi2016&Heoi2016]排序 ——线段树 二分答案
听说是BC原题. 好题,二分答案变成01序列,就可以方便的用线段树维护了. 然后就是区间查询和覆盖了. #include <map> #include <cmath> #inc ...
随机推荐
- 多线程003 - 再谈CyclicBarrier
java.util.concurrent.CyclicBarrier也是JDK 1.5提供的一个同步辅助类(为什么用也呢?參见再谈CountDownLatch).它同意一组线程互相等待,直到到达某 ...
- LeetCode_Maximum Depth of Binary Tree
一.题目 Maximum Depth of Binary Tree My Submissions Given a binary tree, find its maximum depth. The ma ...
- [jQuery] 选择器和事件
jQuery选择器 属性选择器 <p>p1</p> <span style="font-size:24px;"></span>< ...
- Android 开发之集成百度地图的定位与地图展示
app 应用中,大多数应用都具有定位功能,百度定位就成了开发人员的集成定位功能的首选,近期也在做定位功能,可是发现百度真是个大坑啊, sdk 命名更新了,相关代码却不更新,害得我花费了非常长时间来研究 ...
- sicily 1342 开心的金明 (动规)
刷一下简单的背包问题 以下为代码: //1342. 开心的金明 #include <iostream> using namespace std; #define MAX(a,b) a> ...
- awesome python 中文版 相见恨晚!(pythonNB的第三方资源库)
Awesome Python中文版来啦! 原文链接:Python 资源大全 内容包括:Web框架.网络爬虫.网络内容提取.模板引擎.数据库.数据可视化.图片处理.文本处理.自然语言处理.机器学习.日志 ...
- BZOJ 3175 最大独立集
思路: 最大独立集嘛 用nlogn的Dinic做 //By SiriusRen #include <queue> #include <cstdio> #include < ...
- BZOJ 2005 容斥原理
思路: 题目让求的是 Σgcd(i,j) (i<=n,j<=m) n,m不同 没法线性筛 怎么办? 容斥原理!! f[x]表示gcd(i,j)=x的个数 g[x]为 存在公约数=x 的数对 ...
- Java数据库连接——PreparedStatement的使用
首先了解Statement和PreparedStatement的区别: 由此可见,一般使用PreparedStatement. 操作数据库SU(Course表),其中Course属性有Cno,Cnam ...
- 线程状态与tcb、线程的生命周期
struct tcb { u32_t status; struct reg_context thread_context; void *stack; struct thread_info thread ...