题面传送门
首先用两颗线段树维护每个点所在的亮灯联通块。
然后再建一颗二维线段树,每个点表示到当前为止,有多少个时刻能从iii到jjj。
对于每次修改,依靠两颗线段树维护的区间,来修改。
这里有一个小技巧,在修改时加上q−tq-tq−t,修改时减去,就是答案,还能累加。
查询就查当前点就好了。
代码实现:

#include<cstdio>
using namespace std;
int n,m,k,x,y,z,tot,root[300039],a[300039];
char s;
struct tree{int l,r,f;}f[90000039];
struct set{int f[1200039];inline void jianshu(int l,int r,int now){if(l==r){f[now]=l;return;}int m=(l+r)>>1;jianshu(l,m,now<<1);jianshu(m+1,r,now<<1|1);}inline void push(int now){if(f[now]){f[now<<1]=f[now<<1|1]=f[now];f[now]=0;}}inline void get(int x,int y,int z,int l,int r,int now){if(x<=l&&r<=y){f[now]=z;return;}int m=(l+r)>>1;push(now);if(x<=m) get(x,y,z,l,m,now<<1);if(y>m) get(x,y,z,m+1,r,now<<1|1);}inline int find(int x,int l,int r,int now){if(l==r) return f[now];push(now);int m=(l+r)>>1;if(x<=m) return find(x,l,m,now<<1);else return find(x,m+1,r,now<<1|1);}
}fs[2];
inline void gets(int x,int y,int l,int r,int now){f[now].f+=y;if(l==r) return;int m=(l+r)>>1;if(x<=m) {if(!f[now].l) f[now].l=++tot;gets(x,y,l,m,f[now].l);}else{if(!f[now].r) f[now].r=++tot;gets(x,y,m+1,r,f[now].r);}
}
inline void get(int x,int y,int z){if(y>n+1) return;while(x<=k){if(!root[x]) root[x]=++tot;gets(y,z,1,k,root[x]);x+=x&-x;}
}
inline int finds(int x,int y,int l,int r,int now){if(x<=l&&r<=y) return f[now].f;int m=(l+r)>>1,fs=0;if(x<=m&&f[now].l) fs+=finds(x,y,l,m,f[now].l);if(y>m&&f[now].r) fs+=finds(x,y,m+1,r,f[now].r);return fs;
}
inline int find(int x,int y){int ans=0;while(x){if(root[x]) ans+=finds(1,y,1,k,root[x]);x-=x&-x;}return ans;
}
int main(){//  freopen("12","r",stdin);
//  freopen("1.out","w",stdout);register int i;scanf("%d%d",&n,&m);k=n+1;for(i=1;i<=n;i++){s=getchar();while(s<'0'||s>'9') s=getchar();a[i]=s-'0';}fs[1].jianshu(1,k,1);fs[0].jianshu(1,k,1);for(i=1;i<=n;i++){if(a[i]){x=fs[0].find(i,1,k,1);y=fs[1].find(i+1,1,k,1);get(i+1,y+1,m);get(x,i+1,m);get(x,y+1,-m);get(i+1,i+1,-m);fs[0].get(x,y,x,1,k,1);fs[1].get(x,y,y,1,k,1);//printf("%d %d %d\n",x,y,tot);}} for(i=1;i<=m;i++){s=getchar();while(s<'a'||s>'z') s=getchar();if(s=='q'){s=getchar();s=getchar();s=getchar();s=getchar();scanf("%d%d",&x,&y);z=fs[1].find(x,1,k,1);if(y>z) printf("%d\n",find(x,y));else printf("%d\n",find(x,y)-(m-i));}else{s=getchar();s=getchar();s=getchar();s=getchar();s=getchar();scanf("%d",&z);a[z]^=1;if(a[z]){x=fs[0].find(z,1,k,1);y=fs[1].find(z+1,1,k,1);//printf("%d %d\n",x,y);get(z+1,y+1,m-i);get(x,z+1,m-i);get(x,y+1,-m+i);get(z+1,z+1,-m+i);fs[0].get(x,y,x,1,k,1);fs[1].get(x,y,y,1,k,1);}else{//if(z==2)printf("%d %d\n",x,y);x=fs[0].find(z,1,k,1);y=fs[1].find(z,1,k,1);get(z+1,y+1,-m+i);get(x,z+1,-m+i);get(x,y+1,m-i);get(z+1,z+1,m-i);fs[1].get(x,z,z,1,k,1);fs[0].get(z+1,y,z+1,1,k,1);}}//printf("%d %d\n",fs[0].find(2,1,k,1),fs[1].find(2,1,k,1));}
}

