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的正解而是去简单的推了一下式子开始了漫漫找规律之路,不应该这样做的 为了得到规律虽然也打了暴力 但是还是打了一些不必要的程序 例如求组合数什么的比较浪费时 ...
随机推荐
- NOIP2012 T3开车旅行 set+倍增
70分做法: 先预处理出所有点的最近和次近(O(n^2)一遍就OK) 然后暴力求出每个解(O(nm)) //By SiriusRen #include <cstdio> #include ...
- vue组件样式添加scoped属性之后,无法被父组件修改。或者无法在本组件修改element UI样式
在vue开发中,需要使用scoped属性避免样式的全局干扰,但是这样在父组件中是无法被修改的,不仅如此如果项目中用了UI框架比如element Ui,这个时候在本组件也无法修改样式,因为权重问题.但是 ...
- 由ubuntu装好想到的
这篇不是技术文,有点唠叨的总结.不喜勿喷. 最近开始全面学ubuntu,一翻书回忆起本科没选但是去听了的Linux.当时看的还是楚广明的fedora教程,这多年过去综合很多人的说 法,fedora不稳 ...
- 《Unix环境高级编程》读书笔记 第5章-标准I/O流
1. 引言 标准I/O库由ISO C标准说明,由各个操作系统实现 标准I/O库处理很多细节,如缓冲区分配.以优化的块长度执行I/O等.这些处理使用户不必担心如何使用正确的块长度,这使得它便于用于使用, ...
- 服务器搭建域控与SQL Server的AlwaysOn环境过程(二) 搭建客户端节点 服务器
1. 修改客户端服务器的计算机名,重启后,如果服务器属于克隆服务器,需要修改服务器SID,如果没有则调过这一步. 命令行方式:启动Windows2008进入系统后,打开“CMD窗口”并进入到" ...
- python继承 super()
写这篇博文,始于以下问题的探究: #coding:utf-8 class A(object): def __init__(self): print 'enter A' print 'leave A' ...
- 关于python return 和 print 的区别
概念上一个是 返回值 一个是打印输出 区别一:return是结束语一般放在函数的最后,当你在return 结束后面再写一些东西是不执行的如 下 def renshu(x,y): h=x+y pri ...
- mariadb-增删改查怎么用
MariaDB 数据类型 MariaDB数据类型可以分为数字,日期和时间以及字符串值. 使用数据类型的原则:够用就行,尽量使用范围小的,而不用大的 常用的数据类型 整数:int, (bit比整数还要小 ...
- thymeleaf 拼接 超链接
<dd><a th:href="@{/get/{id}(id=${user.id})}">基本资料</a></dd>
- deque迭代器失效的困惑?
在实现LRU算法的时候lru_list 開始用的是deque 可是由于害怕其在插入删除上的迭代器失效情况的诡异情况.遂用list取代之. 在数据量比較大的时候性能不是非常好.性能优化分析的时候决定用d ...