题解

维护区间内1的个数,左边数0的长度,右边数0的长度,区间内0区间最长个数,覆盖标记

第一种操作区间覆盖0

第二种操作查询\([l_0,r_0]\)中1的个数,区间覆盖0,然后覆盖时找到相对应的区间时对于如果1够把这个区间覆盖掉的话就直接cover,否则就递归该区间,如果能覆盖左区间就覆盖去右区间否则就覆盖左区间

第三种操作直接查询左右区间特判跨越中间

代码

#include <bits/stdc++.h>
#define enter putchar('\n')
#define space putchar(' ')
#define pii pair<int,int>
#define fi first
#define se second
#define MAXN 200005
#define pb push_back
//#define ivorysi
using namespace std;
typedef long long int64;
typedef double db;
template<class T>
void read(T &res) {
res = 0;T f = 1;char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') f = -1;
c = getchar();
}
while(c >= '0' && c <= '9') {
res = res * 10 + c - '0';
c = getchar();
}
res *= f;
}
template<class T>
void out(T x) {
if(x < 0) {x = -x;putchar('-');}
if(x >= 10) out(x / 10);
putchar('0' + x % 10);
}
int N,M;
struct node {
int l,r,ll,rl,cov,cnt,v;
}tr[MAXN * 4];
void cover(int u,int v) {
int len = tr[u].r - tr[u].l + 1;
tr[u].cov = v;
if(!v) {tr[u].ll = len;tr[u].rl = len;tr[u].v = len;tr[u].cnt = 0;}
else {tr[u].ll = 0;tr[u].rl = 0;tr[u].v = 0;tr[u].cnt = len;}
}
void update(int u) {
tr[u].v = max(tr[u << 1].v,tr[u << 1 | 1].v);
tr[u].v = max(tr[u << 1].rl + tr[u << 1 | 1].ll,tr[u].v);
tr[u].cnt = tr[u << 1].cnt + tr[u << 1 | 1].cnt;
tr[u].ll = (!tr[u << 1].cnt) ? tr[u << 1].r - tr[u << 1].l + 1 + tr[u << 1 | 1].ll : tr[u << 1].ll;
tr[u].rl = (!tr[u << 1 | 1].cnt) ? tr[u << 1 | 1].r - tr[u << 1 | 1].l + 1 + tr[u << 1].rl : tr[u << 1 | 1].rl;
}
void push_down(int u) {
if(tr[u].cov != -1) {
cover(u << 1,tr[u].cov);
cover(u << 1 | 1,tr[u].cov);
tr[u].cov = -1;
}
}
void build(int u,int l,int r) {
tr[u].l = l;tr[u].r = r;tr[u].cov = -1;
if(l == r) {
cover(u,1);
return;
}
int mid = (l + r) >> 1;
build(u << 1,l,mid);
build(u << 1 | 1,mid + 1,r);
update(u);
} int cmp(int a,int b,int on) {
if(!on) return a + b;
else return max(a,b);
}
int Query(int u,int l,int r,int on) {
if(tr[u].l == l && tr[u].r == r) {
if(!on) return tr[u].cnt;
else return tr[u].v;
}
push_down(u);
int mid = (tr[u].l + tr[u].r) >> 1;
if(r <= mid) return Query(u << 1,l,r,on);
else if(l > mid) return Query(u << 1 | 1,l,r,on);
else {
int x = cmp(Query(u << 1,l,mid,on),Query(u << 1 | 1,mid + 1,r,on),on);
if(on) {
int pl = max(l,tr[u << 1].r - tr[u << 1].rl + 1),pr = min(r,tr[u << 1 | 1].l + tr[u << 1 | 1].ll - 1);
x = max(x,pr - pl + 1);
}
return x;
}
}
void Cover(int u,int l,int r,int v) {
if(tr[u].l == l && tr[u].r == r) {cover(u,v);return;}
push_down(u);
int mid = (tr[u].l + tr[u].r) >> 1;
if(r <= mid) Cover(u << 1,l,r,v);
else if(l > mid) Cover(u << 1 | 1,l,r,v);
else {Cover(u << 1,l,mid,v);Cover(u << 1 | 1,mid + 1,r,v);}
update(u);
}
void repair(int u,int cnt) {
if(!cnt) return;
if(tr[u].l == tr[u].r) {cover(u,1);return;}
push_down(u);
if(tr[u << 1].r - tr[u << 1].l + 1 - tr[u << 1].cnt <= cnt) {
cnt -= tr[u << 1].r - tr[u << 1].l + 1 - tr[u << 1].cnt;cover(u << 1,1);
repair(u << 1 | 1,cnt);
}
else repair(u << 1,cnt);
update(u);
}
int C;
void Repair(int u,int l,int r) {
if(!C) return;
if(tr[u].l == l && tr[u].r == r) {
if(C >= r - l + 1 - tr[u].cnt) {
C -= r - l + 1 - tr[u].cnt;
cover(u,1);
}
else {repair(u,C);C = 0;}
return;
}
int mid = (tr[u].l + tr[u].r) >> 1;
push_down(u);
if(r <= mid) Repair(u << 1,l,r);
else if(l > mid) Repair(u << 1 | 1,l,r);
else {Repair(u << 1,l,mid);Repair(u << 1 | 1,mid + 1,r);}
update(u);
}
void Solve() {
read(N);read(M);
build(1,1,N);
int op,l0,r0,l1,r1;
for(int i = 1 ; i <= M ; ++i) {
read(op);read(l0);read(r0);
if(op == 1) {read(l1);read(r1);}
if(op == 0) {
Cover(1,l0,r0,0);
}
else if(op == 1) {
C = Query(1,l0,r0,0);
Cover(1,l0,r0,0);
Repair(1,l1,r1);
}
else {
out(Query(1,l0,r0,1));enter;
}
}
}
int main() {
#ifdef ivorysi
freopen("f1.in","r",stdin);
#endif
Solve();
return 0;
}