luogu P5445 [APIO2019]路灯相关推荐

  1. P5445 [APIO2019]路灯

    传送门· 对于询问 $(a,b)$ ,感觉一维很不好维护,考虑把询问看成平面上的一个点,坐标为 $(a,b)$ 每个坐标 $(x,y)$ 的值表示到当前 $x$ 和 $y$ 联通的时间和 考虑一个修改 ...

  2. luogu P1220 关路灯

    题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯. 为了给村 ...

  3. APIO2019简要题解

    Luogu P5444 [APIO2019]奇怪装置 看到这种题,我们肯定会想到\((x,y)\)一定有循环 我们要找到循环节的长度 推一下发现\(x\)的循环节长为\(\frac{AB}{B+1}\ ...

  4. 【LUOGU P1220】关路灯(区间dp)

    一开始直接搜索+剪枝,拿了50分,发现原来是搜索搜复杂了..因为搜索是可以过的 注意到题目中有一句''再回过头来关掉另一边的路灯,而事实并非如此,因为在关的过程中适当地调头有可能会更省一些" ...

  5. P5445-[APIO2019]路灯【set,树状数组套线段树】

    正题 题目链接:https://www.luogu.com.cn/problem/P5445 题目大意 n+1n+1n+1个点,iii和i+1i+1i+1个点之间有一条边,qqq个操作 断开/连接第x ...

  6. 【区间dp】洛谷 P1220 关路灯

    P1220 关路灯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 有一排路灯,老张有一个初始位置,他要把所有路灯都关掉.每个路灯都有各自的功率和坐标,问你关掉所有路灯所消耗 ...

  7. luogu P1549 棋盘问题(2) 题解

    luogu P1549 棋盘问题(2) 题解 题目描述 在\(N * N\)的棋盘上\((1≤N≤10)\),填入\(1,2,-,N^2\)共\(N^2\)个数,使得任意两个相邻的数之和为素数. 例如 ...

  8. [Luogu] 选学霸

    https://www.luogu.org/problemnew/show/P2170 并查集+DP #include <iostream> #include <cstring> ...

  9. 单片机红绿灯电路灯有几种_LED路灯电源防雷与设计方案

    引言 路灯安装在户外,雷击是一个非常大的威胁.轻则导致路灯损坏,重则引起火灾或人员伤亡,产生巨大的损失.在此,就向大家介绍一下关于雷电对LED路灯的影响以及防范措施. 本文总结雷击主要有以下四种类型: ...

最新文章

  1. 机器学习进阶-图像形态学操作-腐蚀操作 1.cv2.erode(进行腐蚀操作)
  2. 也许开发需要的只是一份简单明了的表格
  3. 聚集索引:SQL Server 进阶 Level 3
  4. 【Java 虚拟机原理】Dalvik 虚拟机 ( 打包 Jar 文件和 Dex 文件 | 反编译 Dex 文件 | 分析 Dex 文件反编译结果 )
  5. TX2下编译qt程序步骤
  6. 烽火服务器怎么进入bios系统,装机高手告诉你如何进入bios
  7. 在同一台服务器上安装两个数据库
  8. 关系型数据库中主键(primary key)和外键(foreign key)的概念。
  9. 这只拒绝内卷的 AI 狼火了!高智商却自暴自弃,不想抓羊只想躺
  10. Linux学习笔记:REHL AS4的上网配置,Http服务安装及配置,ftp服务的安装及配置
  11. 如何完成知识问答环节中的前期设置,题目准备及现场操作等主要流程?
  12. QCustomplot 实现鼠标追踪定位线以及坐标
  13. 开源视频服务器软件MJPG-streamer研究
  14. 苹果录屏没声音_iPhone XR突然没声音如何解决?西安苹果售后维修点教你几招方法...
  15. 开源OA协同办公系统:O2OA搭建企业微信办公首页说明
  16. 算法笔记(18)数据升维及Python代码实现
  17. DMS应用性能管理案例分析(二)
  18. jvm调优五:jvm调优工具和调优实战
  19. DOS之父加里·基尔代尔
  20. 窃密软件访问的文件和注册表

热门文章

  1. input 输入事件防抖
  2. 使用函数sample进行抽样
  3. pandas样本分层抽样(可以自己设置每一个类别抽取多少个样本)
  4. D - 折线分割平面 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d %I64u
  5. 工控CTF之协议分析2——MMS
  6. 可以不学html直接学vue吗,vue一定要学node吗?
  7. 数据分析实战:python热门音乐分析 附代码+数据 +论文(PCA 主成分分析,sklearn 机器学习,pytorch 神经网络,k-means 聚类,Librosa 音频处理,midi 音序)
  8. 7-1 录入学生成绩并统计及格人数、不及格人数及平均分 (50分)----c++综合实验
  9. L1-8 牛的对称 (20 分)
  10. RSA的运用和前后端签名的一些看法