很久以前写过二分答案离线的做法,比较好理解。事实上这还是一个线段树合并+分裂的板子题,相比离线做法以更优的复杂度做了更多的事情。具体不说了。怎么交了一遍luogu上就跑第一了啊

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#include<set>
using namespace std;
#define N 100010
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
int n,m,root[N],rev[N],cnt;
struct data{int l,r,x;
}tree[N<<];
struct data2
{
int l,r;
bool operator <(const data2&a) const
{
return r<a.r;
}
};
set<data2> q;
void ins(int &k,int x,int l,int r)
{
if (!k) k=++cnt;tree[k].x++;
if (l==r) return;
int mid=l+r>>;
if (x<=mid) ins(tree[k].l,x,l,mid);
else ins(tree[k].r,x,mid+,r);
}
void split(int &x,int &y,int rk,int op)
{
if (!x) return;
tree[y=++cnt].x=tree[x].x-rk,tree[x].x=rk;
if (op==)
{
if (tree[tree[x].l].x==rk)
{
tree[y].r=tree[x].r,tree[x].r=;
return;
}
else if (tree[tree[x].l].x>rk)
{
tree[y].r=tree[x].r,tree[x].r=;
split(tree[x].l,tree[y].l,rk,op);
}
else split(tree[x].r,tree[y].r,rk-tree[tree[x].l].x,op);
}
else
{
if (tree[tree[x].r].x==rk)
{
tree[y].l=tree[x].l,tree[x].l=;
return;
}
else if (tree[tree[x].r].x>rk)
{
tree[y].l=tree[x].l,tree[x].l=;
split(tree[x].r,tree[y].r,rk,op);
}
else split(tree[x].l,tree[y].l,rk-tree[tree[x].r].x,op);
}
}
void merge(int &x,int &y,int l,int r)
{
if (!x||!y) {x|=y;return;}
tree[x].x+=tree[y].x;
if (l<r)
{
int mid=l+r>>;
merge(tree[x].l,tree[y].l,l,mid);
merge(tree[x].r,tree[y].r,mid+,r);
}
}
int query(int k,int l,int r,int x,int op)
{
if (l==r) return l;
int mid=l+r>>;
if (op==)
{
if (tree[tree[k].l].x>=x) return query(tree[k].l,l,mid,x,op);
else return query(tree[k].r,mid+,r,x-tree[tree[k].l].x,op);
}
else
{
if (tree[tree[k].r].x>=x) return query(tree[k].r,mid+,r,x,op);
else return query(tree[k].l,l,mid,x-tree[tree[k].r].x,op);
}
}
void print(int k,int l,int r)
{
if (!tree[k].x) return;
if (l==r) {cout<<l<<' ';return;}
int mid=l+r>>;
print(tree[k].l,l,mid),print(tree[k].r,mid+,r);
}
int main()
{
n=read(),m=read();
for (int i=;i<=n;i++) ins(root[i],read(),,n),q.insert((data2){i,i});
while (m--)
{
int op=read(),l=read(),r=read();
set<data2>::iterator it=q.lower_bound((data2){l,l});
if ((*it).l<l)
{
split(root[(*it).l],root[l],l-(*it).l,rev[(*it).l]);
int L=(*it).l,R=(*it).r;
q.erase(it);
q.insert((data2){L,l-});
q.insert((data2){l,R});
rev[l]=rev[L];
}
it=q.lower_bound((data2){r+,r+});
if (it!=q.end()&&(*it).l<=r)
{
split(root[(*it).l],root[r+],r-(*it).l+,rev[(*it).l]);
int L=(*it).l,R=(*it).r;
q.erase(it);
q.insert((data2){L,r});
q.insert((data2){r+,R});
rev[r+]=rev[L];
}
it=q.lower_bound((data2){l,l});it++;
while (it!=q.end()&&(*it).r<=r) merge(root[l],root[(*it).l],,n),it++;
it=q.lower_bound((data2){l,l});
while (it!=q.end()&&(*it).r<=r) q.erase(it),it=q.lower_bound((data2){l,l});
q.insert((data2){l,r});
rev[l]=op;
//it=q.begin();while (it!=q.end()) cout<<(*it).l<<' '<<(*it).r<<" ",print(root[(*it).l],1,n),it++,cout<<endl;cout<<endl;
//it=q.begin();while (it!=q.end()) cout<<(*it).l<<' '<<(*it).r<<endl,it++;cout<<endl;
}
int x=read();
set<data2>::iterator it=q.lower_bound((data2){x,x});
cout<<query(root[(*it).l],,n,x-(*it).l+,rev[(*it).l]);
/*for (int x=1;x<=n;x++)
{
set<data2>::iterator it=q.lower_bound((data2){x,x});
cout<<query(root[(*it).l],1,n,x-(*it).l+1,rev[(*it).l])<<' ';
}*/
}

