#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. (转)Dynamic Web project转成Maven项目

    本文转载自:http://my.oschina.net/twosnail/blog/369125 1.新建Dynamic Web Project 1.File -> New -> Othe ...

  2. svn-clearup 报错的处理(Cleanup failed to process the following paths...)

    在使用 svn 客户端执行操作失败后,执行 Clean up 操作也报错:Cleanup failed to process the following paths... ,一直不知道是什么原因.通常 ...

  3. 引用 WCF 服务后,没有生成任何 .datasource?

    如题WCF服务生成成功,在添加服务引用的时候也不报错,但是添加完成之后不能正常调用服务借口. 在重新引用服务的时候,或者是是更新引用服务的时候,点“高级”按钮,在服务引用设置对话框中,将“重新使用引用 ...

  4. python selenium 滚动条处理、页面拖动

    selenium中没有直接控制滚动条的方法,可以使用方法:execute_script(),可以直接执行js的脚本. 一.竖向滚动条控制,三种方法总有一款适合你. 1.滚动条拉到最底: js=&quo ...

  5. oralce 记一次 External Procedure initial connection 处理

    1 环境 oracle 11.2.0.4 RAC(2 nodes),centos 6.8,实体机 2 问题 线上环境执行一条sql sql> select ST_AsText(ST_Geomet ...

  6. paramiko远程执行命令成功

  7. EF CODEFIRST WITH ORACLE

    摸索了半天,运行通过了,但是还是有一点坑的,对于初次使用的人来说,可能会遇到几个问题 首先安装两个dll 如果你已经下载好了dll Oracle.ManagedDataAccess.dll Oracl ...

  8. JavaScript 的异步和单线程

    问题 Q:下面的代码是否能满足sleep效果? var t = true; setTimeout(function(){ t = false; }, 1000); while(t){ } alert( ...

  9. SQL语句兼容性规范

    一.DDL兼容性规范(防止表结构变更后,原有的SQL执行报错)只能增加字段或修改字段长度(字段长度改大),不能修改字段名字和类型,不能删除字段不能删除表或者修改表名称 二.DML兼容性规范insert ...

  10. 生产者与消费者-1:N-基于list

    一个生产者/多个消费者: /** * 生产者 */ public class P { private MyStack stack; public P(MyStack stack) { this.sta ...