题目描述

在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. beta冲刺6-咸鱼

    前言:此篇是补昨天凌晨的.后面有更新但是太晚了就没有即使更新.所以现在过来更新一下. 昨天的未完成: 用户测试+测试报告 目前剩下的功能点:输入内容检测 我的社团输出显示格式调整. 今天的完成: 我的 ...

  2. 实验四Java Android简易开发

    实验准备 Android Studio下载 Android Studio安装 实验内容 Android Stuidio的安装测试 Android Stuidio的安装测试: 参考<Java和An ...

  3. 1013团队alpha冲刺日志集合帖

    alpha冲刺day1 alpha冲刺day2 alpha冲刺day3 alpha冲刺day4 alpha冲刺day5 alpha冲刺day6 alpha冲刺day7 alpha冲刺day8 alph ...

  4. C语言--第一周作业(更改)

    *********************学习总结********************* 1.所用词典: 2.Git截图: *********************遇到的问题和解决方法***** ...

  5. Django 博客

    blogproject/blogproject/settings.py ## 其它配置代码... # 把英文改为中文 LANGUAGE_CODE = 'zh-hans' # 把国际时区改为中国时区 T ...

  6. 【iOS】OC-UTC日期字符串格式化

    NSLog(@"%@",[NSDate date]); NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init ...

  7. 日志 --BUG记录

    2014-12-15日 在做520wawa的免费推广   部署web应用时 错把path设置为"/*",导致启动tomcat时,导致错误 <Context path=&quo ...

  8. TOTP算法 基于时间的一次性密码

    /** Copyright (c) 2011 IETF Trust and the persons identified as authors of the code. All rights rese ...

  9. MySql数据库的常用命令

    1.连接Mysql 连接本地的mysql数据库 :   mysql -u root -p    (回车之后会提示输入密码) 连接远程主机的mysql数据库 : 假设远程主机的IP为:110.110.1 ...

  10. hp MSA50 5盘RAID5重建为4盘RAID5怎么恢复数据

    [用户单位] XX省电视台[数据恢复故障描述] 一台HP 服务器,挂接一台HP MSA50磁盘阵列,内接5块1TB硬盘,原先结构为RAID5. 使用一段时间后,其中一块硬盘掉线,因RAID5支持一块硬 ...