[CSP-S模拟测试]:联(小清新线段树)
题目描述
由于出题人懒所以没有背景。
一个无限长的$01$序列,初始全为$0$,每次选择一个区间$[l,r]$进行操作,有三种操作:
$\bullet 1\ l\ r$将$[l,r]$中所有元素变成$1$。
$\bullet 2\ l\ r$将$[l,r]$中所有元素变成$0$。
$\bullet 3\ l\ r$将$[l,r]$中所有元素异或上$1$。
每次操作后询问最左边的$0$在哪个位置。
输入格式
第一行一个数$m$,表示序列长度和操作数量。
接下来$m$行,每行三个数$ty\ l\ r$,描述一次操作。
输出格式
输出共$m$行,第$i$行输出一个数表示第$i$次操作后的答案。
样例
样例输入:
3
1 3 4
3 1 6
2 1 3
样例输出:
1
3
1
数据范围与提示
令$n$为$\max(r)$。
对于测试点$1\sim 4$:$n,m\leqslant 10^3$。
对于测试点$5\sim 6$:只有$1$操作。
对于测试点$7\sim 10$:只有$1,2$操作。
对于测试点$11\sim 15$:$n\leqslant 10^5$。
对于测试点$16\sim 20$:无特殊限制。
对于所有的数据,$n\leqslant 10^{18},m\leqslant 10^5$。
题解
看数据范围,肯定是要离散化的,但是离散化的时候需要注意还要将$l+1$和$r+1$离散。
对于只有操作$1,2$的情况,我们可以用线段树直接维护。
那么考虑情况$3$我们可以怎么处理。
如果一段区间都是一样的,我们可以直接将其翻转,然后$return$。
不过这样做可以被很轻松的卡掉,比方说序列是$0101010......$,每次都执行操作$3$,那么会被卡成$n^2$。
但是对于这到柯朵莉树都能$A$掉的题,这就无关紧要了。
时间复杂度:$\Theta(m)\sim \Theta(m^2)$。
期望得分:$100$分。
实际得分:$100$分。
代码时刻
#include<bits/stdc++.h>
#define L(x) x<<1
#define R(x) x<<1|1
#define inf 0x3f3f3f3f
using namespace std;
map<long long,long long> mp;
struct rec{int ty;long long l,r;}e[200001];
int m;
int n;
long long pre[5000000];
long long trsam[10000000],trans[10000000],lz[10000000];
void pushup(int x)
{
trans[x]=min(trans[L(x)],trans[R(x)]);
trsam[x]=(trsam[L(x)]==trsam[R(x)])?trsam[L(x)]:-1;
}
void pushdown(int x,int l,int r)
{
if(lz[x]==-1)return;
int mid=(l+r)>>1;
lz[L(x)]=lz[R(x)]=trsam[L(x)]=trsam[R(x)]=lz[x];
if(!trsam[L(x)])trans[L(x)]=l;
else trans[L(x)]=inf;
if(!trsam[R(x)])trans[R(x)]=mid+1;
else trans[R(x)]=inf;
lz[x]=-1;
}
void build(int x,int l,int r)
{
trans[x]=inf;
lz[x]=-1;
if(l==r)
{
trans[x]=l;
return;
}
int mid=(l+r)>>1;
build(L(x),l,mid);
build(R(x),mid+1,r);
pushup(x);
}
void change(int x,int l,int r,int L,int R,int opt)
{
if(R<l||r<L)return;
if(L<=l&&r<=R&&trsam[x]!=-1)
{
switch(opt)
{
case 1:trsam[x]=1;lz[x]=1;break;
case 2:trsam[x]=0;lz[x]=0;break;
case 3:trsam[x]^=1;lz[x]=trsam[x];break;
}
if(!trsam[x])trans[x]=l;
else trans[x]=inf;
return;
}
int mid=(l+r)>>1;
pushdown(x,l,r);
change(L(x),l,mid,L,R,opt);
change(R(x),mid+1,r,L,R,opt);
pushup(x);
}
int main()
{
scanf("%d",&m);
for(int i=1;i<=m;i++)
scanf("%d%lld%lld",&e[i].ty,&e[i].l,&e[i].r);
for(int i=1;i<=m;++i)
{
pre[i*4-3]=e[i].l, pre[i*4-2]=e[i].r;
pre[i*4-1]=e[i].l+1, pre[i*4]=e[i].r+1;
}
pre[m*4+1]=1;
sort(pre+1,pre+m*4+2);
n=unique(pre+1,pre+m*4+2)-pre-1;
for(int i=1;i<=m;++i)
{
mp[lower_bound(pre+1,pre+n+1,e[i].r+1)-pre]=e[i].r+1;
mp[lower_bound(pre+1,pre+n+1,e[i].l+1)-pre]=e[i].l+1;
long long now=e[i].l;
e[i].l=lower_bound(pre+1,pre+n+1,e[i].l)-pre;
mp[e[i].l]=now;
now=e[i].r;
e[i].r=lower_bound(pre+1,pre+n+1,e[i].r)-pre;
mp[e[i].r]=now;
}
mp[1]=1;
build(1,1,n);
for(int i=1;i<=m;++i)
{
change(1,1,n,e[i].l,e[i].r,e[i].ty);
printf("%lld\n",mp[trans[1]]);
}
return 0;
}
rp++
[CSP-S模拟测试]:联(小清新线段树)的更多相关文章
- [CSP-S模拟测试]:最大值(数学+线段树)
题目背景 $Maxtir$最喜欢最大值. 题目传送门(内部题128) 输入格式 第$1$行输入四个正整数$n,m,q$. 第$2$至$n+1$行中,第$i+1$行输入魔法晶石$i$的三种属性$(x_i ...
- [CSP-S模拟测试]:God Knows(线段树维护单调栈)
题目描述 小$w$来到天堂的门口,对着天堂的大门发呆.大门上有一个二分图,左边第$i$个点连到右边第$p_i$个点.(保证$p_i$是一个排列).小$w$每次可以找左边某个对应连线尚未被移除的点$i$ ...
- 联赛模拟测试8 Dash Speed 线段树分治
题目描述 分析 对于测试点\(1\).\(2\),直接搜索即可 对于测试点\(3 \sim 6\),树退化成一条链,我们可以将其看成序列上的染色问题,用线段树维护颜色相同的最长序列 对于测试点\(7\ ...
- [HDU5360]:Gorgeous Sequence(小清新线段树)
题目传送门 题目描述: (原题英文) 操作0:输入l,r,t,线段树区间与t取min. 操作1:输入l,r,区间取最大值. 操作2:输入l,r,区间求和. 输入格式: 第一行一个整数T,表示数据组数: ...
- [BZOJ3211]:花神游历各国(小清新线段树)
题目传送门 题目描述: 花神喜欢步行游历各国,顺便虐爆各地竞赛.花神有一条游览路线,它是线型的,也就是说,所有游历国家呈一条线的形状排列,花神对每个国家都有一个喜欢程度(当然花神并不一定喜欢所有国家) ...
- Gorgeous Sequence 题解 (小清新线段树)
这道题被学长称为“科幻题” 题面 事实上,并不是做法科幻,而是“为什么能这么做?”的解释非常科幻 换句话说,复杂度分析灰常诡异以至于吉如一大佬当场吃书 线段树维护的量:区间和sum,区间最大值max1 ...
- [CSP-S模拟测试]:数对(线段树优化DP)
题目传送门(内部题96) 输入格式 第一行一个整数$n$,接下来$n$行每行三个整数$a_i,b_i,w_i$. 输出格式 一行一个整数表示最大权值和. 样例 样例输入: 54 4 12 3 31 5 ...
- [CSP-S模拟测试]:模板(ac)(线段树启发式合并)
题目描述 辣鸡$ljh\ NOI$之后就退役了,然后就滚去学文化课了.他每天都被$katarina$大神虐,仗着自己学过一些姿势就给$katarina$大神出了一道题.有一棵$n$个节点的以$1$号节 ...
- [CSP-S模拟测试]:甜圈(线段树)
题目描述 $D$先生,是一个了不起的甜甜圈制造商.今天,他的厨房准备在日出之前制作甜甜圈.$D$先生瞬间完成了$N$个油炸圈饼.但是,这些油炸圈饼得先经过各种装饰任务才可以成为甜甜圈销售:填充奶油,浸 ...
随机推荐
- eval方法遇到的问题
工作中有这样的场景,一个表达式比如 2*2,计算结果是number,这样的为true,如果输入错误 2*@,这样的情况需要匹配为false. 这里使用的eval方法, type of (eval('2 ...
- JQuery 字符串转时间格式
//字符串转时间格式 function getDate(strDate) { var date = eval('new Date(' + strDate.replace(/\d+(?=-[^-]+$) ...
- Linux 系统故障修复和修复技巧
我发现Linux系统在启动过程中会出现一些故障,导致系统无法正常启动,我在这里写了几个应用单用户模式.GRUB命令操作.Linux救援模式的故障修复案例帮助大家了解此类问题的解决. 一.单用户模式 L ...
- vue自定义指令的创建和使用
一.自定义指令的创建和使用 Vue自带的指令很多,v-for/v-if/v-else/v-else-if/v-model/v-bind/v-on/v-show/v-html/v-text...但是这些 ...
- vue同意本站协议的制作
<!doctype html> <html> <head> <meta charset="UTF-8"> <title> ...
- < python PIL - 批量图像处理 - RGB图像生成灰度图像 >
< python PIL - 批量图像处理 - RGB图像生成灰度图像 > 直接用python自带的PIL图像库,将一个文件夹下所有jpg/png的RGB图像转换成灰度/黑白图像 from ...
- (经典文章uplink)Information capacity and power control in single-cell multiuser communications(1995)
摘要:本文在用户衰落被完美测量的情况下,提出一种可最大程度提高单小区多用户通信平坦衰落的信息容量的功率控制.主要特征为:在任何特定的时刻,只有一个用户在整个带宽上进行传输,并且在信道良好时为用户分配更 ...
- 怕忘记了CSS中position的absolute和relative用法
CSS2.0中的定位确实有时会把人弄糊涂,所以今天给它记下来,同时供以后查阅.下面写的内容有一部分借鉴了w3cschool和divcss5这两个官方网站,在此处特别的说明一下 CSS2.0中posit ...
- 【JMeter5.0】Mac安装JDK和JMeter5
之前讲了Windows下安装JDK和JMeter4.0的方法,其实不论操作系统是Windows.Mac OS.Linux等,JMeter所需要的基础环境配置都是类似的,本文介绍JMeter for M ...
- Xshell实现Windows和使用跳板机跳转的远程Linux互传文件
适用于Linux CentOS版本,本地电脑是Win10版本 查询Linux版本: $lsb_release -a $cat /etc/issue 1.使用Xshell 连接上服务器 2.安装文件传输 ...