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的正解而是去简单的推了一下式子开始了漫漫找规律之路,不应该这样做的 为了得到规律虽然也打了暴力 但是还是打了一些不必要的程序 例如求组合数什么的比较浪费时 ...
随机推荐
- luogu 2679 子串
子串 史上最简短的一篇博客,毕竟看题解ac心疼我的kmp /* f[i][j][k][0/1]表示A的前i个,B的前j个,用到了k个子串,当前字符选或者不选. 所以f[0][0][0][0]的方案数为 ...
- 解决JavaScript浮点数(小数) 运算出现Bug的方法
解决JS浮点数(小数) 运算出现Bug的方法例如37.2 * 5.5 = 206.08 就直接用JS算了一个结果为: 204.60000000000002 怎么会这样, 两个只有一位小数的数字相乘, ...
- SQL控制语句基础
SQL变量 全局变量: 全局变量是由系统定义和维护的使用两个@作为前缀,不能由用户声明和赋值! 常用的全局变量如下 @@version :获取当前使用的SQL Server版本号 EG: select ...
- 51nod 1785 数据流中的算法 (方差计算公式)
1785 数据流中的算法 基准时间限制:1.5 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 51nod近日上线了用户满意度检测工具,使用高级人工智能算法,通过用户访问时间.鼠 ...
- SQL语句调优相关方法
SQL语句慢的原因:1,数据库表的统计信息不完整2,like查询估计不准确调优方法:1,查看表中数据的条数:2, explain analyze target_SQL;查看SQL执行计划:比较SQL总 ...
- Vue this.$router.push、replace、go的区别
1.this.$router.push 描述:跳转到不同的url,但这个方法会向history添加一个记录,点击后会返回到上一个页面 用法 //字符串 this.$router.push('home' ...
- Android Studio 开发安卓软件时下载的工程项目 Sync with gradle 失败
Sync with gradle 失败的原因有很多,其中很多时候会遇到下载下来的工程同步失败,目前的经验来看下载的工程同步失败均是由于下图中的两个配置其中某个缺少了 google() 或者 jcent ...
- vue之父子组件间通信实例讲解(props、$ref、$emit)
组件间如何通信,也就成为了vue中重点知识了.这篇文章将会通过props.$ref和 $emit 这几个知识点,来讲解如何实现父子组件间通信. 组件是 vue.js 最强大的功能之一,而组件实例 ...
- angular.js和vue.js中实现函数去抖(debounce)
问题描述 搜索输入框中,只当用户停止输入后,才进行后续的操作,比如发起Http请求等. 学过电子电路的同学应该知道按键防抖.原理是一样的:就是说当调用动作n毫秒后,才会执行该动作,若在这n毫秒内又调用 ...
- ERROR in xxxx.js from UglifyJS——配置版本混杂版
常规解决套路可以参考这篇:https://segmentfault.com/a/11... 我采用了上面的做法,依然没法解决.我采用的是vue-cli脚手架自动生成的项目结构: vue-cli版本 2 ...