显然,能从$l$到$r$当且仅当$[l,r)$中的灯全部都亮,以下不妨令询问的$r$全部减1

当修改节点$x$时,找到包含$x$的极大的灯(除$x$以外)全部都亮的区间$[l,r]$,即令$l_{0}\in [l,x]$且$r_{0}\in [x,r]$的询问答案加上或减去$\Delta t$(其中$\Delta t$为该询问时刻-当前修改时刻)

可以将其看作一个一次函数的形式(关于询问时刻,当然斜率只为0或1),那么问题即变为支持矩阵加(可负)和单点查询,差分后也相当于是三维偏序问题,cdq分治+线段树即可

时间复杂度为$o(n\log^{2}n)$,可以通过

  1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 300005
4 #define L (k<<1)
5 #define R (L+1)
6 #define mid (l+r>>1)
7 #define pii pair<int,int>
8 #define mp make_pair
9 #define fi first
10 #define se second
11 struct Data{
12 int p,x,y;
13 pii z;
14 }a[N<<3];
15 vector<Data>v;
16 pii sum[N<<2];
17 int E,n,m,q,t,x,y,vis[N],ans[N],f[N<<2];
18 char s[N];
19 bool cmp(Data x,Data y){
20 return (x.x>y.x)||(x.x==y.x)&&(x.p<y.p);
21 }
22 pii merge(pii x,pii y){
23 return mp(x.fi+y.fi,x.se+y.se);
24 }
25 void update(int k,int l,int r,int x,pii y){
26 sum[k]=merge(sum[k],y);
27 if (l==r)return;
28 if (x<=mid)update(L,l,mid,x,y);
29 else update(R,mid+1,r,x,y);
30 }
31 pii query(int k,int l,int r,int x,int y){
32 if ((l>y)||(x>r))return mp(0,0);
33 if ((x<=l)&&(r<=y))return sum[k];
34 return merge(query(L,l,mid,x,y),query(R,mid+1,r,x,y));
35 }
36 void update(int k,int l,int r,int x){
37 if (l==r){
38 f[k]^=1;
39 return;
40 }
41 if (x<=mid)update(L,l,mid,x);
42 else update(R,mid+1,r,x);
43 f[k]=f[L]+f[R];
44 }
45 int getl(int k,int l,int r,int x){
46 if ((l>=x)||(r<x)&&(f[k]==r-l+1))return 0;
47 if (l==r)return l;
48 int ans=getl(R,mid+1,r,x);
49 if (ans)return ans;
50 return getl(L,l,mid,x);
51 }
52 int getr(int k,int l,int r,int x){
53 if ((r<=x)||(l>x)&&(f[k]==r-l+1))return n+1;
54 if (l==r)return l;
55 int ans=getr(L,l,mid,x);
56 if (ans<=n)return ans;
57 return getr(R,mid+1,r,x);
58 }
59 void update(int k,int id){
60 update(1,1,n,k);
61 vis[k]^=1;
62 int l=getl(1,1,n,k)+1,r=getr(1,1,n,k)-1;
63 pii o1=mp(1,-id),o2=mp(-1,id);
64 if (!vis[k])swap(o1,o2);
65 a[++t]=Data{0,k,r,o1};
66 if (k>1)a[++t]=Data{0,k,k-1,o2};
67 if (l>1)a[++t]=Data{0,l-1,r,o2};
68 if ((k>1)&&(l>1))a[++t]=Data{0,l-1,k-1,o1};
69 }
70 void query(int x,int y,int id){
71 a[++t]=Data{1,x,y,mp(id,++q)};
72 }
73 void calc(int l,int r){
74 if (l==r)return;
75 v.clear();
76 for(int i=l;i<=mid;i++)
77 if (!a[i].p)v.push_back(a[i]);
78 for(int i=mid+1;i<=r;i++)
79 if (a[i].p)v.push_back(a[i]);
80 sort(v.begin(),v.end(),cmp);
81 for(int i=0;i<v.size();i++)
82 if (!v[i].p)update(1,1,n,v[i].y,v[i].z);
83 else{
84 pii o=query(1,1,n,v[i].y,n);
85 ans[v[i].z.se]+=o.fi*v[i].z.fi+o.se;
86 }
87 for(int i=0;i<v.size();i++)
88 if (!v[i].p)update(1,1,n,v[i].y,mp(-v[i].z.fi,-v[i].z.se));
89 calc(l,mid);
90 calc(mid+1,r);
91 }
92 int main(){
93 scanf("%d%d%s",&n,&m,s+1);
94 for(int i=1;i<=n;i++)
95 if (s[i]=='1')update(i,0);
96 for(int i=1;i<=m;i++){
97 scanf("%s%d",s,&x);
98 if (s[0]=='t')update(x,i);
99 else{
100 scanf("%d",&y);
101 query(x,y-1,i);
102 }
103 }
104 calc(1,t);
105 for(int i=1;i<=q;i++)printf("%d\n",ans[i]);
106 }

