#2055. 「TJOI / HEOI2016」排序

 

题目描述

在 2016 年,佳媛姐姐喜欢上了数字序列。因而他经常研究关于序列的一些奇奇怪怪的问题,现在他在研究一个难题,需要你来帮助他。

这个难题是这样子的:给出一个 1 11 到 n nn 的全排列,现在对这个全排列序列进行 m mm 次局部排序,排序分为两种:

  1. (0,l,r) (0, l, r)(0,l,r) 表示将区间 [l,r] [l, r][l,r] 的数字升序排序
  2. (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≤10​5​​)。
第二行为 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」排序的更多相关文章

  1. 【LOJ】#2055. 「TJOI / HEOI2016」排序

    题解 看错题了,我以为是询问Q是个数字,问它在哪个位置 我一想这不直接01序列搞一下就好了嘛(事实上是012) 然后呢,我发现样例没过. 啊我看错题了,问的是Q这个位置是啥-- 哦,套用我之前的想法不 ...

  2. loj#2054. 「TJOI / HEOI2016」树

    题目链接 loj#2054. 「TJOI / HEOI2016」树 题解 每次标记覆盖整棵字数,子树维护对于标记深度取max dfs序+线段树维护一下 代码 #include<cstdio> ...

  3. 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 ...

  4. loj#2059. 「TJOI / HEOI2016」字符串 sam+线段树合并+倍增

    题意:给你一个子串,m次询问,每次给你abcd,问你子串sa-b的所有子串和子串sc-d的最长公共前缀是多长 题解:首先要求两个子串的最长公共前缀就是把反过来插入变成最长公共后缀,两个节点在paren ...

  5. loj2055 「TJOI / HEOI2016」排序

    ref #include <iostream> #include <cstring> #include <cstdio> using namespace std; ...

  6. AC日记——#2057. 「TJOI / HEOI2016」游戏 LOJ

    #2057. 「TJOI / HEOI2016」游戏 思路: 最大流: 代码: #include <cstdio> #include <cstring> #include &l ...

  7. 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 ...

  8. 「TJOI / HEOI2016」字符串

    「TJOI / HEOI2016」字符串 题目描述 佳媛姐姐过生日的时候,她的小伙伴从某东上买了一个生日礼物.生日礼物放在一个神奇的箱子中.箱子外边写了一个长为 \(n\) 的字符串 \(s\),和 ...

  9. AC日记——#2054. 「TJOI / HEOI2016」树

    #2054. 「TJOI / HEOI2016」树 思路: 线段树: 代码: #include <cstdio> #include <cstring> #include < ...

随机推荐

  1. (转)NHibernate之Generator主键生成方式

    本文转载自:http://www.cnblogs.com/lemon-love/archive/2010/03/10/1683058.html (1) assigned主键由外部程序负责生成,无需NH ...

  2. Struts2中web.xml里面struts-cleanup作用

    struts2.1.3之后的版本均不需要配置该过滤器 参考: struts-cleanup作用 升级到struts-2.3.14.3之后涉及的改动以及ActionContextCleanUp,Stru ...

  3. spring 学习二 @RequestMapping

    RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上.用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径. RequestMapping注解有六个属性,下面我们把她 ...

  4. java 多线程系列基础篇(一)

    多线程状态图: Thread类的两个方法比较: yield方法: Yield是一个静态的原生(native)方法 Yield告诉当前正在执行的线程把运行机会交给线程池中拥有相同优先级的线程. Yiel ...

  5. Java 对密码MD5

    MD5,即"Message-Digest Algorithm 5(信息-摘要算法)": MD5将任意长度的“字节串”变换成一个128bit的大整数,并且它是一个不可逆的字符串变换算 ...

  6. 关于Bundle对象的思考

    在开发过程中,我们经常使用bundle对象来携带二进制数据,通过INTENT传递出去,那么BUNDLE对象到底是什么?其结构如何? 简要来说,bundle对象类似于一个map,内部是通过<key ...

  7. [Elasticsearch2.x] 多字段搜索 (一) - 多个及单个查询字符串 <译>

    多字段搜索(Multifield Search) 本文翻译自官方指南的Multifield Search一章. 查询很少是只拥有一个match查询子句的查询.我们经常需要对一个或者多个字段使用相同或者 ...

  8. [chmod]linux中给文件增加权限

    chmod命令 1.chmod u+x file.sh 2.sudo chmod 777  文件名 注: 如果给所有人添加可执行权限:chmod a+x 文件名:如果给文件所有者添加可执行权限:chm ...

  9. C++——static

    1.第一条也是最重要的一条:隐藏.(static函数,static变量均可) 所有未加static前缀的全局变量和函数都具有全局可见性:加static前缀的全局变量和函数只有有局部可见性: //a.c ...

  10. OpenNi安装示例

    1.下载OpenNi  https://structure.io/openni 解压,点击运行 选择安装目录,默认即可 安装过程中有弹框,选择 安装 点击 完成 在相应的安装目录下即可找到