BZOJ4552 HEOI2016/TJOI2016排序(线段树合并+线段树分裂)的更多相关文章

  1. [HEOI2016/TJOI2016]排序 线段树+二分

    [HEOI2016/TJOI2016]排序 内存限制:256 MiB 时间限制:6000 ms 标准输入输出 题目类型:传统 评测方式:文本比较 题目描述 在2016年,佳媛姐姐喜欢上了数字序列.因而 ...

  2. [Luogu P2824] [HEOI2016/TJOI2016]排序 (线段树+二分答案)

    题面 传送门:https://www.luogu.org/problemnew/show/P2824 Solution 这题极其巧妙. 首先,如果直接做m次排序,显然会T得起飞. 注意一点:我们只需要 ...

  3. 2021.12.09 [HEOI2016/TJOI2016]排序(线段树+二分,把一个序列转换为01串)

    2021.12.09 [HEOI2016/TJOI2016]排序(线段树+二分,把一个序列转换为01串) https://www.luogu.com.cn/problem/P2824 题意: 在 20 ...

  4. 2016湖南省赛 I Tree Intersection(线段树合并,树链剖分)

    2016湖南省赛 I Tree Intersection(线段树合并,树链剖分) 传送门:https://ac.nowcoder.com/acm/contest/1112/I 题意: 给你一个n个结点 ...

  5. 洛谷 P2824 [HEOI2016/TJOI2016]排序 解题报告

    P2824 [HEOI2016/TJOI2016]排序 题意: 有一个长度为\(n\)的1-n的排列\(m\)次操作 \((0,l,r)\)表示序列从\(l\)到\(r\)降序 \((1,l,r)\) ...

  6. 【线段树合并】【P2824】 [HEOI2016/TJOI2016]排序

    Description 给定一个长度为 \(n\) 的排列,有 \(m\) 次操作,每次选取一段局部进行升序或降序排序,问你一波操作后某个位置上的数字是几 Hint \(1~\leq~n,~m~\le ...

  7. 洛谷 P2824 [HEOI2016/TJOI2016]排序 (线段树合并)

    (另外:题解中有一种思路很高妙而且看上去可以适用一些其他情况的离线方法) 线段树合并&复杂度的简单说明:https://blog.csdn.net/zawedx/article/details ...

  8. BZOJ.4552.[HEOI2016/TJOI2016]排序(线段树合并/二分 线段树)

    题目链接 对于序列上每一段连续区间的数我们都可以动态开点建一棵值域线段树.初始时就是\(n\)棵. 对于每次操作,我们可以将\([l,r]\)的数分别从之前它所属的若干段区间中分离出来,合并. 对于升 ...

  9. HDU 5649 DZY Loves Sorting(二分答案+线段树/线段树合并+线段树分割)

    题意 一个 \(1\) 到 \(n\) 的全排列,\(m\) 种操作,每次将一段区间 \([l,r]\) 按升序或降序排列,求 \(m\) 次操作后的第 \(k\) 位. \(1 \leq n \le ...

随机推荐

  1. 仿9GAG制作过程(四)

    有话要说: 这次主要讲述主页面下拉刷新和上拉加载功能的实现. 主要是使用了SwipeRefreshLayout的布局方式,并在此基础上通过RecyclerView的特性增加了上拉加载的功能. 成果: ...

  2. 云服务器挂载/dev/vdb1磁盘

    1.首先检查是否有一块硬盘还未被挂载 2.如图所示,vdb还未被使用,开始分配它吧 [root@localhost ~]# fdisk /dev/vdb Command (m for help): n ...

  3. 【原】Java学习笔记024 - 包装类

    package cn.temptation; public class Sample01 { public static void main(String[] args) { // 之前对于基本数据类 ...

  4. js学习之路2: JavaScript 变量

    1. 变量的创建 首先,可以创建一个变量 var firstVar; 这时候,并没有给它赋值.这个变量还是空的. 然后,我们可以给这个变量赋值. firstVar = 128: 2. 变量的赋值 变量 ...

  5. Windows系统资源监控

    1.windows自带系统资源监控工具 2.Windows监控的数据来源:Performance Counters 2.1 Performance Counter架构 2.2 Performance ...

  6. SQLServer之添加聚集索引

    聚集索引添加规则 聚集索引按下列方式实现 PRIMARY KEY 和 UNIQUE 约束 在创建 PRIMARY KEY 约束时,如果不存在该表的聚集索引且未指定唯一非聚集索引,则将自动对一列或多列创 ...

  7. centos7下kubernetes(11。kubernetes-运行一次性任务)

    容器按照持续运行的时间可以分为两类:服务类容器和工作类容器 服务类容器:持续提供服务 工作类容器:一次性任务,处理完后容器就退出 Deployment,replicaset和daemonset都用于管 ...

  8. 用CMD打开chrome并导航到百度(golang)

    首选在cmd中输入(注意:根据你的电脑路径修改,可能是Progra~1): C:\Progra~\Google\Chrome\Application\chrome.exe www.baidu.com ...

  9. jquery.amaran jquery提示类使用

    <script src="ing/js/jquery-1.8.3.min.js"></script> <link rel="styleshe ...

  10. JSOI2019 Round2 极限生还

    江苏省省队一共13个名额,去掉女生名额, 按1/3校内限制,我们南外只有4个名额, 在noip爆炸(占比35%),省选一轮爆炸(占比40%),(此时蒟蒻在校内排不进前10...) 总算在省选二轮(占比 ...