Description

给你一个无限长的数组,初始的时候都为0,有3种操作:

操作1是把给定区间[l,r] 设为1,

操作2是把给定区间[l,r] 设为0,

操作3把给定区间[l,r] 0,1反转。

一共n个操作,每次操作后要输出最小位置的0。

Input

第一行一个整数n,表示有n个操作

接下来n行,每行3个整数op,l,r表示一个操作

Output

共n行,一行一个整数表示答案

Sample Input

3
1 3 4
3 1 6
2 1 3

Sample Output

1
3
1

HINT

对于30%的数据1≤n≤1000,1≤l≤r≤1e18

对于100%的数据1≤n≤100000,1≤l≤r≤1e18

l,r最大可达1e18,肯定要离散化。

有大量的区间修改的操作——考虑线段树

解决方法:

离散化+线段树

首先离散化。

离散化时将每一次操作的区间的l,r,r+1放入一个数组。lower_bound离散化,得到离散化后的l,r。

为什么要放入r+1?

像这样,离散化后,1-2,3-4区间都为1,本来应该有0的存在,但在线段树上却没有,这时候就要用r+1把这个“坑”给填上。

离散化后:

线段树记录\(minn[i][0]\),\(minn[i][1]\),表示在该区间0和1最早在哪个点出现,若没出现过,minn=INF;

操作1,2: 区间修改\(minn[i][0]\),\(minn[i][1]\),\(sum[i]\)懒标记。

操作3: 交换\(minn[i][0]\),\(minn[i][1]\),\(lazy[i]\)懒标记记录是否换了回来,若没换回来,pushdown。

总体的思路就是这样了,代码有点难调试,一定要耐心打,用心调。

#include<bits/stdc++.h>
#define inf 1e9
using namespace std;
struct data
{
int op;
long long l,r;
}q[2000001];
int lazy[2000001],minn[2000001][2],sum[2000001],op,n,cnt,cnt1;
long long l,r,b[2000001];
void build(int hao,int l,int r)
{
lazy[hao]=0;
sum[hao]=-1;
minn[hao][0]=l;
minn[hao][1]=inf;
if(l==r)
{
return;
}
int mid=(l+r)/2;
build(hao<<1,l,mid);
build(hao<<1|1,mid+1,r);
}
void pushdown(int hao,int l,int r)
{
int mid=(l+r)/2;
if(sum[hao]!=-1)//下放sum
{
int p=sum[hao];
sum[hao<<1]=sum[hao<<1|1]=p;
lazy[hao<<1]=lazy[hao<<1|1]=0;
minn[hao<<1][p]=l;
minn[hao<<1|1][p]=mid+1;
minn[hao<<1][p^1]=inf;
minn[hao<<1|1][p^1]=inf;
sum[hao]=-1;
}
if(lazy[hao])//下放lazy
{
lazy[hao<<1]^=1;
lazy[hao<<1|1]^=1;
swap(minn[hao<<1][0],minn[hao<<1][1]);
swap(minn[hao<<1|1][0],minn[hao<<1|1][1]);
lazy[hao]=0;
}
}
void update(int hao,int l,int r,int L,int R,int num)//操作1,2
{
if(L<=l&&R>=r)
{
sum[hao]=num;
minn[hao][num]=l;
lazy[hao]=0;
minn[hao][num^1]=inf;
}else{
pushdown(hao,l,r);
int mid=(l+r)/2;
if(L<=mid)
{
update(hao<<1,l,mid,L,R,num);
}
if(R>mid)
{
update(hao<<1|1,mid+1,r,L,R,num);
}
minn[hao][0]=min(minn[hao<<1][0],minn[hao<<1|1][0]);
minn[hao][1]=min(minn[hao<<1][1],minn[hao<<1|1][1]);
}
}
void change(int hao,int l,int r,int L,int R)//操作3
{
if(L<=l&&R>=r)
{
lazy[hao]^=1;
swap(minn[hao][0],minn[hao][1]);
}else{
pushdown(hao,l,r);
int mid=(l+r)/2;
if(L<=mid)
{
change(hao<<1,l,mid,L,R);
}
if(R>mid)
{
change(hao<<1|1,mid+1,r,L,R);
}
minn[hao][0]=min(minn[hao<<1][0],minn[hao<<1|1][0]);
minn[hao][1]=min(minn[hao<<1][1],minn[hao<<1|1][1]);
}
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%lld%lld",&op,&l,&r);
q[i].op=op;
q[i].l=l;
q[i].r=r;
b[++cnt]=l;
b[++cnt]=r;
b[++cnt]=r+1;
}
b[++cnt]=1;
sort(b+1,b+cnt+1);
b[0]=-0x7f7f7f7f;
for(int i=1;i<=cnt;i++)//去重
{
if(b[i]==b[i-1])
{
continue;
}
b[++cnt1]=b[i];
}
cnt=cnt1;
build(1,1,cnt);
for(int i=1;i<=n;i++)
{
int l=lower_bound(b,b+cnt+1,q[i].l)-b;//离散化
int r=lower_bound(b,b+cnt+1,q[i].r+1)-b-1;
if(q[i].op==1)
{
update(1,1,cnt,l,r,1);
}else{
if(q[i].op==2)
{
update(1,1,cnt,l,r,0);
}else{
change(1,1,cnt,l,r);
}
}
printf("%lld\n",b[minn[1][0]]);
}
return 0;
}
/*
3
1 3 4
3 1 6
2 1 3
*/

