【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来源:牛客网 题目描述 在之前很火的一个动漫<干物妹小埋>中,大家对小埋打游戏喝可乐的印象十分的深刻 ...
随机推荐
- Centos7修改系统时区
timedatectl status Local time: 四 2014-12-25 10:52:10 CST Universal time: 四 2014-12-25 02:52:10 UTC R ...
- Sql Server中的nvarchar(n)、varchar(n) 和Mysql中的char(n)、varchar(n)
刚才有幸看了下 nvarchar(n)和varchar(n),感觉以前的认知有误. nvarchar(n):n指的是字符个数,范围是1-4000,存储的是可变长度的Unicode字符数据. 按字符存储 ...
- Palindromic characteristics CodeForces - 835D (区间DP,预处理回文串问题)
Palindromic characteristics of string s with length |s| is a sequence of |s|integers, where k-th num ...
- ElasticSearch 分组查询的几个例子
facets接口可以根据query返回统计数据,其中的 terms_stats 是分组统计,根据key的情况返回value的统计数据,类似group by的意思. "terms_stats& ...
- Elasticsearch - 简单介绍
Elasticsearch 简介 1. 什么是 Elasticsearch ElasticSearch 是一个基于 Lucene 的搜索服务器. 它了一个分布式多 用户能力的全文搜索引擎,能够达到实时 ...
- Shell脚本1
1Shell编程 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁.Shell 既是一种命令语言,又是一种程序设计语言. Shell脚本 Shell 脚本(shell scr ...
- [转帖]你所不知道的C和C++运行库
[C-C++]你所不知道的C和C++运行库 https://blog.csdn.net/humanking7/article/details/85887884 原作者也是转的blog 最近一个物理机上 ...
- [转帖]Windows 内核说明
来源:https://zhidao.baidu.com/question/398191459.html 自己的理解. windows 的内核文件 是在 c:\windows\system32 目录下面 ...
- js 判断一个字符在字符串中出现的次数
<script type="text/javascript"> var s='djh.doiwe.esd.d.ddd0sdd.d.'; var n=(s.split(' ...
- centOS7搭建NFS服务器
借鉴别人这篇博客搭建成功的:http://blog.51cto.com/mrxiong2017/2087001 NFS系统:用来共享文件.图片.视频 准备两个centOS7服务器,一个作NFS ser ...