P4344 [SHOI2015] 脑洞治疗仪 线段树+二分

主要是维护一个连续区间,比较经典的题目,还要考虑一下二分的情况,否则很难处理,比较有难度。这里和序列操作一题的区别是不需要考虑1的个数,因为不需要取反。
传送门icon-default.png?t=N7T8https://www.luogu.com.cn/problem/P4344

#include<iostream>
using namespace std;
#define lc u<<1
#define rc u<<1|1
const int N=2e5+10;
struct Tree{int l,r;int a,la,ra,ma;//  0的个数  左连续 右连续 总连续int len,add;
}tr[N*4];//
int n,m;void mo(int u,int k){Tree &t=tr[u];if(k==0){t.a=t.la=t.ra=t.ma=t.len;t.add=0;}if(k==1){t.a=t.la=t.ra=t.ma=0;t.add=1;}
}void pushdown(int u){Tree &t=tr[u];if(t.add==0) mo(lc,0),mo(rc,0);if(t.add==1) mo(lc,1),mo(rc,1);t.add=-1;
}void pushup(Tree &t,Tree l,Tree r){t.a=l.a+r.a;t.la=((l.a==l.len) ? l.la+r.la : l.la); t.ra=((r.a==r.len) ? r.ra+l.ra : r.ra);t.ma=max(max(l.ma,r.ma),l.ra+r.la);
}void build(int u,int l,int r){tr[u]={l,r,0,0,0,0,r-l+1,-1};if(l==r) return;int m=(l+r)>>1;build(lc,l,m);build(rc,m+1,r);pushup(tr[u],tr[lc],tr[rc]);
}void update(int u,int l,int r,int k){if(l<=tr[u].l&&tr[u].r<=r){mo(u,k);return;}pushdown(u);int m=(tr[u].l+tr[u].r)>>1;if(l<=m) update(lc,l,r,k);if(r>m) update(rc,l,r,k);pushup(tr[u],tr[lc],tr[rc]);
}Tree query0(int u,int l,int r){if(l<=tr[u].l&&tr[u].r<=r){return tr[u];}pushdown(u);int m=(tr[u].l+tr[u].r)>>1;if(r<=m) return query0(lc,l,r);if(l>m) return query0(rc,l,r);Tree t;pushup(t,query0(lc,l,m),query0(rc,m+1,r));return t;
}int query0sum(int u,int l,int r){if(l<=tr[u].l&&tr[u].r<=r){return tr[u].a;}pushdown(u);int ans=0;int m=(tr[u].l+tr[u].r)>>1;if(l<=m) ans+=query0sum(lc,l,r);if(r>m) ans+=query0sum(rc,l,r);return ans;
}int main(){ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);cin>>n>>m;build(1,1,n);while(m--){int op,x1,y1;cin>>op>>x1>>y1;if(op==0) update(1,x1,y1,0);if(op==1){int x2,y2;cin>>x2>>y2;int x=(y1-x1+1)-query0sum(1,x1,y1);//1的个数update(1,x1,y1,0);int l=x2-1,r=y2+1;//二分if(x==0) continue;while(l+1<r){int mid=(l+r)>>1;if(query0sum(1,x2,mid)<=x) l=mid;else r=mid;}update(1,x2,l,1);}	if(op==2) cout<<query0(1,x1,y1).ma<<endl;	}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/557349.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024.3.21 QT

思维导图 自由发挥登录窗口的应用场景&#xff0c;实现一个登录窗口界面。&#xff08;不要使用课堂上的图片和代码&#xff0c;自己发挥&#xff0c;有利于后面项目的完成&#xff09; 要求&#xff1a; 1. 需要使用Ui界面文件进行界面设计 2. ui界面上的组件相关设置&…

2024全国水科技大会【发言单位】天健水务集团(杭州)有限公司

天健水务&#xff0c;始创于2003年&#xff0c;下属浙江天行健水务有限公司、杭州天勤水处理技术有限公司、杭州天行健新能源有限公司&#xff0c;是一家致力于现代化水处理设备与系统研发、生产及工程应用的国家高新技术企业。以天健智造、天健工程、天健运维的“一站式全流程…

[QT] QTextBrowser取消默认右键菜单项 复制链接地址

setTextInteractionFlags(Qt::TextSelectableByMouse);原理 QTextBrowser默认下有三个标志位&#xff0c;QTextBrowser右键菜单相关源码如下 源码链接 if ((d->interactionFlags & Qt::LinksAccessibleByKeyboard)|| (d->interactionFlags & Qt::LinksAccessible…

【Unity】捕捉PC桌面的插件

【背景】 之前介绍了如何用一款名为uWindowCapture的Unity免费插件在Unity的Canvas上展示PC桌面。经过一段时间的使用,本篇继续分享此插件的一些功能和限制。 在此感谢作者Hecomi。 【特征和限制】 一般局域网络环境只能最多达到15帧的帧率,所以别幻想用来窜流游戏或者看电…

外包干了20天,技术退步明显.......

先说一下自己的情况&#xff0c;大专生&#xff0c;21年通过校招进入杭州某软件公司&#xff0c;干了接近2年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落! 而我已经在一个企业干了2年的功能测试…

做独立站烧不烧钱?真做起来的话要投入多少成本?

建立一个独立网站需要花钱吗&#xff1f; 实际做起来要花多少钱&#xff1f; 这是一种灵魂的拷问&#xff0c;也是大多数想进入这个行业或者刚刚起步的人都在思考或者思考的问题。 对于这样的问题&#xff0c;没有人能够给出确切的数字&#xff0c;甚至是确定的答案。 至于为什…

openssl3.2 - note - Getting Started with OpenSSL

文章目录 openssl3.2 - note - Getting Started with OpenSSL概述笔记openssl 历史版本Configure 选项开关支持的OSopenssl 文档简介安装新闻每个平台的安装文档支持的命令列表配置文件格式环境变量 END openssl3.2 - note - Getting Started with OpenSSL 概述 看到官方文档…

STM32最小核心板使用HAL库ADC读取MCU温度(使用DMA通道)

STM32自带CPU的温度数据&#xff0c;需要使用ADC去读取。因此在MX创建项目时如图配置&#xff1a; 模块初始化代码如下&#xff1a; void MX_ADC1_Init(void) {/* USER CODE BEGIN ADC1_Init 0 *//* USER CODE END ADC1_Init 0 */ADC_ChannelConfTypeDef sConfig {0};/* USER…

日报小工具 - 钉钉定时发送Wiki日报

前言&#xff1a;   测试日报是用来记录每天测试工作的完成情况、发现的问题&#xff0c;以及问题修复进度&#xff0c;以便团队了解项目进展、及时调整计划&#xff0c;并保持信息同步交流。每日发送测试日报属于重复性工作&#xff0c;开发日报小工具结合Jenkins进行定时自…

SRC中的一些信息收集姿势

前言 前前后后挖了四个月的EDUSRC&#xff0c;顺利从路人甲升到了网络安全专家&#xff0c;从提交的内容来看大部分还是以中低危为主&#xff0c;主打的就是弱口令和未授权。 在这过程中还是比较浮躁的&#xff0c;因此接下来的时间还是要好好沉淀一下自身的技术&#xff0c;学…

【解决navicat登录报 insufficient privileges 错误】

今天使用navicat sysdba角色登录报 insufficient privileges 以下是解决方案&#xff1a; 1、使用管理员身份打开cmd登录 sqlplus sys/admin as sysdba2、给system用户授权 grant sysdba to system;登录navicat

pstree 进程树

pstree -aup a是所有all u是用户user p是pid进程号