【XSY2484】mex的更多相关文章

  1. 【XSY2484】mex 离散化 线段树

    题目大意 给你一个无限长的数组,初始的时候都为\(0\),有3种操作: 操作\(1\)是把给定区间\([l,r]\)设为\(1\): 操作\(2\)是把给定区间\([l,r]\)设为\(0\): 操作 ...

  2. 【BZOJ3585】mex

    Description 有一个长度为n的数组{a1,a2,-,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. Input 第一行n,m. 第二行为n个数. 从第三行開始,每行一个询问l, ...

  3. 【数学】mex是什么

    最近在看博弈论,SG函数,所以什么是mex呢 然后百度了一下得到: mex(S) 的值为集合 S 中没有出现过的最小自然数.例如,mex({1,2}) = 0.mex({0,1,2,3}) = 4

  4. 【bzoj3585】mex 线段树 mex,sg

    Description 有一个长度为n的数组{a1,a2,…,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. Input 第一行n,m. 第二行为n个数. 从第三行开始,每行一个询问l, ...

  5. 【BZOJ3585/3339】mex 莫队算法+分块

    [BZOJ3585]mex Description 有一个长度为n的数组{a1,a2,...,an}.m次询问,每次询问一个区间内最小没有出现过的自然数. Input 第一行n,m. 第二行为n个数. ...

  6. 【codeforces】【比赛题解】#862 CF Round #435 (Div.2)

    这次比赛打得很舒服,莫名得了个Rank41,涨了219的Rating,就比较优秀.不过还是没有闫神厉害啊.题目链接::P. [A]MEX 题意: Evil博士把Mahmoud和Ehab绑架到了邪恶之地 ...

  7. 【Luogu4137】Rmq Problem/mex (莫队)

    [Luogu4137]Rmq Problem/mex (莫队) 题面 洛谷 题解 裸的莫队 暴力跳\(ans\)就能\(AC\) 考虑复杂度有保证的做法 每次计算的时候把数字按照大小也分块 每次就枚举 ...

  8. 【HDU1848】Fibonacci again and again(博弈论)

    [HDU1848]Fibonacci again and again(博弈论) 题面 Hdu 你有三堆石子,每堆石子的个数是\(n,m,p\),你每次可以从一堆石子中取走斐波那契数列中一个元素等数量的 ...

  9. 【codeforces】940F题解

    CF Round #466的最后一题,颇有难度,正解是带修改莫队算法. [题意] 给定一个长度为\(n\)的数组\(a\),并且要求执行\(q\)个操作,有两种不同的操作: ①询问一个区间\([l,r ...

随机推荐

  1. mysql高级扩展

    有关网址: MySQL 性能优化神器 Explain 使用分析 MySQL - EXPLAIN详解 1.时间比较 mysql> SELECT something FROM table WHERE ...

  2. Chrome 浏览器默认样式覆盖自己 CSS 样式的解决

    检查 HTML 源代码,DOCTYPE 的声明是否写正确. HTML5 的 DOCTYPE 声明规范: <!DOCTYPE html> 参考链接: css - User agent sty ...

  3. java第4天:String static Arrays类,Math类

    1 字符串的概述和特点 字符串一旦创建,是不可变的. 有双引号的就是字符串 *** 2 字符串的三种构造方法 2-1 第一种: 格式:String str = new String();| :-| 2 ...

  4. 问题TypeError: __init__() takes 1 positional argument but 2 were given解决方案

    在搭建自动化框架时,遇到一个问题,如下图: 根据报错的意思,应该是__init__函数的问题, 位置应该是HomePage文件 立马去查看一下文件,如图: 原来是因为的粗心大意__init__(sel ...

  5. Cocos Creator一步一步实现重力球游戏

    『 游戏玩法 』 通过手机陀螺仪,调整手机,让球从上一层的间隔中落到下一层,楼层会不断上涨,如果球碰到上方或者下方的火焰,游戏结束. 『 游戏预览 』 ​ 『 开发工具 』 1. CocosCreat ...

  6. 渗透测试-基于白名单执行payload--zipfldr.dll

    0x01 zipfldr.dll简介: zipfldr.dll自Windows xp开始自带的zip文件压缩/解压工具组件. 说明:zipfldr.dll所在路径已被系统添加PATH环境变量中,因此, ...

  7. mysql 数据分析如何实现日报、周报、月报和年报?

    以天为统计周期,是常见需求.周报.月报更是常见需求.长周期项目,甚至有年报需求.我已经掌握了mysql中按天统计,如何实现按年.按月.按周统计呢? 1.已掌握的技能:按天统计 实现以天为统计周期很简单 ...

  8. std::unordered_map

    map与unordered_map的区别 1.map: map内部实现了一个红黑树,该结构具有自动排序的功能,因此map内部的所有元素都是有序的,红黑树的每一个节点都代表着map的一个元素, 因此,对 ...

  9. 05jmeter-responses中有多组json数据,提取同一条json数据的两个字段

    某接口返回结果如上图,取id和groupNo 1.读取确定的某条json数据:如取第一条,一个JSON Extractor即可实现 2.随机读取某条json数据: 需要两个JSON Extractor ...

  10. Markdown的基本使用指南

    目录 1.标题 2.列表 2.1无序列表 2.1有序列表 3.引用 4.图片和链接 5.粗体和斜体 6.分割线 7.代码框和代码块 8.列表 9.可选框 10.添加目录 Markdown 是一种用来写 ...