水题,但是我忘pushdown了,WA了一次,代码能力--

【LOJ】#2037. 「SHOI2015」脑洞治疗仪的更多相关文章

  1. loj #2037. 「SHOI2015」脑洞治疗仪

    #2037. 「SHOI2015」脑洞治疗仪   题目描述 曾经发明了自动刷题机的发明家 SHTSC 又公开了他的新发明:脑洞治疗仪——一种可以治疗他因为发明而日益增大的脑洞的神秘装置. 为了简单起见 ...

  2. LibreOJ #2037. 「SHOI2015」脑洞治疗仪

    线段树区间合并问题 恶心... 屠龙宝刀点击就送 #include <cstdio> #define N 200005 struct Segment { int l,r,mid,sum,l ...

  3. loj#2038. 「SHOI2015」超能粒子炮・改

    题目链接 loj#2038. 「SHOI2015」超能粒子炮・改 题解 卢卡斯定理 之后对于%p分类 剩下的是个子问题递归 n,k小于p的S可以预处理,C可以卢卡斯算 代码 #include<c ...

  4. [LOJ 2039] 「SHOI2015」激光发生器

    [LOJ 2039] 「SHOI2015」激光发生器 链接 链接 题解 分为两个部分 第一个是求直线之间的交点找到第一个触碰到的镜面 第二个是求直线经过镜面反射之后的出射光线 第一个很好做,第二个就是 ...

  5. Loj #2036. 「SHOI2015」自动刷题机

    link : https://loj.ac/problem/2036 这个显然具有单调性,N小的话更容易A题,不仅因为A一次题减少的代码,并且A题的下限也低. 所以直接上二分就行了,注意上限一定不要设 ...

  6. LOJ#2039. 「SHOI2015」激光发生器(计算几何)

    题面 传送门 题解 如果我初中科学老师知道我有一天计算的时候入射角不等于反射角不知道会不会把我抓起来打一顿-- 这题本质上就是个模拟,需要的芝士也就计蒜几盒的那点,不过注意细节很多,放到考场上只能看看 ...

  7. Loj #2192. 「SHOI2014」概率充电器

    Loj #2192. 「SHOI2014」概率充电器 题目描述 著名的电子产品品牌 SHOI 刚刚发布了引领世界潮流的下一代电子产品--概率充电器: 「采用全新纳米级加工技术,实现元件与导线能否通电完 ...

  8. Loj #3096. 「SNOI2019」数论

    Loj #3096. 「SNOI2019」数论 题目描述 给出正整数 \(P, Q, T\),大小为 \(n\) 的整数集 \(A\) 和大小为 \(m\) 的整数集 \(B\),请你求出: \[ \ ...

  9. Loj #3093. 「BJOI2019」光线

    Loj #3093. 「BJOI2019」光线 题目描述 当一束光打到一层玻璃上时,有一定比例的光会穿过这层玻璃,一定比例的光会被反射回去,剩下的光被玻璃吸收. 设对于任意 \(x\),有 \(x\t ...

