[HEOI2016]排序
题目描述
在2016年,佳媛姐姐喜欢上了数字序列。因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他。这个难题是这样子 的:给出一个1到n的全排列,现在对这个全排列序列进行m次局部排序,排序分为两种:1:(0,l,r)表示将区间[l,r]的数字升序排序2: (1,l,r)表示将区间[l,r]的数字降序排序最后询问第q位置上的数字。
输入输出格式
输入格式:
输入数据的第一行为两个整数n和m。n表示序列的长度,m表示局部排序的次数。1 <= n, m <=
10^5第二行为n个整数,表示1到n的一个全排列。接下来输入m行,每一行有三个整数op, l, r,
op为0代表升序排序,op为1代表降序排序, l, r 表示排序的区间。最后输入一个整数q,q表示排序完之后询问的位置, 1 <= q
<= n。1 <= n <= 10^5,1 <= m <= 10^5
输出格式:
输出数据仅有一行,一个整数,表示按照顺序将全部的部分排序结束后第q位置上的数字。
输入输出样例
6 3
1 6 2 5 3 4
0 1 4
1 3 6
0 2 4
3
5
二分一个答案mid
然后用线段树维护每一位是否大于mid,大于为1,小于为0
最后如果第q位为1,那么说明答案大于mid
至于两个操作,可以简单的用线段树实现
对于1操作:
首先求出区间内1的数量cnt1,0的数量cnt2
按升序排序显然就是把所有1放到区间右边,0放左边
也就是update(l,l+cnt2-1,0),update(l+cnt2,r,1)
2操作类推
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
struct Node
{
int opt,l,r;
}ask[];
int c[],lazy[],n,m,q,a[];
void pushup(int rt)
{
c[rt]=c[rt*]+c[rt*+];
}
void build(int rt,int l,int r,int x)
{
if (l==r)
{
c[rt]=(a[l]>=x);
return;
}
int mid=(l+r)/;
build(rt*,l,mid,x);
build(rt*+,mid+,r,x);
pushup(rt);
}
void pushdown(int rt,int l,int r,int mid)
{
if (lazy[rt]==)
{
lazy[rt*]=;
lazy[rt*+]=;
c[rt*]=;
c[rt*+]=;
lazy[rt]=-;
}
if (lazy[rt]==)
{
lazy[rt*]=;
lazy[rt*+]=;
c[rt*]=mid-l+;
c[rt*+]=r-mid;
lazy[rt]=-;
}
}
void update(int rt,int l,int r,int L,int R,int d)
{
if (L>R) return ;
if (l>=L&&r<=R)
{
if (d==) c[rt]=,lazy[rt]=;
else c[rt]=r-l+,lazy[rt]=;
return;
}
int mid=(l+r)/;
pushdown(rt,l,r,mid);
if (L<=mid) update(rt*,l,mid,L,R,d);
if (R>mid) update(rt*+,mid+,r,L,R,d);
pushup(rt);
}
int query(int rt,int l,int r,int L,int R)
{
if (l>=L&&r<=R)
{
return c[rt];
}
int mid=(l+r)/;
pushdown(rt,l,r,mid);
int s=;
if (L<=mid) s+=query(rt*,l,mid,L,R);
if (R>mid) s+=query(rt*+,mid+,r,L,R);
pushup(rt);
return s;
}
bool check(int mid)
{int i;
memset(c,,sizeof(c));
memset(lazy,-,sizeof(lazy));
build(,,n,mid);
for (i=;i<=m;i++)
{
int l=ask[i].l,r=ask[i].r;
int cnt1=query(,,n,l,r);
int cnt2=r-l+-cnt1;
if (ask[i].opt==)
{
update(,,n,l,l+cnt2-,);
update(,,n,l+cnt2,r,);
}
else
{
update(,,n,l,l+cnt1-,);
update(,,n,l+cnt1,r,);
}
}
return query(,,n,q,q);
}
int main()
{int i;
cin>>n>>m;
for (i=;i<=n;i++)
scanf("%d",&a[i]);
for (i=;i<=m;i++)
scanf("%d%d%d",&ask[i].opt,&ask[i].l,&ask[i].r);
cin>>q;
int l=,r=n,ans;
while (l<=r)
{
int mid=(l+r)/;
if (check(mid)) ans=mid,l=mid+;
else r=mid-;
}
cout<<ans;
}
[HEOI2016]排序的更多相关文章
- BZOJ 4552: [Tjoi2016&Heoi2016]排序
		
