传送门·

对于询问 $(a,b)$ ,感觉一维很不好维护,考虑把询问看成平面上的一个点,坐标为 $(a,b)$

每个坐标 $(x,y)$ 的值表示到当前 $x$ 和 $y$ 联通的时间和

考虑一个修改的贡献,它其实就是把左边一段区间 $[l,x]$ 和右边一段区间 $[x+1,r]$ 联通或断开

放到平面上发现其实就是横坐标在 $[l,x]$ ,纵坐标在 $[x+1,r]$ 的矩形里修改,那么矩形左下角为 $[l,x+1]$,右上角为 $[x,r]$

如果每个时间点都把相应矩形 $+1$ 的话显然是不可行的,考虑起点和终点的时间差

如果当前操作是联通,设当前时间为 $t$,则把相应矩形 $-t$,如果是断开则把矩形加 $t$

这样我们询问时直接矩形单点查值即可,但是要注意,如果查询时当前区间仍然联通,那么对应矩形还没加 $t$ ,我们查完值以后答案还要再加 $t$

矩形加具体就是差分成四个前缀修改,查询的时候直接查左下所有位置的和即可

如果把左下角为 $(xa,ya)$,右上角 $(xb,yb)$ 的闭区间都加一个 $v$,那么其实就是把 $(0,0),(xa,ya)$ 加一个 $v$,$(0,0),(xa,yb+1)$ 减 $v$,$(0,0),(xb+1,ya)$ 减 $v$,$(0,0),(xb+1,yb+1)$ 加 $v$

二维平面加一维时间轴, $CDQ$ 分治即可

