[loj3146]路灯
显然,能从$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]路灯的更多相关文章
- LOJ3146 APIO2019路灯(cdq分治+树状数组)
每个时刻都形成若干段满足段内任意两点可达.将其视为若干正方形.则查询相当于求历史上某点被正方形包含的时刻数量.并且注意到每个时刻只有O(1)个正方形出现或消失,那么求出每个矩形的出现时间和消失时间,就 ...
- 洛谷P1220关路灯[区间DP]
题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯. 为了给村 ...
- CODEVS 1258 关路灯
写动归终于能不看题解一次A了!(其实交了两次,一次80一次A) 我练功发自真心! 题目描述 Description 多瑞卡得到了一份有趣而高薪的工作.每天早晨他必须关掉他所在村庄的街灯.所有的街灯都被 ...
- ZigBee无线网络技术在小区路灯照明系统的应用
小区路灯照明系统是楼宇智能的一部分,但受制于布线.成本等的问题,难以得以实施.随着计算机技术的迅猛发展,无线网络技术越来越成熟,ZigBee无线网络成本低.功耗低.传输距离远等的特点,非常适合在无线路 ...
- [CODEVS1258]关路灯
题目描述 Description 多瑞卡得到了一份有趣而高薪的工作.每天早晨他必须关掉他所在村庄的街灯.所有的街灯都被设置在一条直路的同一侧. 多瑞卡每晚到早晨5点钟都在晚会上,然后他开始关灯.开始时 ...
- 洛谷P1220 关路灯
洛谷1220 关路灯 题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关 ...
- [动态规划]P1220 关路灯
题目描述 某一村庄在一条路线上安装了n盏路灯,每盏灯的功率有大有小(即同一段时间内消耗的电量有多有少).老张就住在这条路中间某一路灯旁,他有一项工作就是每天早上天亮时一盏一盏地关掉这些路灯. 为了给村 ...
- 关路灯,洛谷dp
题目传送门https://www.luogu.org/problem/show?pid=1220 我们假设 dpij0 为目前最优值是在 i 位置,dpij1 为目前最优值是在 j 位置则 i 到 j ...
- 【luogu1220】关路灯
https://www.luogu.org/problem/show?pid=1220 假如当前老张在a处跑去关掉b处的路灯,那么a与b之间的路灯都可以顺手关掉.因此每一时刻关掉的路灯必定是连续的. ...
随机推荐
- 从工具、工具箱到数字化软件工厂——DevOps 设计理念与工程实践专场 | CIF 精彩看点
西方经典管理理论认为,组织效率可以归为劳动效率.组织效率和人的效率.美国管理学家泰勒所著的<科学管理原理>被德鲁克誉为"20 世纪最伟大的发明",劳动效率说认为分工提升 ...
- python-docx 页面设置
初识word文档-节-的概念 编辑一篇word文档,往往首先从页面设置开始,从下图可以看出,页面设置常操作的有页边距.纸张方向.纸张大小4个,而在word中是以节(section)来分大的块,每一节的 ...
- 感恩笔记之SQL语句操纵数据集基本功能模板
SQL查询_基本功能 一 SQL语句整体架构 SELECT --1 查询数据表 INTO --2 新建数据表 FROM --3 查询数据表 WHERE --4 筛选数据表 ORDER BY --5 排 ...
- Oracle数据泵数据迁移
1 表空间查询 1.1 检查用户与表空间对应情况 select username,default_tablespace from dba_users; 1.2 查看临时表空间 select ta ...
- 华为Awareness kit,您旅途路上的超智能管家
前言 前段时间看了一部纪录片<中国游客在巴黎>,讲述了外国人眼中"中国式旅游":热衷景点打卡,沉迷拍照留念,无暇仔细欣赏:留足时间,买买买,不能枉此行.网友总结中国式旅 ...
- 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.... 检查一下 ...
- SpringBoot-MVC自动配置原理
SpringBoot对SpringMVC做了哪些配置,如何扩展,如何定制? 文档地址 :https://docs.spring.io/spring-boot/docs/2.2.5.RELEASE/re ...
- L1-017 到底有多二 (15 分) java解题
1 import java.util.Scanner; 2 3 public class Main { 4 public static void main(String args[]){ 5 doub ...
- 从零到熟悉,带你掌握Python len() 函数的使用
摘要:本文为你带来如何找到长度内置数据类型的使用len() 使用len()与第三方数据类型 提供用于支持len()与用户定义的类. 本文分享自华为云社区<在 Python 中使用 len() 函 ...
- JavaCPP快速入门(官方demo增强版)
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...