【XSY2484】mex 离散化 线段树
题目大意
给你一个无限长的数组,初始的时候都为\(0\),有3种操作:
操作\(1\)是把给定区间\([l,r]\)设为\(1\);
操作\(2\)是把给定区间\([l,r]\)设为\(0\);
操作\(3\)把给定区间\([l,r]0,1\)反转;
一共\(n\)个操作,每次操作后要输出最小位置的\(0\)。
\(n\leq 100000,1\leq l\leq r\leq {10}^{18}\)
题解
本题可以用平衡树做,这样就不用离散化了
下面是线段树做法
因为\(l,r\)很大,所以要离散化。通过证(guan)明(cha)发现,答案只可能是\(1,l,r+1\)。我们把这\(2n+1\)个点拿出来离散化,然后用线段树维护区间和就行了。我维护了最左边的\(0\)和最左边的\(1\)。
时间复杂度:\(O(n\log n)\)
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<utility>
using namespace std;
typedef int zjt_ak_noi_2018;
typedef long long ll;
typedef pair<zjt_ak_noi_2018,zjt_ak_noi_2018> pii;
struct node
{
zjt_ak_noi_2018 l,r;
zjt_ak_noi_2018 ls,rs;
zjt_ak_noi_2018 s0,s1;
zjt_ak_noi_2018 t1,t2;
node()
{
ls=rs=0;
s0=s1=0;
t1=-1;
t2=0;
}
};
node a[500010];
zjt_ak_noi_2018 rt;
zjt_ak_noi_2018 cnt=0;
zjt_ak_noi_2018 merge(zjt_ak_noi_2018 v1,zjt_ak_noi_2018 v2)
{
if(!v1||!v2)
return v1+v2;
return min(v1,v2);
}
void build(zjt_ak_noi_2018 &p,zjt_ak_noi_2018 l,zjt_ak_noi_2018 r)
{
p=++cnt;
a[p].l=l;
a[p].r=r;
if(l==r)
{
a[p].s0=l;
return;
}
zjt_ak_noi_2018 mid=(l+r)>>1;
build(a[p].ls,l,mid);
build(a[p].rs,mid+1,r);
a[p].s0=merge(a[a[p].ls].s0,a[a[p].rs].s0);
a[p].s1=merge(a[a[p].rs].s1,a[a[p].rs].s1);
}
void fill(zjt_ak_noi_2018 p,zjt_ak_noi_2018 v)
{
if(v)
{
a[p].s0=0;
a[p].s1=a[p].l;
}
else
{
a[p].s0=a[p].l;
a[p].s1=0;
}
a[p].t1=v;
a[p].t2=0;
}
void reverse(zjt_ak_noi_2018 p)
{
swap(a[p].s0,a[p].s1);
a[p].t2^=1;
}
void push(zjt_ak_noi_2018 p)
{
if(a[p].l!=a[p].r)
{
if(~a[p].t1)
{
fill(a[p].ls,a[p].t1);
fill(a[p].rs,a[p].t1);
a[p].t1=-1;
}
if(a[p].t2)
{
reverse(a[p].ls);
reverse(a[p].rs);
a[p].t2=0;
}
}
}
void fill(zjt_ak_noi_2018 p,zjt_ak_noi_2018 l,zjt_ak_noi_2018 r,zjt_ak_noi_2018 v)
{
if(l<=a[p].l&&r>=a[p].r)
{
fill(p,v);
return;
}
push(p);
zjt_ak_noi_2018 mid=(a[p].l+a[p].r)>>1;
if(l<=mid)
fill(a[p].ls,l,r,v);
if(r>mid)
fill(a[p].rs,l,r,v);
a[p].s0=merge(a[a[p].ls].s0,a[a[p].rs].s0);
a[p].s1=merge(a[a[p].ls].s1,a[a[p].rs].s1);
}
void reverse(zjt_ak_noi_2018 p,zjt_ak_noi_2018 l,zjt_ak_noi_2018 r)
{
if(l<=a[p].l&&r>=a[p].r)
{
reverse(p);
return;
}
push(p);
zjt_ak_noi_2018 mid=(a[p].l+a[p].r)>>1;
if(l<=mid)
reverse(a[p].ls,l,r);
if(r>mid)
reverse(a[p].rs,l,r);
a[p].s0=merge(a[a[p].ls].s0,a[a[p].rs].s0);
a[p].s1=merge(a[a[p].ls].s1,a[a[p].rs].s1);
}
//zjt_ak_noi_2018 query(zjt_ak_noi_2018 p,zjt_ak_noi_2018 l,zjt_ak_noi_2018 r)
//{
// if(l<=a[p].l&&r>=a[p].r)
// return a[p].s0;
// push(p);
// zjt_ak_noi_2018 mid=(a[p].l+a[p].r)>>1;
// zjt_ak_noi_2018 s=0;
// if(l<=mid)
// s=merge(s,query(a[p].ls,l,r));
// if(r>mid)
// s=merge(s,query(a[p].rs,l,r));
// return s;
//}
zjt_ak_noi_2018 op[100010];
ll l[100010];
ll r[100010];
ll d[200010];
zjt_ak_noi_2018 main()
{
freopen("b.in","r",stdin);
freopen("b.out","w",stdout);
zjt_ak_noi_2018 n,m=0;
scanf("%d",&n);
zjt_ak_noi_2018 i;
for(i=1;i<=n;i++)
{
scanf("%d%lld%lld",&op[i],&l[i],&r[i]);
d[++m]=l[i];
d[++m]=r[i]+1;
}
d[++m]=1;
sort(d+1,d+m+1);
m=unique(d+1,d+m+1)-d-1;
for(i=1;i<=n;i++)
{
l[i]=lower_bound(d+1,d+m+1,l[i])-d;
r[i]=upper_bound(d+1,d+m+1,r[i])-d-1;
}
build(rt,1,m);
for(i=1;i<=n;i++)
{
if(op[i]==1)
fill(rt,l[i],r[i],1);
else if(op[i]==2)
fill(rt,l[i],r[i],0);
else
reverse(rt,l[i],r[i]);
printf("%lld\n",d[a[rt].s0]);
}
return 0;
}
【XSY2484】mex 离散化 线段树的更多相关文章
- 南阳理工 题目9:posters(离散化+线段树)
posters 时间限制:1000 ms | 内存限制:65535 KB 难度:6 描述 The citizens of Bytetown, AB, could not stand that ...
- SGU 180 Inversions(离散化 + 线段树求逆序对)
题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=180 解题报告:一个裸的求逆序对的题,离散化+线段树,也可以用离散化+树状数组.因为 ...
- 【POJ】2528 Mayor's posters ——离散化+线段树
Mayor's posters Time Limit: 1000MS Memory Limit: 65536K Description The citizens of Bytetown, A ...
- hpu校赛--雪人的高度(离散化线段树)
1721: 感恩节KK专场——雪人的高度 时间限制: 1 Sec 内存限制: 128 MB 提交: 81 解决: 35 [提交][状态][讨论版] 题目描述 大雪过后,KK决定在春秋大道的某些区间 ...
- 【BZOJ1645】[Usaco2007 Open]City Horizon 城市地平线 离散化+线段树
[BZOJ1645][Usaco2007 Open]City Horizon 城市地平线 Description Farmer John has taken his cows on a trip to ...
- 【bzoj4636】蒟蒻的数列 离散化+线段树
原文地址:http://www.cnblogs.com/GXZlegend/p/6801379.html 题目描述 蒟蒻DCrusher不仅喜欢玩扑克,还喜欢研究数列 题目描述 DCrusher有一个 ...
- 离散化+线段树/二分查找/尺取法 HDOJ 4325 Flowers
题目传送门 题意:给出一些花开花落的时间,问某个时间花开的有几朵 分析:这题有好几种做法,正解应该是离散化坐标后用线段树成端更新和单点询问.还有排序后二分查找询问点之前总花开数和总花凋谢数,作差是当前 ...
- Mayor's posters (离散化线段树+对lazy的理解)
题目 题意: n(n<=10000) 个人依次贴海报,给出每张海报所贴的范围 li,ri(1<=li<=ri<=10000000) .求出最后还能看见多少张海报. 思路: 由于 ...
- 干物妹小埋 (离散化 + 线段树 + DP)
链接:https://ac.nowcoder.com/acm/contest/992/B来源:牛客网 题目描述 在之前很火的一个动漫<干物妹小埋>中,大家对小埋打游戏喝可乐的印象十分的深刻 ...
随机推荐
- SQLServer 存储过程+定时任务发邮件
SQLServer 代理发邮件需要开启SQL Server 代理服务器,然后,在[管理]-[数据库邮件]中,右键点击配置数据库邮件. 我用的是腾讯的企业邮箱,个人的163邮箱略微不同.下图是相关邮件的 ...
- linux-高并发与负载均衡-TCP-IP基础知识
ARP协议: ping baidu
- Python_装饰器复习_30
复习: # 装饰器的进阶 # functools.wraps # 带参数的装饰器 # 多个装饰器装饰同一个函数# 周末的作业 # 文件操作 # 字符串处理 # 输入输出 # 流程控制 # 装饰器# 开 ...
- UVA 10820 欧拉函数模板题
这道题就是一道简单的欧拉函数模板题,需要注意的是,当(1,1)时只有一个,其他的都有一对.应该对欧拉函数做预处理,显然不会超时. #include<iostream> #include&l ...
- CRM系统(第二部分)
阅读目录 一.讲师与学生简介 二. 初始化 ,studyrecord, 三.初始化 course_record:批量生成学习记录 四. 考勤 url跳转 五.录入成绩 六.highcharts表 ...
- 自己实现数据结构系列三---Stack
一.代码部分 1.定义接口 public interface Stack<E> { int getSize(); boolean isEmpty(); void push(E e); E ...
- Linux 典型应用之缓存服务
memcached 安装和简单使用 yum install memcached 启动 -d 表示以守护进程的方式启动 memcached -d 安装telnet 它可以检测某个端口是否是通的,可以发送 ...
- jmeter 连接数据库测试笔记
JDBC 常用mysql和oracal的jar包下载地址.jdbc driver class配置参考我的博客https://www.cnblogs.com/jackzz/p/9998975.html ...
- 便捷的ajax请求
为什么要做这个呢?如果后端给的数据不单有JSON字符串,还有对象呢?这个时候我们就要每个都处理(JSON.parse).万一后端又改了,所有都是对象呢?如此一来我们就需要对我们的ajax进行封装. 这 ...
- tomcat server.xml各个端口的作用
<Server port="8005" shutdown="SHUTDOWN"> <!-- port:指定一个端口,这个端口负责监听关闭Tom ...