【Luogu】P2824排序(二分答案+线段树排序)
震惊!两个线段树和一个线段树竟是50分的差距!
本题可以使用二分答案,二分那个位置上最后是什么数。怎么验证呢?
把原序列改变,大于等于mid的全部变成1,小于mid的全部变成0,之后线段树排序。
最后看那个位置上是1还是0,若是1则说明最后那个位置上是个>=mid的数。
#include<cstdio>
#include<cctype>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#define left (rt<<1)
#define right (rt<<1|1)
#define mid ((l+r)>>1)
#define lson l,mid,left
#define rson mid+1,r,right
#define maxn 300030
using namespace std;
inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} struct Que{
int opt,from,to;
}q[maxn]; int d[maxn],w[maxn]; int tree[maxn*],mem[maxn*],tag[maxn*];
inline void pushup(int rt){ tree[rt]=tree[left]+tree[right]; }
inline void build(int l,int r,int rt){
tree[rt]=mem[rt]=tag[rt]=;
if(l==r){
tree[rt]=w[l];
//printf("%d %d\n",l,w[l]);
return;
}
build(lson);
build(rson);
pushup(rt);
}
inline void pushdown(int rt,int m){
if(mem[rt]==&&tag[rt]==) return;
if(mem[rt]){
mem[left]=mem[right]=;
tree[left]=tree[right]=;
tag[left]=tag[right]=;
mem[rt]=;
}
if(tag[rt]){
tag[left]+=tag[rt]; tag[right]+=tag[rt];
tree[left]+=m-(m>>);
tree[right]+=m>>;
tag[rt]=;
}
return;
}
void update(int from,int to,int l,int r,int rt){
if(from<=l&&to>=r){
tag[rt]++;
tree[rt]+=r-l+;
return;
}
pushdown(rt,r-l+);
if(from<=mid) update(from,to,lson);
if(to>mid) update(from,to,rson);
pushup(rt);
}
void memdate(int from,int to,int l,int r,int rt){
if(from<=l&&to>=r){
tag[rt]=; mem[rt]=;
tree[rt]=;
return;
}
pushdown(rt,r-l+);
if(from<=mid) memdate(from,to,lson);
if(to>mid) memdate(from,to,rson);
pushup(rt);
}
int query(int from,int to,int l,int r,int rt){
if(from<=l&&to>=r) return tree[rt];
pushdown(rt,r-l+);
int ans=;
if(from<=mid) ans+=query(from,to,lson);
if(to>mid) ans+=query(from,to,rson);
return ans;
} bool check(int lim,int n,int m,int last){
build(,n,);
for(int i=;i<=m;++i){
int opt=q[i].opt,from=q[i].from,to=q[i].to;
int c1=query(from,to,,n,);
int c2=to-from+-c1;
//printf("%d %d<<\n",c1,c2);
memdate(from,to,,n,);
if(opt==) update(from+c2,to,,n,);
else update(from,from+c1-,,n,);
}
//printf("zero\n");
//for(int i=1;i<=n;++i) printf("%d ",zero.query(i,i,1,n,1));
//printf("\none\n");
//for(int i=1;i<=n;++i) printf("%d ",one.query(i,i,1,n,1));
//printf("\n");
return query(last,last,,n,);
} int main(){
int n=read(),m=read();
for(int i=;i<=n;++i) d[i]=read();
for(int i=;i<=m;++i) q[i]=(Que){read(),read(),read()};
int last=read();
int l=,r=n,ans=;
while(l<=r){
//printf("%d %d %d\n",l,r,mid);
for(int i=;i<=n;++i)
if(d[i]>=mid) w[i]=;
else w[i]=;
//for(int i=1;i<=n;++i) printf("%d<",w[i]);
//printf("\n");
if(check(mid,n,m,last)){
ans=mid;
l=mid+;
}
else r=mid-;
}
printf("%d",ans);
return ;
}
【Luogu】P2824排序(二分答案+线段树排序)的更多相关文章
- [BZOJ4552][TJOI2016&&HEOI2016]排序(二分答案+线段树/线段树分裂与合并)
解法一:二分答案+线段树 首先我们知道,对于一个01序列排序,用线段树维护的话可以做到单次排序复杂度仅为log级别. 这道题只有一个询问,所以离线没有意义,而一个询问让我们很自然的想到二分答案.先二分 ...
- bzoj 4552 [Tjoi2016&Heoi2016]排序 (二分答案 线段树)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4552 题意: 给你一个1-n的全排列,m次操作,操作由两种:1.将[l,r]升序排序,2 ...
- BZOJ 4552 [Tjoi2016&Heoi2016]排序 | 二分答案 线段树
题目链接 题面 题目描述 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这 ...
- 【BZOJ4552】【HEOI2016】排序 [二分答案][线段树]
排序 Time Limit: 60 Sec Memory Limit: 256 MB[Submit][Status][Discuss] Description 在2016年,佳媛姐姐喜欢上了数字序列 ...
- HDU 5649 DZY Loves Sorting(二分答案+线段树/线段树合并+线段树分割)
题意 一个 \(1\) 到 \(n\) 的全排列,\(m\) 种操作,每次将一段区间 \([l,r]\) 按升序或降序排列,求 \(m\) 次操作后的第 \(k\) 位. \(1 \leq n \le ...
- [HEOI2016/TJOI2016] 排序 解题报告(二分答案/线段树分裂合并+set)
题目链接: https://www.luogu.org/problemnew/show/P2824 题目描述: 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在 ...
- [BZOJ4552][Tjoi2016&Heoi2016]排序(二分答案+线段树)
二分答案mid,将>=mid的设为1,<mid的设为0,这样排序就变成了区间修改的操作,维护一下区间和即可 然后询问第q个位置的值,为1说明>=mid,以上 时间复杂度O(nlog2 ...
- YbtOJ#463-序列划分【二分答案,线段树,dp】
正题 题目链接:https://www.ybtoj.com.cn/problem/463 题目大意 给出长度为\(n\)的序列\(A,B\).要求划分成若干段满足 对于任何\(i<j\),若\( ...
- BZOJ_5343_[Ctsc2018]混合果汁_二分答案+主席树
BZOJ_5343_[Ctsc2018]混合果汁_二分答案+主席树 题意:给出每个果汁的价格p,美味度d,最多能放的体积l.定义果汁混合后的美味度为果汁的美味度的最小值. m次询问,要求花费不大于g, ...
随机推荐
- iOS 提交form表单,上传图片
之前不会用,总感觉很难,用后感觉不是太难,本文只是简单的讲一下怎么使用的, //实例话对象 AFHTTPSessionManager *manager = [AFHTTPSessionManager ...
- python_38_try-except异常处理语句及raise的使用
# i=10 # print(30/(i-10)) # #程序将会出现以下报错信息 # # Traceback (most recent call last): # # File "C:/U ...
- 纯js实现淘宝商城轮播图
需求: 循环无缝自动轮播3张图片,点击左右箭头可以手动切换图片,鼠标点击轮播图下面的小圆点会跳转到对应的第几张图片.鼠标放到轮播图的图片上时不再自动轮播,鼠标移开之后又继续轮播.效果图: 下面是htm ...
- CUDA入门需要知道的东西
CUDA刚学习不久,做毕业要用,也没时间研究太多的东西,我的博客里有一些我自己看过的东西,不敢保证都特别有用,但是至少对刚入门的朋友或多或少希望对大家有一点帮助吧,若果你是大牛请指针不对的地方,如果你 ...
- Java基础——动态代理
1.什么是动态代理? 简单的来说,就是本来让我自己做的事,请给别人来做,这个请的人就是代理对象 那么动态代理就是在程序运行过程中产生这个代理对象,而程序运行中产生的对象就是用反射的来生成一个代理. 举 ...
- 基于supersocket、C#对JT808协议进行解析构建gps监控平台服务端
GPS监控平台.车联网.物联网系统中GPRS网络数据的并发通讯和处理解析,主要功能有socket的UDP和TCP链路建立和维持,网络数据协议包接收与解析,分发上传到其他业务规则服务器,在物联网以及位置 ...
- oc字符串截取 数组字典运用
#define NSLog(FORMAT, ...) printf("%s\n", [[NSString stringWithFormat:FORMAT, ##__VA_ARGS_ ...
- win10如何修改host文件
首先找到host文件,一般位于:C:\Windows\System32\drivers\etc 之后用记事本打开,直接修改.保存txt文件到桌面. 最后删除后缀名,再粘贴回去就可以了.
- Zabbix监控oracle各服务器连接数
需求: 根据机器名查询oracle连接数,并通过zabbix进行监控 脚本: [root@rac1 Zabbix_S]# cat get_conns.py#!/usr/bin/python#codin ...
- 如何在 Linux 中配置基于密钥认证的 SSH
什么是基于 SSH 密钥的认证? 众所周知,Secure Shell,又称 SSH,是允许你通过无安全网络(例如 Internet)和远程系统之间安全访问/通信的加密网络协议.无论何时使用 SSH 在 ...