排序(bzoj 4552)
Description
Input
Output
输出数据仅有一行,一个整数,表示按照顺序将全部的部分排序结束后第q位置上的数字。
Sample Input
1 6 2 5 3 4
0 1 4
1 3 6
0 2 4
3
Sample Output
/*
题解很神奇。
二分答案k,那么就是要判断a[p]与k的大小关系。
我们把序列变成0/1序列,0代表该位置的数小于k,1代表大于等于k,对于升降序操作,
用线段树维护就可以了,最后判断一下。
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define N 30010
using namespace std;
int a[N],b[N][],n,m,p;
int sum[N*],tag[N*];
void push_up(int k){
sum[k]=sum[k*]+sum[k*+];
}
void push_down(int k,int l,int r){
if(tag[k]==-) return;
int mid=l+r>>;
tag[k*]=tag[k*+]=tag[k];
sum[k*]=(mid-l+)*tag[k];
sum[k*+]=(r-mid)*tag[k];
tag[k]=-;
}
void change(int k,int l,int r,int x,int y,int val){
if(x>y) return;
if(l>=x&&r<=y){
sum[k]=(r-l+)*val;
tag[k]=val;
return;
}
push_down(k,l,r);
int mid=l+r>>;
if(x<=mid) change(k*,l,mid,x,y,val);
if(y>mid) change(k*+,mid+,r,x,y,val);
push_up(k);
}
int query(int k,int l,int r,int x,int y){
if(l>=x&&r<=y) return sum[k];
push_down(k,l,r);
int mid=l+r>>,tot=;
if(x<=mid) tot+=query(k*,l,mid,x,y);
if(y>mid) tot+=query(k*+,mid+,r,x,y);
return tot;
}
bool check(int mid){
memset(tag,-,sizeof(tag));
memset(sum,,sizeof(sum));
for(int i=;i<=n;i++) change(,,n,i,i,a[i]>=mid);
for(int i=;i<=m;i++){
int t=query(,,n,b[i][],b[i][]);
if(!b[i][]){
change(,,n,b[i][],b[i][]-t,);
change(,,n,b[i][]-t+,b[i][],);
}
else {
change(,,n,b[i][],b[i][]+t-,);
change(,,n,b[i][]+t,b[i][],);
}
}
int t=query(,,n,p,p);
return t;
}
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",&b[i][],&b[i][],&b[i][]);
scanf("%d",&p);
int l=,r=n,ans;
while(l<=r){
int mid=l+r>>;
if(check(mid)) l=mid+,ans=mid;
else r=mid-;
}
printf("%d",ans);
return ;
}
排序(bzoj 4552)的更多相关文章
- 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 排序 Heoi2016
记得当年省选的时候 这道题连暴力都没写对(尴尬ing) (当年天真的认为sort是左闭右闭的hhhhhh) 思路: 首先 二分答案 线段树 首先二分答案,然后需要知道进行m次排序后p位置上的数字是否大 ...
随机推荐
- Python字符串处理:过滤字符串中的英文与符号,保留汉字
使用Python 的re模块,re模块提供了re.sub用于替换字符串中的匹配项. re.sub(pattern, repl, string, count=0) 参数说明: pattern:正则重的模 ...
- Less入门教程
http://www.cnblogs.com/fsjohnhuang/p/4187675.html
- mvc4 Forms验证存储 两种登录代码
自己也不知道网上看到的第一种居多,第二种用到的人很少,第二种代码十分简洁,就是不清楚是否有安全隐患. 要采用Forms身份验证,先要在应用程序根目录中的Web.config中做相应的设置: <a ...
- vue之vue-cookies使用
一.安装vue-cookies npm install --save vue-cookies 或者 yarn add vue-cookies 二.引入vue-cookie // 方式一:require ...
- Qt 报错LINK2019:无法解析的外部符号
这里用的都是Qt 自己的东西,但是还是抱错,所以怀疑是没有包含进去,尝试了清理项目,重新编译等,还是不行 用到一个最好的办法,就是把构建的文件夹整个删除,在重新编译就可以了 如图所示,把debug和r ...
- MySQL☞Group By
分组: group by 列名:根据某一列,把数据分成几组,经常对每一组的数据使用聚合函数,按照我的理解,该列有几种不同的值,那么就把该列分成几组,如下图 简单的来说,第二列中有两个不同的值a和b,那 ...
- Spring实战第四章学习笔记————面向切面的Spring
Spring实战第四章学习笔记----面向切面的Spring 什么是面向切面的编程 我们把影响应用多处的功能描述为横切关注点.比如安全就是一个横切关注点,应用中许多方法都会涉及安全规则.而切面可以帮我 ...
- 剑指offer-二叉树的镜像18
题目描述 操作给定的二叉树,将其变换为源二叉树的镜像. 输入描述: 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 / \ / \ ...
- Visual Studio 6.0安装包
点击下载
- 【积累】根据CheckBox的不选中 ,用JQuery 清除 RidaoButtonList 的选中项
如题,项目要求无刷新更新数据. 1)Web页面布局 Html以及效果图