【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来源:牛客网 题目描述 在之前很火的一个动漫<干物妹小埋>中,大家对小埋打游戏喝可乐的印象十分的深刻 ...
随机推荐
- portscaner 多线程、多协程并发端口扫描
import socket,time,re,sys,os,threading import gevent from gevent import monkey monkey.patch_all() so ...
- koa服务器搭建基础
之前我一直使用rails搭建网站.rails与koa的基本理念很相似,都是基于中间件提供一层层的服务.所不同的是,rails有很多内置的中间件,这使得开发者只需要关注MVC模块以及页面路由.而Koa这 ...
- 16-使用Selenium模拟浏览器抓取淘宝商品美食信息
淘宝由于含有很多请求参数和加密参数,如果直接分析ajax会非常繁琐,selenium自动化测试工具可以驱动浏览器自动完成一些操作,如模拟点击.输入.下拉等,这样我们只需要关心操作而不需要关心后台发生了 ...
- OSS网页上传和断点续传(STSToken篇)
云账号AccessKey拥有所有API访问权限,在客户端不要直接使用,会泄露ak信息,造成安全问题.所以使用STS方式(临时账号权限)给客户端授权. C#版获取STSToken 一.下载阿里SDK(a ...
- 第十二届湖南省赛 (B - 有向无环图 )(拓扑排序+思维)好题
Bobo 有一个 n 个点,m 条边的有向无环图(即对于任意点 v,不存在从点 v 开始.点 v 结束的路径). 为了方便,点用 1,2,…,n 编号. 设 count(x,y) 表示点 x 到点 y ...
- oc之封装「可输入值」的UIStepper
2017.07.17 18:10* 字数 66 阅读 644评论 0喜欢 5 oc之封装「可输入值」的UIStepper 最终效果 要求: Platform: iOS7.0+ Language: Ob ...
- 【学习总结】GirlsInAI ML-diary day-6-String字符串
[学习总结]GirlsInAI ML-diary 总 原博github链接-day6 认识字符串 字符串的性质 字符串的玩法 1-字符串就是字符的序列 序列,代表字符串是有顺序的!这里很重要. 比如我 ...
- php 生成订单号201807205598981
php版 /** * 生成唯一订单号 */ public function build_order_no() { $no = date('Ymd').substr(implode(NULL, arra ...
- C# Note16: wpf window 中添加enter和双击事件
一.添加回车(enter)事件 在C#编程时,有时希望通过按回车键,控件焦点就会自动从一个控件跳转到下一个控件进行操作. 以用户登录为例,当输入完用户名和密码后, 需要点击登录按钮,而登录按钮必须获 ...
- Java 多线程概述
几乎所有的操作系统都支持同时运行多个任务,一 个任务通常就是一个程序,每个运行中的程序就是一个进程.当一个程序运行时,内部可能包含了多个顺序执行流,每个顺序执行流就是一个线程. 线程和进程 几乎所有的 ...