题意

维护一个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(线段树上二分)的更多相关文章

  1. HDU 4747 Mex【线段树上二分+扫描线】

    [题意概述] 一个区间的Mex为这个区间没有出现过的最小自然数,现在给你一个序列,要求求出所有区间的Mex的和. [题解] 扫描线+线段树. 我们在线段树上维护从当前左端点开始的前缀Mex,显然从左到 ...

  2. LOJ 3059 「HNOI2019」序列——贪心与前后缀的思路+线段树上二分

    题目:https://loj.ac/problem/3059 一段 A 选一个 B 的话, B 是这段 A 的平均值.因为 \( \sum (A_i-B)^2 = \sum A_i^2 - 2*B \ ...

  3. 贪心+离散化+线段树上二分。。。 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对数字 ...

  4. 【BZOJ】4293: [PA2015]Siano 线段树上二分

    [题意]给定n棵高度初始为0的草,每天每棵草会长高a[i],m次收割,每次在d[i]天将所有>b[i]的草收割到b[i],求每次收割量.n<=500000. [算法]线段树上二分 [题解] ...

  5. hdu 5930 GCD 线段树上二分/ 强行合并维护信息

    from NOIP2016模拟题28 题目大意 n个点的序列,权值\(<=10^6\) q个操作 1.单点修改 2.求所有区间gcd中,不同数个数 分析 1.以一个点为端点,向左或向右的gcd种 ...

  6. [NOIP2015模拟10.27] [JZOJ4270] 魔道研究 解题报告(动态开点+权值线段树上二分)

    Description “我希望能使用更多的魔法.不对,是预定能使用啦.最终我要被大家称呼为大魔法使.为此我决定不惜一切努力.”——<The Grimoire of Marisa>雾雨魔理 ...

  7. 【洛谷5537】【XR-3】系统设计(哈希_线段树上二分)

    我好像国赛以后就再也没有写过 OI 相关的博客 qwq Upd: 这篇博客是 NOIP (现在叫 CSP 了)之前写的,但是咕到 CSP 以后快一个月才发表 -- 我最近这么咕怎么办啊 -- 题目 洛 ...

  8. 5.4 省选模拟赛 修改 线段树优化dp 线段树上二分

    LINK:修改 题面就不放了 大致说一下做法.不愧是dls出的题 以前没见过这种类型的 不过还是自己dp的时候写丑了. 从这道题中得到一个结论 dp方程要写的优美一点 不过写的过丑 优化都优化不了. ...

  9. 9 16 模拟赛&关于线段树上二分总结

    1 考试时又犯了一个致命的错误,没有去思考T2的正解而是去简单的推了一下式子开始了漫漫找规律之路,不应该这样做的 为了得到规律虽然也打了暴力 但是还是打了一些不必要的程序 例如求组合数什么的比较浪费时 ...

随机推荐

  1. 51nod 1717 好数 (水题)

    题目: 看起来很复杂,其实就是有多少个素因子就翻转多少次. 然后考虑到只有平方数有奇数个素因子. 一次过,上代码把: #include <iostream> #include <al ...

  2. Windows 安装PostgreSQL

    下载二进制包:https://www.enterprisedb.com/download-postgresql-binaries 直接解压到C盘 Microsoft Windows [版本 6.3.9 ...

  3. 《剑指offer》数组中出现次数超过一半的数字

    一.题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字.例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}.由于数字2在数组中出现了5次,超过数组长度的一半,因此输出 ...

  4. 关于exsi的虚拟网络

    相关术语: VM Network 默认的网络 VSwitch   (默认)标准交换机 (exsi的内核中) Port groups  (用来定义各个不同vlan) DVSwitch分布式交换机(exs ...

  5. pthread 的 api 分类

    pthreads defines a set of C programming language types, functions and constants. It is implemented w ...

  6. Javascript平稳退化、渐进增强

    平稳退化 : javascript平稳退化就是如果一个浏览器完全不支持js或者禁用js的时候,它的基本功能不会受到任何影响.比方说一个网站使用了大量javascript来优化页面,我们现在把浏览器的j ...

  7. springMVC小项目实例

    一.什么是 Spring MVC Spring MVC 属于 SpringFrameWork 的后续产品,已经融合在 Spring Web Flow 里面,是一个强大灵活的 Web 框架.Spring ...

  8. Hadoop_MapReduce中Mapper类和Reduce类

    在权威指南中,有个关于处理温度的MapReduce类,具体如下: 第一部分:Map public class MaxTemperatureMapper extends MapReduceBase im ...

  9. [NOI2018]你的名字(68pts) 后缀自动机

    讲解在满分做法的博客中 Code: #include <cstdio> #include <algorithm> #include <cstring> #defin ...

  10. BZOJ 5254 [Fjwc2018]红绿灯 (线段树)

    题目大意:一个wly从家走到学校要经过n个红绿灯,绿灯持续时间是$g$,红灯是$r$,所有红绿灯同时变红变绿,交通规则和现实中一样,不能抢红灯,两个红绿灯之间道路的长度是$di$,一共$Q$个询问,求 ...