[loj3146]路灯的更多相关文章

  1. LOJ3146 APIO2019路灯(cdq分治+树状数组)

    每个时刻都形成若干段满足段内任意两点可达.将其视为若干正方形.则查询相当于求历史上某点被正方形包含的时刻数量.并且注意到每个时刻只有O(1)个正方形出现或消失,那么求出每个矩形的出现时间和消失时间,就 ...

  2. 洛谷P1220关路灯[区间DP]

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

  3. CODEVS 1258 关路灯

    写动归终于能不看题解一次A了!(其实交了两次,一次80一次A) 我练功发自真心! 题目描述 Description 多瑞卡得到了一份有趣而高薪的工作.每天早晨他必须关掉他所在村庄的街灯.所有的街灯都被 ...

  4. ZigBee无线网络技术在小区路灯照明系统的应用

    小区路灯照明系统是楼宇智能的一部分,但受制于布线.成本等的问题,难以得以实施.随着计算机技术的迅猛发展,无线网络技术越来越成熟,ZigBee无线网络成本低.功耗低.传输距离远等的特点,非常适合在无线路 ...

  5. [CODEVS1258]关路灯

    题目描述 Description 多瑞卡得到了一份有趣而高薪的工作.每天早晨他必须关掉他所在村庄的街灯.所有的街灯都被设置在一条直路的同一侧. 多瑞卡每晚到早晨5点钟都在晚会上,然后他开始关灯.开始时 ...

  6. 洛谷P1220 关路灯

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

  7. [动态规划]P1220 关路灯

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

  8. 关路灯,洛谷dp

    题目传送门https://www.luogu.org/problem/show?pid=1220 我们假设 dpij0 为目前最优值是在 i 位置,dpij1 为目前最优值是在 j 位置则 i 到 j ...

  9. 【luogu1220】关路灯

    https://www.luogu.org/problem/show?pid=1220 假如当前老张在a处跑去关掉b处的路灯,那么a与b之间的路灯都可以顺手关掉.因此每一时刻关掉的路灯必定是连续的. ...

随机推荐

  1. 【数据结构与算法】二叉树的 Morris 遍历(前序、中序、后序)

    前置说明 不了解二叉树非递归遍历的可以看我之前的文章[数据结构与算法]二叉树模板及例题 Morris 遍历 概述 Morris 遍历是一种遍历二叉树的方式,并且时间复杂度O(N),额外空间复杂度O(1 ...

  2. mysql通过logstash同步数据到es

    大小写问题很严重 input 1.statement:mysql的连接使用 jdk版本有强要求 2.jdbc_driver_library:jar包的版本有对应要求 3.jdbc_driver_cla ...

  3. ElasticJob 3.0.0:打造面向互联网生态和海量任务的分布式调度解决方案

    ElasticJob 于 2020 年 5 月 28 日重启并成为 Apache ShardingSphere 子项目.新版本借鉴了 ShardingSphere 可拔插架构的设计理念,对内核进行了大 ...

  4. PG集群(PostgreSql环境)搭建

    centos PG集群搭建 一.安装PG 1.安装之前首先查看软件是否已经安装 rpm -qa | grep postgresql #若存在,需要卸载使用 yum remove postgresql ...

  5. 对epoll机制的学习理解v1

    epoll机制 wrk用非阻塞多路复用IO技术创造出大量的连接,从而达到很好的压力测试效果.epoll就是实现IO多路复用的关键. 本节是对epoll的本质的学习总结,进一步的参考资料为: <深 ...

  6. python爬虫时,解决编码方式问题的万能钥匙(uicode,utf8,gbk......)

    转载   原文:https://blog.csdn.net/xiongzaiabc/article/details/81008330 无论遇到的网页代码是何种编码方式,都可以用以下方法统一解决 imp ...

  7. JVM:内存结构

    JVM:内存结构 说明:这是看了 bilibili 上 黑马程序员 的课程 JVM完整教程 后做的笔记 内容 程序计数器 虚拟机栈 本地方法栈 堆 方法区 直接内存 1. 程序计数器 1.1 定义 P ...

  8. Linux C语言多线程编程实例解析

    Linux系统下的多线程遵循POSIX线程接口,称为 pthread.编写Linux下的多线程程序,需要使用头文件pthread.h,连接时需要使用库libpthread.a.顺便说一下,Linux ...

  9. 有了 HTTP 协议,为什么还需要 Websocket?

    WebSocket 是一种基于 TCP 连接上进行全双工通信的协议,相对于 HTTP 这种非持久的协议来说,WebSocket 是一个持久化网络通信的协议. 它不仅可以实现客户端请求服务器,同时可以允 ...

  10. The entitlements specified in your application’s Code Signing Entitlements file do not match those s

    今天给打包 TPshop IOS (搜豹商城) ipa文件 调试运行 xcode运行提示这个错误: The entitlements specified in your application's C ...