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 < ...
随机推荐
- 机器学习:集成学习(OOB 和 关于 Bagging 的更多讨论)
一.oob(Out - of - Bag) 定义:放回取样导致一部分样本很有可能没有取到,这部分样本平均大约有 37% ,把这部分没有取到的样本称为 oob 数据集: 根据这种情况,不对数据集进行 t ...
- 第 十六 课 Map
Map 是一种无序的键值对的集合 var mymap map[string]string //先声明一个字典(map)名字叫做mymap,其key所对应的数据类型是string[字符串],value所 ...
- Spring学习十 rest
1: Web service: 是一个大的概念范畴,它表现了一种设计思想 SOAP 是 Web service 的一个重要组成部份. SOAP 是一种协议而非详细产品.SOAP 是通过 XML ...
- Microsoft Sync Framework下的快速开发同步程序
Microsoft Sync Frameworks简称MSF,是一个综合的同步平台,MSF支持应用程序,服务,设备的在线以及离线同步.MSF主要有以下几个部件组成: * Sync Servic ...
- 开发环境入门 linux基础 (部分)while for 函数 计划任务
while循环 while do 动作 done 需要无限循环时我们会选择while : echo -e 格式处理,将\n的意义不变. exit 指退出执行程序 break 指跳出本层循环 conti ...
- 11-13SQLserver基础--数据库之事务
事务 定义:在远程操作时,都要经过两步操作,先删除后插入或者先插入后删除,都要调用两次数据库,为了保证数据库的完整性,只要流程运转过程中,只要有一步操作未成功,自动复原,回到流程刚开始的地方.实际上是 ...
- 类型:.net;问题:ASP.NET路由;结果:ASP.NET 路由 .NET Framework 4
ASP.NET 路由 .NET Framework 4 更新:2007 年 11 月 ASP.NET 路由使您可以使用不必映射到网站中特定文件的 URL.由于 URL 不必映射到文件,所以可以在 ...
- 部署和调优 1.6 vsftp部署和优化-2
映射个虚拟用户 创建个用户,不让他登录 useradd virftp -s /sbin/nologin 创建存放虚拟用户用户和密码的文件 vim /etc/vsftpd/vsftpd_login 写入 ...
- DAY7-面向对象之封装
一.引子 从封装本身的意思去理解,封装就好像是拿来一个麻袋,把小猫,小狗,小王八,还有alex一起装进麻袋,然后把麻袋封上口子.照这种逻辑看,封装=‘隐藏’,这种理解是相当片面的 二.先看如何隐藏 在 ...
- 向vsftp服务器上传文件报“550 Permission denied”错误的解决办法
上传文件: ftp> mput db.iso 550 Permission denied 原因:vsftp默认配置不允许上传文件. 解决:修改/etc/vsftpd.conf 将“write_e ...