题目大意

  给你一个无限长的数组,初始的时候都为\(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 离散化 线段树的更多相关文章

  1. 南阳理工 题目9:posters(离散化+线段树)

    posters 时间限制:1000 ms  |  内存限制:65535 KB 难度:6   描述 The citizens of Bytetown, AB, could not stand that ...

  2. SGU 180 Inversions(离散化 + 线段树求逆序对)

    题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=180 解题报告:一个裸的求逆序对的题,离散化+线段树,也可以用离散化+树状数组.因为 ...

  3. 【POJ】2528 Mayor's posters ——离散化+线段树

    Mayor's posters Time Limit: 1000MS    Memory Limit: 65536K   Description The citizens of Bytetown, A ...

  4. hpu校赛--雪人的高度(离散化线段树)

    1721: 感恩节KK专场——雪人的高度 时间限制: 1 Sec  内存限制: 128 MB 提交: 81  解决: 35 [提交][状态][讨论版] 题目描述 大雪过后,KK决定在春秋大道的某些区间 ...

  5. 【BZOJ1645】[Usaco2007 Open]City Horizon 城市地平线 离散化+线段树

    [BZOJ1645][Usaco2007 Open]City Horizon 城市地平线 Description Farmer John has taken his cows on a trip to ...

  6. 【bzoj4636】蒟蒻的数列 离散化+线段树

    原文地址:http://www.cnblogs.com/GXZlegend/p/6801379.html 题目描述 蒟蒻DCrusher不仅喜欢玩扑克,还喜欢研究数列 题目描述 DCrusher有一个 ...

  7. 离散化+线段树/二分查找/尺取法 HDOJ 4325 Flowers

    题目传送门 题意:给出一些花开花落的时间,问某个时间花开的有几朵 分析:这题有好几种做法,正解应该是离散化坐标后用线段树成端更新和单点询问.还有排序后二分查找询问点之前总花开数和总花凋谢数,作差是当前 ...

  8. Mayor's posters (离散化线段树+对lazy的理解)

    题目 题意: n(n<=10000) 个人依次贴海报,给出每张海报所贴的范围 li,ri(1<=li<=ri<=10000000) .求出最后还能看见多少张海报. 思路: 由于 ...

  9. 干物妹小埋 (离散化 + 线段树 + DP)

    链接:https://ac.nowcoder.com/acm/contest/992/B来源:牛客网 题目描述 在之前很火的一个动漫<干物妹小埋>中,大家对小埋打游戏喝可乐的印象十分的深刻 ...

随机推荐

  1. mockjs使用

    /** * 使用mockjs来mock数据, 提供mock数据API接口 */ import Mock from 'mockjs' import data from './data.json' //注 ...

  2. python-re模块-54

    import re # findall # search # match ret = re.findall('[a-z]+', 'eva egon yuan') # 返回所有满足匹配条件的结果,放在列 ...

  3. NOIP2016解题报告

    天天听这几道题,但其实题面都没看过.今天做一下. 每道题看懂题后基本一分钟左右就切了.D2T3想的是\(O(n\log n)\)的堆做法,至少90分吧. D1T1模拟即可. D1T2每条路径拆成到根的 ...

  4. MySQL添加用户错误:ERROR 1364 (HY000): Field 'ssl_cipher' doesn't have a default value解决方法

    MySQL添加新用户时出现如下报错,如下图: 经过查资料了解到: mysql用户表的中某些字段不能为空,没有默认值,其实是操作错误,mysql添加用户是不能这样直接insert user表的. 改为以 ...

  5. openstack-KVM-Memory

    一.Memory 1.查看memory信息 free -g cat /proc/meminfo dmesg | grep Memory 2.xml文件中的内存信息: vim /etc/libvirt/ ...

  6. [2017BUAA软工助教]团队建议

    关于团队项目的个人建议 (以下排名不分先后) 一.hotcode5 你们组要做一个"课件-心得"共享平台 目前最大的竞争对手其实不是北航课程中心网站,而是每个系自己的大班群. 热心 ...

  7. 【学习总结】Master课程 之 虚拟化与云计算

    Section 1- Cloud Computing Introduction-云计算介绍 1-What can Cloud Computing do? - 云计算可以做什么? 服务模式:美国国家标准 ...

  8. MySQL慢查询日志配置方式 slow_query_log

    MySQL慢查询(一) - 开启慢查询 - 鲁玉成 - 博客园 https://www.cnblogs.com/luyucheng/p/6265594.html mysql开启慢查询方法 - lava ...

  9. Java 异常处理的误区和经验总结

    Java 异常处理的误区和经验总结   1 本文着重介绍了 Java 异常选择和使用中的一些误区,希望各位读者能够熟练掌握异常处理的一些注意点和原则,注意总结和归纳.只有处理好了异常,才能提升开发人员 ...

  10. [转帖]SAP一句话入门:Human Resource

    SAP一句话入门:Human Resource http://blog.vsharing.com/MilesForce/A621279.html HR这一句话,太简单了:组织.招聘.发工资.任职.考勤 ...