http://www.lydsy.com/JudgeOnline/problem.php?id=4552

二分答案

把>=mid 的数看做1,<mid 的数看做0

这样升序、降序排列相当于区间查询0,1 的个数,区间覆盖0,1

线段树即可完成

查询给定位置p

如果=1,说明p位置的数>=mid ,上调下界

如果=0,说明p位置的数<mid,下调上界

#include<cstdio>
#include<iostream>
#include<algorithm> using namespace std; #define N 100001 int n,m,p; int a[N],MID; int sum0[N<<],sum1[N<<],flag[N<<]; int tot0,tot1; struct node
{
int ty,l,r;
}e[N]; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} void build(int k,int l,int r)
{
sum0[k]=sum1[k]=;
flag[k]=-;
if(l==r)
{
if(a[l]>=MID) sum1[k]++;
else sum0[k]++;
return;
}
int mid=l+r>>;
build(k<<,l,mid);
build(k<<|,mid+,r);
sum0[k]=sum0[k<<]+sum0[k<<|];
sum1[k]=sum1[k<<]+sum1[k<<|];
} void down(int k,int l,int mid,int r)
{
if(!flag[k])
{
sum0[k<<]=mid-l+;
sum1[k<<]=;
sum0[k<<|]=r-mid;
sum1[k<<|]=;
}
else
{
sum1[k<<]=mid-l+;
sum0[k<<]=;
sum1[k<<|]=r-mid;
sum0[k<<|]=;
}
flag[k<<]=flag[k<<|]=flag[k];
flag[k]=-;
} void query(int k,int l,int r,int opl,int opr)
{
if(l>=opl && r<=opr)
{
tot0+=sum0[k];
tot1+=sum1[k];
return;
}
int mid=l+r>>;
if(flag[k]!=-) down(k,l,mid,r);
if(opl<=mid) query(k<<,l,mid,opl,opr);
if(opr>mid) query(k<<|,mid+,r,opl,opr);
} void change(int k,int l,int r,int opl,int opr,int ty)
{
if(l>=opl && r<=opr)
{
if(!ty)
{
sum0[k]=r-l+;
sum1[k]=;
}
else
{
sum0[k]=;
sum1[k]=r-l+;
}
flag[k]=ty;
return;
}
int mid=l+r>>;
if(flag[k]!=-) down(k,l,mid,r);
if(opl<=mid) change(k<<,l,mid,opl,opr,ty);
if(opr>mid) change(k<<|,mid+,r,opl,opr,ty);
sum0[k]=sum0[k<<]+sum0[k<<|];
sum1[k]=sum1[k<<]+sum1[k<<|];
} int ask(int k,int l,int r,int pos)
{
if(l==r) return sum1[k];
int mid=l+r>>;
if(flag[k]!=-) down(k,l,mid,r);
if(pos<=mid) return ask(k<<,l,mid,pos);
return ask(k<<|,mid+,r,pos);
} bool check(int mid)
{
MID=mid;
build(,,n);
for(int i=;i<=m;++i)
{
tot0=tot1=;
query(,,n,e[i].l,e[i].r);
if(!e[i].ty)
{
if(tot0) change(,,n,e[i].l,e[i].l+tot0-,);
if(tot1) change(,,n,e[i].r-tot1+,e[i].r,);
}
else
{
if(tot1) change(,,n,e[i].l,e[i].l+tot1-,);
if(tot0) change(,,n,e[i].r-tot0+,e[i].r,);
}
}
return ask(,,n,p);
} int main()
{
read(n); read(m);
for(int i=;i<=n;++i) read(a[i]);
for(int i=;i<=m;++i) read(e[i].ty),read(e[i].l),read(e[i].r);
read(p);
int l=,r=n,mid,ans;
while(l<=r)
{
mid=MID=l+r>>;
if(check(mid)) ans=mid,l=mid+;
else r=mid-;
}
cout<<ans;
}

4552: [Tjoi2016&Heoi2016]排序

Time Limit: 60 Sec  Memory Limit: 256 MB
Submit: 1478  Solved: 748
[Submit][Status][Discuss]

Description

在2016年,佳媛姐姐喜欢上了数字序列。因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题
,需要你来帮助他。这个难题是这样子的:给出一个1到n的全排列,现在对这个全排列序列进行m次局部排序,排
序分为两种:1:(0,l,r)表示将区间[l,r]的数字升序排序2:(1,l,r)表示将区间[l,r]的数字降序排序最后询问第q
位置上的数字。

Input

输入数据的第一行为两个整数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
 

Output

