CF817F MEX Queries(线段树上二分)
题意
维护一个01串,一开始全部都是0
3种操作
1.把一个区间都变为1
2.把一个区间都变为0
3.把一个区间的所有数字翻转过来
每次操作完成之后询问区间最小的0的位置
l,r<=10^18
题解
区间操作想到线段树,离散化不用说,l,r太大了。
1,2,3操作非常好维护。
然后在查询中二分查询就好了。
一开始看别的博客说要加1节点和r+1节点不知道为什么。
因为我的查询想的是,查询前面全都是1的区间的长度。后来发现做不了。就乖乖照题解做了。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<map>
using namespace std;
const long long N=;
map<long long,long long> mp;
long long b[N*],n,m,cnt;
struct ask{
long long l,r;
long long k;
}q[N];
struct tree{
long long l,r,sum,sev,lazy;
}tr[N*];
void build(long long l,long long r,long long now){
tr[now].l=l;
tr[now].r=r;
tr[now].lazy=-;
if(l==r)return;
long long mid=(l+r)>>;
build(l,mid,now*);
build(mid+,r,now*+);
}
void pushdown(long long now){
long long mid=(tr[now].l+tr[now].r)>>;
if(tr[now].lazy!=-){
tr[now*].lazy=tr[now*+].lazy=tr[now].lazy;
tr[now*].sum=(mid-tr[now].l+)*tr[now].lazy;
tr[now*+].sum=(tr[now].r-mid)*tr[now].lazy;
tr[now*].sev=tr[now*+].sev=;
tr[now].lazy=-;
}
if(tr[now].sev){
tr[now*].sev^=;
tr[now*+].sev^=;
tr[now*].sum=(mid-tr[now].l+)-tr[now*].sum;
tr[now*+].sum=(tr[now].r-mid)-tr[now*+].sum;
tr[now].sev=;
}
}
void update(long long l,long long r,long long now,long long k){
// cout<<l<<" "<<r<<" "<<tr[now].l<<" "<<tr[now].r<<" "<<now<<endl;
pushdown(now);
if(tr[now].l==l&&tr[now].r==r){
tr[now].sum=(tr[now].r-tr[now].l+)*k;
tr[now].lazy=k;
tr[now].sev=;
return ;
}
long long mid=(tr[now].l+tr[now].r)>>;
if(l>mid){
update(l,r,now*+,k);
}
else if(r<=mid){
update(l,r,now*,k);
}
else{
update(l,mid,now*,k);
update(mid+,r,now*+,k);
}
tr[now].sum=tr[now*].sum+tr[now*+].sum;
}
void serve(long long l,long long r,long long now){
pushdown(now);
if(tr[now].l==l&&tr[now].r==r){
tr[now].sum=(tr[now].r-tr[now].l+)-tr[now].sum;
tr[now].sev^=;
return;
}
long long mid=(tr[now].l+tr[now].r)>>;
if(l>mid)serve(l,r,now*+);
else if(r<=mid)serve(l,r,now*);
else{
serve(l,mid,now*);
serve(mid+,r,now*+);
}
tr[now].sum=tr[now*].sum+tr[now*+].sum;
}
void check(long long now){
if(tr[now].l==tr[now].r){
printf("%lld\n",b[tr[now].l]);
return ;
}
long long mid=(tr[now].l+tr[now].r)>>;
pushdown(now);
if(tr[now*].sum<mid-tr[now].l+)check(now*);
else return check(now*+);
}
int main(){
scanf("%lld",&m);
for(long long i=;i<=m;i++){
scanf("%lld%lld%lld",&q[i].k,&q[i].l,&q[i].r);
q[i].r++;
b[++cnt]=q[i].l;
b[++cnt]=q[i].r;
}
b[++cnt]=;
sort(b+,b++cnt);
n=unique(b+,b++cnt)-(b+);
for(long long i=;i<=n;i++){
mp[b[i]]=i;
}
build(,n,);
for(long long i=;i<=m;i++){
if(q[i].k==){
update(mp[q[i].l],mp[q[i].r]-,,);
}
else if(q[i].k==){
update(mp[q[i].l],mp[q[i].r]-,,);
}
else{
serve(mp[q[i].l],mp[q[i].r]-,);
}
check();
}
return ;
}
CF817F MEX Queries(线段树上二分)的更多相关文章
- HDU 4747 Mex【线段树上二分+扫描线】
[题意概述] 一个区间的Mex为这个区间没有出现过的最小自然数,现在给你一个序列,要求求出所有区间的Mex的和. [题解] 扫描线+线段树. 我们在线段树上维护从当前左端点开始的前缀Mex,显然从左到 ...
- LOJ 3059 「HNOI2019」序列——贪心与前后缀的思路+线段树上二分
题目:https://loj.ac/problem/3059 一段 A 选一个 B 的话, B 是这段 A 的平均值.因为 \( \sum (A_i-B)^2 = \sum A_i^2 - 2*B \ ...
- 贪心+离散化+线段树上二分。。。 Samara University ACM ICPC 2016-2017 Quarterfinal Qualification Contest G. Of Zorcs and Axes
题目链接:http://codeforces.com/gym/101149/problem/G 题目大意:给你n对数字,为(a[i], b[i]),给你m对数字,为(w[i], c[i]).给n对数字 ...
- 【BZOJ】4293: [PA2015]Siano 线段树上二分
[题意]给定n棵高度初始为0的草,每天每棵草会长高a[i],m次收割,每次在d[i]天将所有>b[i]的草收割到b[i],求每次收割量.n<=500000. [算法]线段树上二分 [题解] ...
- hdu 5930 GCD 线段树上二分/ 强行合并维护信息
from NOIP2016模拟题28 题目大意 n个点的序列,权值\(<=10^6\) q个操作 1.单点修改 2.求所有区间gcd中,不同数个数 分析 1.以一个点为端点,向左或向右的gcd种 ...
- [NOIP2015模拟10.27] [JZOJ4270] 魔道研究 解题报告(动态开点+权值线段树上二分)
Description “我希望能使用更多的魔法.不对,是预定能使用啦.最终我要被大家称呼为大魔法使.为此我决定不惜一切努力.”——<The Grimoire of Marisa>雾雨魔理 ...
- 【洛谷5537】【XR-3】系统设计(哈希_线段树上二分)
我好像国赛以后就再也没有写过 OI 相关的博客 qwq Upd: 这篇博客是 NOIP (现在叫 CSP 了)之前写的,但是咕到 CSP 以后快一个月才发表 -- 我最近这么咕怎么办啊 -- 题目 洛 ...
- 5.4 省选模拟赛 修改 线段树优化dp 线段树上二分
LINK:修改 题面就不放了 大致说一下做法.不愧是dls出的题 以前没见过这种类型的 不过还是自己dp的时候写丑了. 从这道题中得到一个结论 dp方程要写的优美一点 不过写的过丑 优化都优化不了. ...
- 9 16 模拟赛&关于线段树上二分总结
1 考试时又犯了一个致命的错误,没有去思考T2的正解而是去简单的推了一下式子开始了漫漫找规律之路,不应该这样做的 为了得到规律虽然也打了暴力 但是还是打了一些不必要的程序 例如求组合数什么的比较浪费时 ...
随机推荐
- 51nod 1717 好数 (水题)
题目: 看起来很复杂,其实就是有多少个素因子就翻转多少次. 然后考虑到只有平方数有奇数个素因子. 一次过,上代码把: #include <iostream> #include <al ...
- Windows 安装PostgreSQL
下载二进制包:https://www.enterprisedb.com/download-postgresql-binaries 直接解压到C盘 Microsoft Windows [版本 6.3.9 ...
- 《剑指offer》数组中出现次数超过一半的数字
一.题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出 ...
- 关于exsi的虚拟网络
相关术语: VM Network 默认的网络 VSwitch (默认)标准交换机 (exsi的内核中) Port groups (用来定义各个不同vlan) DVSwitch分布式交换机(exs ...
- pthread 的 api 分类
pthreads defines a set of C programming language types, functions and constants. It is implemented w ...
- Javascript平稳退化、渐进增强
平稳退化 : javascript平稳退化就是如果一个浏览器完全不支持js或者禁用js的时候,它的基本功能不会受到任何影响.比方说一个网站使用了大量javascript来优化页面,我们现在把浏览器的j ...
- springMVC小项目实例
一.什么是 Spring MVC Spring MVC 属于 SpringFrameWork 的后续产品,已经融合在 Spring Web Flow 里面,是一个强大灵活的 Web 框架.Spring ...
- Hadoop_MapReduce中Mapper类和Reduce类
在权威指南中,有个关于处理温度的MapReduce类,具体如下: 第一部分:Map public class MaxTemperatureMapper extends MapReduceBase im ...
- [NOI2018]你的名字(68pts) 后缀自动机
讲解在满分做法的博客中 Code: #include <cstdio> #include <algorithm> #include <cstring> #defin ...
- BZOJ 5254 [Fjwc2018]红绿灯 (线段树)
题目大意:一个wly从家走到学校要经过n个红绿灯,绿灯持续时间是$g$,红灯是$r$,所有红绿灯同时变红变绿,交通规则和现实中一样,不能抢红灯,两个红绿灯之间道路的长度是$di$,一共$Q$个询问,求 ...