loj #2055. 「TJOI / HEOI2016」排序
#2055. 「TJOI / HEOI2016」排序
题目描述
在 2016 年,佳媛姐姐喜欢上了数字序列。因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他。
这个难题是这样子的:给出一个 1 11 到 n nn 的全排列,现在对这个全排列序列进行 m mm 次局部排序,排序分为两种:
- (0,l,r) (0, l, r)(0,l,r) 表示将区间 [l,r] [l, r][l,r] 的数字升序排序
- (1,l,r) (1, l ,r)(1,l,r) 表示将区间 [l,r] [l, r][l,r] 的数字降序排序
排序后询问第 q qq 位置上的数字。
输入格式
输入数据的第一行为两个整数 n nn 和 m mm。n nn 表示序列的长度,m mm 表示局部排序的次数 (1≤n,m≤1051 \leq n, m \leq 10^51≤n,m≤105)。
第二行为 n nn 个整数,表示 1 11 到 n nn 的一个全排列。
接下来输入 m mm 行,每一行有三个整数 op,l,r\text{op}, l, rop,l,r, op\text{op}op 为 0 代表升序排序,op\text{op}op 为 1 代表降序排序, l,rl, rl,r 表示排序的区间。
最后输入一个整数 qqq,qqq 表示排序完之后询问的位置,1≤q≤n1 \leq q \leq n1≤q≤n。
输出格式
输出数据仅有一行,一个整数,表示按照顺序将全部的部分排序结束后第 q qq 位置上的数字。
样例
样例输入
6 3
1 6 2 5 3 4
0 1 4
1 3 6
0 2 4
3
样例输出
5
二分p位置上的值
小于p的为0,大于p的为1
线段树支持区间修改,查询区间0的个数
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 100010
using namespace std;
int a[maxn],n,m;
bool cmp(int x,int y){return x>y;}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%d",&a[i]);
int op,l,r;
while(m--){
scanf("%d%d%d",&op,&l,&r);
if(op==) sort(a+l,a+r+,cmp);
if(op==) sort(a+l,a+r+);
}
int q;scanf("%d",&q);
cout<<a[q];
}
80分 暴力
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 100010
using namespace std;
int a[maxn],sum[maxn*],set[maxn*],ask[maxn][];
bool bz[maxn*];
int t,n,m,p;
void mark(int k,int l,int r,int v){
sum[k]=(v?:r-l+);
set[k]=v;
bz[k]=;
}
void pushdown(int k,int l,int r){
int mid=(l+r)>>;
if(bz[k]){
mark(k<<,l,mid,set[k]);
mark(k<<|,mid+,r,set[k]);
bz[k]=;
}
}
void modify(int k,int l,int r,int opl,int opr,int v){
if(opl>opr)return;
if(l==opl&&r==opr){mark(k,l,r,v);return;}
pushdown(k,l,r);
int mid=(l+r)>>;
if(opr<=mid)modify(k<<,l,mid,opl,opr,v);
else if(opl>mid)modify(k<<|,mid+,r,opl,opr,v);
else modify(k<<,l,mid,opl,mid,v),modify(k<<|,mid+,r,mid+,opr,v);
sum[k]=sum[k<<]+sum[k<<|];
}
int query(int k,int l,int r,int opl,int opr){
if(l>=opl&&r<=opr)return sum[k];
pushdown(k,l,r);
int mid=(l+r)>>,res=;
if(opl<=mid)res+=query(k<<,l,mid,opl,opr);
if(opr>mid)res+=query(k<<|,mid+,r,opl,opr);
return res;
}
bool check(int x){
for(int i=;i<=n;i++)
if(a[i]<x)modify(,,n,i,i,);
else modify(,,n,i,i,);
for(int i=;i<=m;i++){
t=query(,,n,ask[i][],ask[i][]);
if(ask[i][]){
modify(,,n,ask[i][],ask[i][]-t,);
modify(,,n,ask[i][]-t+,ask[i][],);
}
else {
modify(,,n,ask[i][],ask[i][]+t-,);
modify(,,n,ask[i][]+t,ask[i][],);
}
}
return !query(,,n,p,p);
}
int main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)scanf("%d",&a[i]);
for(int i=;i<=m;i++)
scanf("%d%d%d",&ask[i][],&ask[i][],&ask[i][]);
scanf("%d",&p);
int l=,r=n,ans=;
while(l<=r){
int mid=(l+r)>>;
if(check(mid))l=mid+,ans=mid;
else r=mid-;
}
printf("%d",ans);
}
100分 线段树+二分答案
loj #2055. 「TJOI / HEOI2016」排序的更多相关文章
- 【LOJ】#2055. 「TJOI / HEOI2016」排序
题解 看错题了,我以为是询问Q是个数字,问它在哪个位置 我一想这不直接01序列搞一下就好了嘛(事实上是012) 然后呢,我发现样例没过. 啊我看错题了,问的是Q这个位置是啥-- 哦,套用我之前的想法不 ...
- loj#2054. 「TJOI / HEOI2016」树
题目链接 loj#2054. 「TJOI / HEOI2016」树 题解 每次标记覆盖整棵字数,子树维护对于标记深度取max dfs序+线段树维护一下 代码 #include<cstdio> ...
- LOJ #2058「TJOI / HEOI2016」求和
不错的推柿子题 LOJ #2058 题意:求$\sum\limits_{i=0}^n\sum\limits_{j=0}^nS(i,j)·2^j·j!$其中$ S(n,m)$是第二类斯特林数 $ Sol ...
- loj#2059. 「TJOI / HEOI2016」字符串 sam+线段树合并+倍增
题意:给你一个子串,m次询问,每次给你abcd,问你子串sa-b的所有子串和子串sc-d的最长公共前缀是多长 题解:首先要求两个子串的最长公共前缀就是把反过来插入变成最长公共后缀,两个节点在paren ...
- loj2055 「TJOI / HEOI2016」排序
ref #include <iostream> #include <cstring> #include <cstdio> using namespace std; ...
- AC日记——#2057. 「TJOI / HEOI2016」游戏 LOJ
#2057. 「TJOI / HEOI2016」游戏 思路: 最大流: 代码: #include <cstdio> #include <cstring> #include &l ...
- loj2058 「TJOI / HEOI2016」求和 NTT
loj2058 「TJOI / HEOI2016」求和 NTT 链接 loj 思路 \[S(i,j)=\frac{1}{j!}\sum\limits_{k=0}^{j}(-1)^{k}C_{j}^{k ...
- 「TJOI / HEOI2016」字符串
「TJOI / HEOI2016」字符串 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了一个长为 \(n\) 的字符串 \(s\),和 ...
- AC日记——#2054. 「TJOI / HEOI2016」树
#2054. 「TJOI / HEOI2016」树 思路: 线段树: 代码: #include <cstdio> #include <cstring> #include < ...
随机推荐
- iOS消息转发机制
iOS消息转发机制 “消息派发系统”(message-dispatch system) 若想令类能够理解某条消息,我们必须实现出对应的方法才行.但是,在编译器向类发送其无法解读的消息时并不会报错,因为 ...
- Vue开发模板简介
1. 传统发开模式的问题 用传统模式引用vue.js以及其他的js文件的开发方式,会产生一些问题. 基于页面的开发模式:传统的引用vue.js以及其他的js文件的开发方式,限定了我们的开发模式是 ...
- linux yum 脚本实现
yum 位于linux /usr/bin/yum yum命令是python脚本进行编写的(python 2.6) #!/usr/bin/python2.6 import sys try: import ...
- Java 的标识符
标识符: 在写代码的时候为了增强代码的阅读性会自定义很多名字,如:类名.方法名.变量名等 这种名称成为标识符 标识符命名规则: 由字母(可以是中文).数字.下划线.$ 组成,但不能以数字开头 大小写敏 ...
- Drools学习笔记4—Consequence/RHS
Right Hand Side,当LHS所有条件满足才会执行 可以使用LHS部分定义的绑定变量.全局变量.或者直接编写JAVA代码. 提供宏函数操作working memory fact对象,如ins ...
- php字符型转整型
$arr = array(0=>1,"aa"=>2, 3, 4); foreach($arr as $key=>$val){ print($key == &quo ...
- python ConfigParser 读取配置文件
- 如何设置select下拉禁止选择
转自:https://blog.csdn.net/you23hai45/article/details/52233207
- 部署和调优 1.9 samba 部署和优化-3
实践2 要求:共享一个目录,使用用户名和密码登录后才可以访问,要求可以读写 打开配置文件 vim /etc/samba/smb.conf 改为security = user 在最后面增加一段 [den ...
- Solr查询错误
报错: Exception in thread "main" java.lang.VerifyError: Bad return type Exception Details: L ...