[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之间的路灯都可以顺手关掉.因此每一时刻关掉的路灯必定是连续的. ...
随机推荐
- C#开发BIMFACE系列50 Web网页中使用jQuery加载模型与图纸
BIMFACE二次开发系列目录 [已更新最新开发文章,点击查看详细] 在前一篇博客<C#开发BIMFACE系列49 Web网页集成BIMFACE应用的技术方案>中介绍了目前市场主流 ...
- linux Samba 搭建
Samba is a free and open-source software package that provides seamless file and print services to S ...
- MySQL:怒刷牛客网“sql实战”
MySQL:怒刷牛客网"sql实战" 在对MySQL有一定了解后,抽空刷了一下 牛客网上的 数据库SQL 实战,在此做一点小小的记录 SQL1 查找最晚入职员工的所有信息 sele ...
- [技术博客]Unity3d 动画控制
在制作游戏时,导入的箱子模型本身自带动画.然而,它的动画是一个从打开到关闭的完整过程,并且没有给出控制打开关闭的方法. 最直接的想法是对该动画进行拆分,再封装成不同的动画状态,但是不巧的是,这个动画被 ...
- 2021.9.25考试总结[NOIP模拟61]
终于有点阳间题了然而挂了60pts 哈哈 T1 交通 类似简单题,限制看似很复杂,但不难发现当确定一条边是否被删后会产生裙带关系,很多边会跟着自动被确定是否被删. 仔细观察可以得出这种关系会构成偶环结 ...
- 一文读懂Android进程及TCP动态心跳保活
一直以来,APP进程保活都是 各软件提供商 和 个人开发者 头疼的问题.毕竟一切的商业模式都建立在用户对APP的使用上,因此保证APP进程的唤醒,提升用户的使用时间,便是软件提供商和个人开发者的永恒追 ...
- matplotlib.legend()函数用法
用的较多,作为记录 legend语法参数如下: matplotlib.pyplot.legend(*args, **kwargs) 几个暂时主要用的参数: (1)设置图例位置 使用loc参数 plt. ...
- 洛谷 P4587 [FJOI2016]神秘数
大鸽子 llmmkk 正在补8.3号咕掉的题 时隔两个月,再看到这道题,我又是一脸懵,这种思维的培养太重要了 链接: P4587 题意: 给出 \(n\) 个点的序列,\(m\) 次询问区间神秘数. ...
- K8S_Kubernetes
Google创造, K8S,是基于容器的集群管理平台, K8S集群 应用场景 微服务 这个集群主要包括两个部分 一个Master节点(主节点) 一群Node节点(计算节点) Master节 ...
- linux下测试读写
1.测/目录所在磁盘的纯写速度: time dd if=/dev/zero bs=1024 count=1000000 of=/1Gb.file 2.测/目录所在磁盘的纯读速度: time dd if ...