题目描述

在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位置上的数字。

输入输出样例

输入样例#1:

6 3
1 6 2 5 3 4
0 1 4
1 3 6
0 2 4
3
输出样例#1:

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]排序的更多相关文章

  1. BZOJ 4552: [Tjoi2016&Heoi2016]排序

    4552: [Tjoi2016&Heoi2016]排序 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 579  Solved: 322[Sub ...

  2. bzoj千题计划128:bzoj4552: [Tjoi2016&Heoi2016]排序

    http://www.lydsy.com/JudgeOnline/problem.php?id=4552 二分答案 把>=mid 的数看做1,<mid 的数看做0 这样升序.降序排列相当于 ...

  3. [Tjoi2016&Heoi2016]排序[01序列]

    4552: [Tjoi2016&Heoi2016]排序 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 994  Solved: 546[Sub ...

  4. 4552: [Tjoi2016&Heoi2016]排序

    4552: [Tjoi2016&Heoi2016]排序 链接 分析: 因为只询问一次,所以考虑二分这个数.显然是没有单调性的,但是我们可以二分所有大于等于mid的数中,是否有满足条件的x(而不 ...

  5. 【BZOJ4552】[Tjoi2016&Heoi2016]排序 二分+线段树

    [BZOJ4552][Tjoi2016&Heoi2016]排序 Description 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题 ...

  6. [bzoj4552][Tjoi2016][Heoi2016]排序

    Description 给出一个$1$到$n$的全排列,现在对这个全排列序列进行$m$次局部排序,排序分为$2$种: $1.(0,l,r)$表示将区间$[l,r]$的数字升序排序; $2.(1,l,r ...

  7. BZOJ4552: [Tjoi2016&Heoi2016]排序

    Description 在2016年,佳媛姐姐喜欢上了数字序列.因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题 ,需要你来帮助他.这个难题是这样子的:给出一个1到n的全排列,现在对这 ...

  8. [bzoj4552][Tjoi2016&Heoi2016]排序-二分+线段树

    Brief Description DZY有一个数列a[1..n],它是1∼n这n个正整数的一个排列. 现在他想支持两种操作: 0, l, r: 将a[l..r]原地升序排序. 1, l, r: 将a ...

  9. bzoj 4552 [Tjoi2016&Heoi2016]排序 (二分答案 线段树)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4552 题意: 给你一个1-n的全排列,m次操作,操作由两种:1.将[l,r]升序排序,2 ...

随机推荐

  1. C语言博客-指针

    一.PTA实验作业(5分) 题目1:6-1 两个4位正整数的后两位互换 1. 本题PTA提交列表 2. 设计思路 3.代码截图 4.本题调试过程碰到问题及PTA提交列表情况说明. 无 题目2:6-3 ...

  2. sql with as 用法-Z

    以下内容转自:http:.com/ 一.WITH AS的含义 WITH AS短语,也叫做子查询部分(subquery factoring),可以让你做很多事情,定义一个SQL片断,该SQL片断会被整个 ...

  3. 从0开始的LeetCode生活—461-Hamming Distance(汉明距离)

    题目: The Hamming distance between two integers is the number of positions at which the corresponding ...

  4. 【iOS】OC-时间转化的时区问题

    -(void)testTime{ NSDate *now = [NSDate date];//根据当前系统的时区产生当前的时间,绝对时间,所以同为中午12点,不同的时区,这个时间是不同的. NSDat ...

  5. nyoj n-1位数

    n-1位数 时间限制:3000 ms  |  内存限制:65535 KB 难度:1   描述 已知w是一个大于10但不大于1000000的无符号整数,若w是n(n≥2)位的整数,则求出w的后n-1位的 ...

  6. JavaScript 实现二叉树

    JavaScript 实现二叉树: // JavaScript 实现二叉树 function BinaryTree () { var Node = function (key) { this.key ...

  7. Linux系统把/home重新挂载到其他硬盘或分区

    一开始没有做好规划,导致/home空间不足,再加上分区表不是GPT,导致无法扩展超过2T,因此需要重新划分一块更大的硬盘给/home. 1.把新挂载的4T硬盘进行分区和格式化 2.创建目录 sudo ...

  8. SpringCloud的Hystrix(二) 某消费者应用(如:ui、网关)访问的多个微服务的断路监控

    一.验证断路保护监控是否管理多个消费者 app 1.第1个消费者应用:访问自己封装rest服务 saleProd 2.第2个消费者应用:第二个应用没有反应 说明 1.每个应用实例的断路保护机制,只对本 ...

  9. Docker学习笔记 - Docker的基本概念

    一.cs架构 Docker客户端:本地或远程 Docker服务端:守护进程Docker Daemon 二.基本概念 Docker镜像:打包阶段,层叠的只读文件系统,引导->root(ubuntu ...

  10. GIT入门笔记(5)- 创建版本库

    版本库又名仓库,英文名repository,可以简单理解成一个目录, 这个目录里面的所有文件都可以被Git管理起来,每个文件的修改.删除,Git都能跟踪,以便任何时刻都可以追踪历史,或者在将来某个时刻 ...