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 ...
随机推荐
- word2vec词向量训练及中文文本类似度计算
本文是讲述怎样使用word2vec的基础教程.文章比較基础,希望对你有所帮助! 官网C语言下载地址:http://word2vec.googlecode.com/svn/trunk/ 官网Python ...
- 从零開始学android<TabHost标签组件.二十九.>
TabHost主要特点是能够在一个窗体中显示多组标签栏的内容,在Android系统之中每一个标签栏就称为一个Tab.而包括这多个标签栏的容器就将其称为TabHost.TabHost类的继承结构例如以下 ...
- Hibernate的xml方法配置和操作代码
一.gradle中包: compile group: 'org.hibernate', name: 'hibernate-core', version: '5.2.12.Final' compile ...
- WPF silverlight获取子控件(获取DataTemplate里的子控件)
public static class VisualTreeExtensions { /// <summary> /// 获取父节点控件 /// </summary> /// ...
- vue 结合 echarts
http://blog.csdn.net/mr_wuch/article/details/70225364
- ORACLE RAC如何增加节点
ORACLE RAC系统是一个可以横向进行扩展的系统,当一个RAC系统计算能力不满足客户的需求时候,增加节点能够快速增加整个系统的计算能力,使得客户系统计算能力得到一定的提升,以满足客户不断增长的计算 ...
- [JZOJ 5888] [NOIP2018模拟9.29] GCD生成树 解题报告 (最大生成树+公约数)
题目链接: http://172.16.0.132/senior/#main/show/5888 题目: 题解: 思路是这样的:两个数的最大公约数一定不会比这两个数的任意一个数大.因此我们把权值相等的 ...
- Binary Indexed Tree
我借鉴了这个视频中的讲解的填坑法,我认为非常易于理解.有FQ能力和基本英语听力能力请直接去看视频,并不需要继续阅读. naive 算法 考虑一个这样的场景: 给定一个int数组, 我们想知道它的连续子 ...
- Parquet学习总结
深入分析Parquet列式存储格式 Parquet是面向分析型业务的列式存储格式,由Twitter和Cloudera合作开发,2015年5月从Apache的孵化器里毕业成为Apache顶级项目,最新的 ...
- 003.JMS概述
1. 基本概念 JMS:Java Message Service, Java消息服务,是Java EE中的一个技术. JMS规范:JMS定义了Java中访问消息中间件的接口,并没有给予实现,实现JMS ...