显然,能从$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. 从工具、工具箱到数字化软件工厂——DevOps 设计理念与工程实践专场 | CIF 精彩看点

    西方经典管理理论认为,组织效率可以归为劳动效率.组织效率和人的效率.美国管理学家泰勒所著的<科学管理原理>被德鲁克誉为"20 世纪最伟大的发明",劳动效率说认为分工提升 ...

  2. python-docx 页面设置

    初识word文档-节-的概念 编辑一篇word文档,往往首先从页面设置开始,从下图可以看出,页面设置常操作的有页边距.纸张方向.纸张大小4个,而在word中是以节(section)来分大的块,每一节的 ...

  3. 感恩笔记之SQL语句操纵数据集基本功能模板

    SQL查询_基本功能 一 SQL语句整体架构 SELECT --1 查询数据表 INTO --2 新建数据表 FROM --3 查询数据表 WHERE --4 筛选数据表 ORDER BY --5 排 ...

  4. Oracle数据泵数据迁移

    1 表空间查询 1.1 检查用户与表空间对应情况 select username,default_tablespace from dba_users; 1.2    查看临时表空间 select ta ...

  5. 华为Awareness kit,您旅途路上的超智能管家

    前言 前段时间看了一部纪录片<中国游客在巴黎>,讲述了外国人眼中"中国式旅游":热衷景点打卡,沉迷拍照留念,无暇仔细欣赏:留足时间,买买买,不能枉此行.网友总结中国式旅 ...

  6. The type name or alias SqlServer could not be resolved.Please check your configuration

    The type name or alias SqlServer could not be resolved.Please check your configuration file.... 检查一下 ...

  7. SpringBoot-MVC自动配置原理

    SpringBoot对SpringMVC做了哪些配置,如何扩展,如何定制? 文档地址 :https://docs.spring.io/spring-boot/docs/2.2.5.RELEASE/re ...

  8. L1-017 到底有多二 (15 分) java解题

    1 import java.util.Scanner; 2 3 public class Main { 4 public static void main(String args[]){ 5 doub ...

  9. 从零到熟悉,带你掌握Python len() 函数的使用

    摘要:本文为你带来如何找到长度内置数据类型的使用len() 使用len()与第三方数据类型 提供用于支持len()与用户定义的类. 本文分享自华为云社区<在 Python 中使用 len() 函 ...

  10. JavaCPP快速入门(官方demo增强版)

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...