输出数据仅有一行,一个整数,表示按照顺序将全部的部分排序结束后第q位置上的数字。

Sample Input

6 3
1 6 2 5 3 4
0 1 4
1 3 6
0 2 4
3

Sample Output

5

bzoj千题计划128:bzoj4552: [Tjoi2016&Heoi2016]排序的更多相关文章

  1. bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块

    http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...

  2. 2018.08.01 BZOJ4552: [Tjoi2016&Heoi2016]排序(二分+线段树)

    传送门 线段树简单题. 二分答案+线段树排序. 实际上就是二分答案mid" role="presentation" style="position: relat ...

  3. bzoj千题计划196:bzoj4826: [Hnoi2017]影魔

    http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...

  4. bzoj千题计划190:bzoj4300: 绝世好题

    http://www.lydsy.com/JudgeOnline/problem.php?id=4300 f[i] 表示第i位&为1的最长长度 #include<cstdio> # ...

  5. bzoj千题计划121:bzoj1033: [ZJOI2008]杀蚂蚁antbuster

    http://www.lydsy.com/JudgeOnline/problem.php?id=1033 经半个下午+一个晚上+半个晚上 的 昏天黑地调代码 最终成果: codevs.洛谷.tyvj上 ...

  6. bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪

    http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...

  7. bzoj千题计划177:bzoj1858: [Scoi2010]序列操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...

  8. bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)

    https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...

  9. bzoj千题计划168:bzoj3513: [MUTC2013]idiots

    http://www.lydsy.com/JudgeOnline/problem.php?id=3513 组成三角形的条件:a+b>c 其中,a<c,b<c 若已知 两条线段之和=i ...

随机推荐

  1. 版本控制-Git对象

    Git对象 版本控制在于文件的控制,git的控制方法在于为每个文件生成(key,object)的结构.git利用sha-1加密算法,对每一个文件生成一个唯一的字符序列(明文大小不超过2^64位,对于普 ...

  2. 【learning】[待完善]关于辛普森公式的一点想法

    [吐槽] 嗯一开始接触到这个东西其实是因为某道凸包的题目好像可以用这个奇妙的方法来算 但其实了解也不是很深,只是觉得这个东西十分有意思, 所以先稍微写一下自己的想法,了解更多之后慢慢完善 [正题] 首 ...

  3. 关系型数据库工作原理-数据库整体框架(翻译自Coding-Geek文章)

    本文翻译自Coding-Geek文章:< How does a relational database work>.原文链接:http://coding-geek.com/how-data ...

  4. python 数据结构简介

    栈(stack) 定义: 数据集合,只能在一端(首尾)进行删除和插入的列表. 特点: 后进先出(LIFO) 典型作用: 括号匹配:左括号进栈,右括号跟左括号对应则出栈,例如:(({{[]}}))匹配 ...

  5. HTTP架构介绍(2) 缓存

    web缓存是自动复制所请求数据并将其保存在本地存储中的设备. 通过这样做, 可以实现: 减少网络流量 消除网络瓶颈 防止服务器超载 减少长距离的响应延迟 因此, 您可以清楚地说, web 缓存可提高用 ...

  6. C++实现控制台版2048

    前言 之前做过一个JavaScript版本的2048游戏,最近在学习C++,昨天晚上突然心血来潮,想用C++来实现,因为核心算法已十分理解,所以两个小时撸出来一个C++的简易版本. 简介 二维数组遍历 ...

  7. secureCRT的安装及破解

    secureCRT是我们平时都会用到的终端仿真程序,所谓是居家旅行必备神器啊,下面就说说怎么安装破解secureCRT. (网上有破解版和一些绿色版,感觉或多或少都有点问题,比如我用便携版就有问题,所 ...

  8. 发个2012年用java写的一个控制台小游戏

    时间是把杀狗刀 突然发现了12年用java写的控制台玩的一个文字游戏,有兴趣的可以下载试试哈汪~ 里面难点当时确实遇到过,在计算倒计时的时候用了多线程,当时还写了好久才搞定.很怀念那个时间虽然不会做游 ...

  9. Jenkins 部署 jmeter + Ant

    安装Jenkins: 到jenkins官网下载相应的jenkins版本: 双击jenkins.msi启动安装,安装目录选择D:\Progrom Files\Jenkins,然后启动成功. Jenkin ...

  10. Java jsoup爬取图片

    jsoup爬取百度瀑布流图片 是的,Java也可以做网络爬虫,不仅可以爬静态网页的图片,也可以爬动态网页的图片,比如采用Ajax技术进行异步加载的百度瀑布流. 以前有写过用Java进行百度图片的抓取, ...