然后就是具体的维护了,我维护亮灯区间用的是闭区间,好像比较多细节...

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<set>
using namespace std;
typedef long long ll;
inline int read()
{int x=0,f=1; char ch=getchar();while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar(); }while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); }return x*f;
}
const int N=6e5+7;
char s[N];
int n,Q,tot;
struct dat{//区间int l,r;dat (int a=0,int b=0) { l=a,r=b; }inline bool operator < (const dat &tmp) const {return l<tmp.l;}
};
set <dat> S;//维护开灯的区间
set <dat>::iterator ita,itb;
struct Poi{//CDQ分治的点int x,y,id,v;//id=0表示是修改,v是修改的值Poi (int a=0,int b=0,int c=0,int d=0) { x=a,y=b,id=c,v=d; }
}d[N<<2],tmp[N<<2];
int t[N];
inline void add(int x,int v) { while(x<=n+1) t[x]+=v,x+=x&-x; }
inline int ask(int x) { int res=0; while(x) res+=t[x],x-=x&-x; return res; }
inline bool fc(Poi &a,Poi &b) { if(a.x!=b.x) return a.x<b.x; return a.y!=b.y ? a.y<b.y : a.id<b.id; }
int ans[N];
void solve(int l,int r)
{if(l==r) return; int mid=l+r>>1;solve(l,mid); solve(mid+1,r);int i=l,j=mid+1,p=l-1;while(i<=mid&&j<=r){if(fc(d[i],d[j])){if(!d[i].id) add(d[i].y,d[i].v);tmp[++p]=d[i++]; continue;}if(d[j].id) ans[d[j].id]+=ask(d[j].y);tmp[++p]=d[j++];}while(i<=mid) { if(!d[i].id) add(d[i].y,d[i].v); tmp[++p]=d[i++];  }while(j<=r) { if(d[j].id) ans[d[j].id]+=ask(d[j].y); tmp[++p]=d[j++]; }for(int k=l;k<=mid;k++) if(!d[k].id) add(d[k].y,-d[k].v);//撤销for(int k=l;k<=r;k++) d[k]=tmp[k];
}
int main()
{n=read(),Q=read();scanf("%s",s+1);S.insert(dat(0,0)); S.insert(dat(n+1,n+1));//初始虚区间防越界for(int i=1;i<=n;i++){if(s[i]=='0') continue;int R=i; while(s[R+1]=='1') R++;S.insert(dat(i,R)); i=R;//初始情况
    }char ch[17]; int a,b,cnt=0;for(int i=1;i<=Q;i++){scanf("%s",ch); a=read();if(ch[0]=='q'){b=read();d[++tot]=Poi(a,b,++cnt,0);//询问点ita=S.lower_bound(dat(a+1,0)); ita--;itb=S.lower_bound(dat(b,0)); itb--;if( ita==itb && (*ita).r>=b-1 ) ans[cnt]+=i;//判断区间是否还联通continue;}if(s[a]=='0')//联通
        {ita=S.lower_bound(dat(a+1,0)); ita--; itb=ita; ita++;//找到左右区间dat A=(*ita),B=(*itb); int l=a,r=a;if(B.r==l-1&&B.l>=1) l=B.l,S.erase(B);//注意判断,注意边界if(A.l==r+1&&A.r<=n) r=A.r,S.erase(A);S.insert(dat(l,r));d[++tot]=Poi(l,a+1,0,-i); d[++tot]=Poi(a+1,r+2,0,-i);d[++tot]=Poi(l,r+2,0,i); d[++tot]=Poi(a+1,a,0,i);//联通时矩形-is[a]='1'; continue;}//断开ita=S.lower_bound(dat(a+1,0)); ita--; dat A=(*ita);S.erase(A); if(A.l<a) S.insert(dat(A.l,a-1)); if(A.r>a) S.insert(dat(a+1,A.r));//注意边界d[++tot]=Poi(A.l,a+1,0,i); d[++tot]=Poi(a+1,A.r+2,0,i);d[++tot]=Poi(A.l,A.r+2,0,-i); d[++tot]=Poi(a+1,a,0,-i);//断开时矩形+is[a]='0';}solve(1,tot);for(int i=1;i<=cnt;i++) printf("%d\n",ans[i]);return 0;
}

转载于:https://www.cnblogs.com/LLTYYC/p/11371368.html

P5445 [APIO2019]路灯相关推荐

  1. luogu P5445 [APIO2019]路灯

    题面传送门 首先用两颗线段树维护每个点所在的亮灯联通块. 然后再建一颗二维线段树,每个点表示到当前为止,有多少个时刻能从iii到jjj. 对于每次修改,依靠两颗线段树维护的区间,来修改. 这里有一个小 ...

  2. APIO2019简要题解

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

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

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

  4. 论文免费开源:NB-IoT智慧路灯监控系统

    在去年年中的时候就有很多小伙伴咨询我关于NB-IoT智慧路灯监控系统的问题,近期刚刚本科毕业,遂将原汁原味的论文分享给各位朋友. 针对传统路灯系统管理难.智能化程度较低的问题,本毕业设计设计了一种基于 ...

  5. 基于NB-IoT的智慧路灯监控系统(NB-IoT专栏—实战篇1:项目简介)

    目录 1.项目背景 2.需求分析 3.功能设计 近期参加物联网设计大赛也作为明年的毕业设计,和好兄弟花费一个月的业余时间,实现从项目构思设备选型到现在的系统V1.0效果. 本项目效果如下,感谢各位好友 ...

  6. codevs1258 关路灯(☆区间dp)

    1258 关路灯  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 多瑞卡得到了一份有趣而高薪的工作.每天早晨他必须关掉他所 ...

  7. c# wpf listbox 高度_农村太阳能路灯厂家报价表2020(不同高度)

    由于我们对路灯需求的不断增加,在路灯的规格和功能方面也逐渐拓展,路灯广告牌,环境监测,道路照明,系统集成等等功能就加入到其中.当然了这些只是智慧路灯中的功能.太阳能路灯就是智慧路灯的前身,太阳能路灯随 ...

  8. AI指数评论:提防“路灯谬误”,开启全球多方对话

    来源:亿欧 概要:技术的单点突破,资本市场的多级繁荣,诸如此类的话题充斥着过去两到三年.然而,在AI时代思考AI,我们需要更宏大的世界观. 技术的单点突破,资本市场的多级繁荣,诸如此类的话题充斥着过去 ...

  9. APIO2019解题报告

    「APIO 2019」奇怪装置 题目描述 有无限个二元组,每个二元组为\(((t+\left\lfloor\frac{t}{B} \right\rfloor)\%A,t \% B)\),给出一些区间, ...

最新文章

  1. etw系统provider事件较多_【Flutter 实战】文件系统目录
  2. 鸿蒙推送升级包,华为鸿蒙系统已陆续推送!安卓可无缝升级,升级包容量高达6GB...
  3. vuex - 基础篇
  4. No authorization to log on as a Trusted System
  5. php正则匹配sg-nc-wap_php正则匹配
  6. SqlServer2008 安装经验日志总结
  7. 把 Rational Rose 的图表保存为图片文件
  8. OpenShift 4 - DevSecOps Workshop (1) - 安装 Workshop 环境
  9. Python求最大公约数和最小公倍数
  10. Maven 实现依赖框架jar包的版本管理
  11. mybatis~动态SQL(1)
  12. Android开发之使用Handler刷新UI控件
  13. 线性代数——线性方程组和矩阵(Linear and Matrices)
  14. 使用R语言进行一元回归
  15. 软考高级系统架构设计师系列论文二十四:论信息系统的安全风险
  16. 每天脑子里莫名其妙冒出来的话(常见于早上起床之后)持续记录,这也是日记的一种
  17. Failed to decode response: zlib_decode(): data error Retrying with degraded;
  18. VBA基础函数:取数组最大下标——UBound函数
  19. virtuoso小白入门
  20. Python 优雅地利用两点经纬度计算地理空间距离

热门文章

  1. 解决办法:E: 仓库 “......” 没有 Release 文件。
  2. 表单的内容如何存入数据库中
  3. (14)高通AP10.4开发者指南——WLAN(3.3 分层)
  4. 改造vue-element-admin 的登录功能,变成从后台数据库中验证登录
  5. Vim搜索(查找代码、字符串等)
  6. 随机数生成(一):均匀分布
  7. Java中的集合---------Collections 类---集合的工具类 Comparator比较器
  8. 千万不要说联通的网络不好……
  9. 要怎么在计算机里清除桌面内存,电脑内存不足怎么办?怎么清理电脑内存?
  10. Numpy和Pandas的简单使用