随机推荐

  1. 51NOD 1445 变色DNA

    1445 变色DNA 有一只特别的狼,它在每个夜晚会进行变色,研究发现它可以变成N种颜色之一,将这些颜色标号为0,1,2...N-1.研究发现这只狼的基因中存在一个变色矩阵,记为colormap,如果 ...

  2. 大量DOM操作的解决方案

    案例:如何在页面元素ul中一次性插入30000个li标签,保证页面体验流畅呢? 解决方案:可以从减少 DOM 操作次数.缩短循环时间两个方面减少主线程阻塞的时间 减少 DOM 操作次数的良方是 Doc ...

  3. H5离线存储-manifest

    起源 html5之前的网页,都是无连接,必须联网才能访问,这其实也是web的特色,这其实对于PC是时代问题并不大,但到了移动互联网时代,设备终端位置不再固定,依赖无线信号,网络的可靠性变得降低,比如坐 ...

  4. springboot中@webfilter注解的filter时注入bean都是null

    在使用@Webfilter注解Filter的情况下,不上外部tomcat时是没有问题的.但是在tomcat下运行时,filter中注入的bean就都是null 解决办法: 一:去掉@Webfilter ...

  5. Java并发编程原理与实战三十六:阻塞队列&消息队列

    一.阻塞队列 1.阻塞队列BlockingQueue ---->可以理解成生产者消费者的模式---->消费者要等待到生产者生产出来产品.---->而非阻塞队列ConcurrentLi ...

  6. JavaScript实现单向链表

    JavaScript 本身提供了十分好用的数据类型,以满足大家的日常使用.单靠 Array  和 Object 也的确足够应付日常的绝大部分需求,这也导致了很多前端er对数据结构这一块不是十分的了解. ...

  7. 小程序web-view wx.miniProgram.postMessage 坑记录

    web-view吧,其实微信官方应该是非常不支持在小程序上嵌套web的,它希望你直接用小程序上的代码,而放弃web的实现,当然,也是为了防止用小程序去嵌套别的广告页面.所以官方对web-view的操作 ...

  8. 【解析】解析XML

    一.dom4j import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.DocumentHelp ...

  9. 调整扩大VMDK格式VirtualBox磁盘空间

    如果虚拟机的格式是VDI格式的, 那么可以通过这篇文章来调整磁盘大小: 调整Virtual Box硬盘大小 不过楼主当初在创建虚拟机的时候,是用的VMDK格式, 以求与VMWare的兼容性.这时候要扩 ...

  10. 配置replica set的常见问题

    总有人问起配置ReplicaSet不成功,总结了一下基本上的可能性就几种,检查步骤如下: 假设三台机器的IP分别是 A: 192.168.1.2 a.test.com B:192.168.1.3 b. ...