4552: [Tjoi2016&Heoi2016]排序 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 579 Solved: 322[Sub ...
 - bzoj千题计划128:bzoj4552: [Tjoi2016&Heoi2016]排序
		
http://www.lydsy.com/JudgeOnline/problem.php?id=4552 二分答案 把>=mid 的数看做1,<mid 的数看做0 这样升序.降序排列相当于 ...
 - [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]排序 二分+线段树
		
[BZOJ4552][Tjoi2016&Heoi2016]排序 Description 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题 ...
 - [bzoj4552][Tjoi2016][Heoi2016]排序
		
Description 给出一个$1$到$n$的全排列,现在对这个全排列序列进行$m$次局部排序,排序分为$2$种: $1.(0,l,r)$表示将区间$[l,r]$的数字升序排序; $2.(1,l,r ...
 - BZOJ4552: [Tjoi2016&Heoi2016]排序
		
Description 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题 ,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这 ...
 - [bzoj4552][Tjoi2016&Heoi2016]排序-二分+线段树
		
Brief Description DZY有一个数列a[1..n],它是1∼n这n个正整数的一个排列. 现在他想支持两种操作: 0, l, r: 将a[l..r]原地升序排序. 1, l, r: 将a ...
 - bzoj 4552 [Tjoi2016&Heoi2016]排序 (二分答案  线段树)
		
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4552 题意: 给你一个1-n的全排列,m次操作,操作由两种:1.将[l,r]升序排序,2 ...
 
随机推荐
- 团队作业2:需求分析&原型设计
			
Deadline: 2017-11-5 22:00PM,以博客发表日期为准. 评分基准: 按时交 - 有分,检查的项目包括后文的三个方面 需求分析 原型设计 编码规范 晚交 - 0分 迟交两周以 ...
 - C语言——第二次作业
			
**学习内容总结** 本周是国庆假期,学习了mooc相关课程.阅读了<提问的智慧>一文. 文章总结 1.在提问之前,要利用身边的资源(例如相关资料.FAQ.浏览器搜索)试着自己寻找答案,或 ...
 - python 进程复习
			
import os import time ret = os.fork() # 创建子线程 if ret ==0: # 子进程中返回值为0,父进程>0 while True: print('.. ...
 - OSI七层协议模型、TCP/IP四层模型学习笔记
			
1. OSI七层和TCP/IP四层的关系 1.1 OSI引入了服务.接口.协议.分层的概念,TCP/IP借鉴了OSI的这些概念建立TCP/IP模型. 1.2 OSI先有模型,后有协议,先有标准,后进行 ...
 - 一、Django的基本用法
			
学习Django有一段时间了,整理一下,充当笔记. MVC 大部分开发语言中都有MVC框架 MVC框架的核心思想是:解耦 降低各功能模块之间的耦合性,方便变更,更容易重构代码,最大程度上实现代码的重用 ...
 - MySQL搭建主从数据库 实现读写分离
			
首先声明,实际生产中,网站为了提高用户体验,性能等,将数据库实现读写分离是有必要的,我们让主数据库去写入数据,然后当用户查询的时候,然后在从数据库读取数据,故能减轻数据库的压力,实现良好的用户体验! ...
 - 【原创】Webpack构建中hash的优化
			
背景: SPA的vue应用,采用webpack2构建,打包入口为main.js 输出:main模块打包成app.js,公共lib打包成vendor.js,公共样式打包成app.css,运行时依赖打包成 ...
 - Python format 格式化函数
			
str.format() 格式化字符串的函数 str.format(),它增强了字符串格式化的功能. 基本语法是通过 {} 和 : 来代替以前的 % format 函数可以接受不限个参数,位置可以不按 ...
 - ios开发常识(1)开发语言和参考资料
			
学iphone开发用的语言是object-c,object-c和c++,java还是有很大区别,如果你坚持学习iphone开发的话可以不学c++,java,直接学习这个语言,先入为主,可能觉得这个语言 ...
 - matlab等高线绘制
			
参考代码: figure;// Figure建立新的图形 z=double(z); x=1:length(z); y=x; [X2,Y2]=meshgrid(x,y); subplot(121); [ ...