news 2026/5/27 7:05:56

《P5445 [APIO2019] 路灯》

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
《P5445 [APIO2019] 路灯》

题目描述

一辆自动驾驶的出租车正在 Innopolis 的街道上行驶。该街道上有 n+1 个停车站点,它们将街道划分成了 n 条路段。每一路段都拥有一个路灯。当第 i 个路灯亮起,它将照亮连接第 i 与第 i+1 个站点的路段。否则这条路段将是黑暗的。

安全起见,出租车只能在被照亮的路段上行驶。换言之,出租车能从站点 a 出发到达站点 b(a<b) 的条件是:连接站点 a 与 a+1,a+1 与 a+2,……,b−1 与 b 的路段都被照亮。

在经过一些意外故障或修理之后,街道上的路灯可能是亮起的,也可能是熄灭的。

现在给定 0 时刻时,街道上路灯的初始状态。之后 1,2,…,q 时刻,每时刻会发生下列两种事件之一:

  • toggle i:切换第 i 个路灯的状态。具体地说,若路灯原来亮起,则现在将熄灭;若路灯原来熄灭,则现在将亮起。

  • query a b:出租车部门的负责人想知道,从 0 时刻起到当前时刻,有多少个时刻满足:出租车能够从站点 a 出发到达站点 b。

请你帮助出租车部门的负责人回答他们的问题。

输入格式

第一行包含两个整数 n 和 q,表示路灯的数量与时刻数。

第二行包含一个字符串 s 表示路灯的初始状态,si​ 为 1 表示第 i 个路灯初始时亮起;si​ 为 0 表示第 i 个路灯初始时熄灭。

接下来 q 行每行描述一个时刻的事件。第 i 行描述时刻 i 所发生的事件:

  • toggle i:该时刻切换了第 i 个路灯的状态。

  • query a b:计算从 0 时刻起到该时刻,共有多少个时刻满足:出租车能从站点 a 出发到达站点 b。

至少有一个时刻的事件是 query。

输出格式

对于每个 query 的事件,输出一行单个整数,表示该问题的答案。

输入输出样例

输入 #1复制

5 7 11011 query 1 2 query 1 2 query 1 6 query 3 4 toggle 3 query 3 4 query 1 6

输出 #1复制

1 2 0 0 1 2

说明/提示

对于全部数据,1≤n,q≤3×105,∣s∣=n,1≤i≤n,1≤a<b≤n+1。

详细子任务附加限制与分值如下表

子任务附加限制分值
1n, q≤10020
2对于所有 query a b 事件,满足 a=b−120
3对于所有 toggle i 事件,第 i 个路灯将被点亮20
4所有 toggle 事件都发生在第一个 query 事件之前20
5无特殊限制

20

代码实现:

#include <iostream> #include <cmath> #include <cstring> #include <algorithm> #include <set> using namespace std; const int N=300100; int n,q,x,y; int st[N<<2]; char ch[N],op[10]; namespace t2{ #define mid (l+r>>1) #define lb(x) ((x)&(-(x))) int rt[N<<1],cnt; struct node{ int l,r,sum; }tr[N<<7]; void upd(int &p, int l, int r, int pos, int k){ if(!p) p=++cnt; tr[p].sum += k; if(l == r) return; if(pos <= mid) upd(tr[p].l, l, mid, pos, k); else upd(tr[p].r, mid+1, r, pos, k); } int qry(int p, int l, int r, int L, int R){ if(!p || L>R || l>R || r<L) return 0; if(L<=l && r<=R) return tr[p].sum; return qry(tr[p].l, l, mid, L, R) + qry(tr[p].r, mid+1, r, L, R); } void add(int x, int y, int k){ for(;x<=n+1;x+=lb(x)) upd(rt[x], 1, n+1, y, k); } int query(int x, int y){ int res=0; for(;x;x-=lb(x)) res += qry(rt[x], 1, n+1, 1, y); return res; } } namespace st_set{ #define it set<nd>::iterator struct nd{ int l,r; bool operator < (const nd &b) const { return r < b.r; } }; set<nd> s; void init(){ for(int i=1;i<=n;i++) s.insert(nd{i,i}); } void merge(int x1,int x2,int y1,int y2){ s.erase(nd{x1,x2}); s.erase(nd{y1,y2}); s.insert(nd{x1,y2}); } void split(int x1,int x2,int y1,int y2){ s.erase(nd{x1,y2}); s.insert(nd{x1,x2}); s.insert(nd{y1,y2}); } bool same(int x,int y){ return s.lower_bound(nd{0,x})->l == s.lower_bound(nd{0,y})->l; } } using namespace t2; using namespace st_set; void add_diff(int x1,int y1,int x2,int y2,int k){ add(x1,y1,k); add(x2+1,y2+1,k); add(x1,y2+1,-k); add(x2+1,y1,-k); } int main(){ scanf("%d%d",&n,&q); n++; scanf("%s",ch+1); init(); for(int i=1;i<=n-1;i++){ st[i] = ch[i]-'0'; if(st[i]) merge(s.lower_bound(nd{0,i})->l, i, i+1, i+1); } for(it i=s.begin();i!=s.end();i++) add_diff(i->l,i->l,i->r,i->r,q); for(int i=1;i<=q;i++){ scanf("%s",op+1); if(op[1]=='q'){ scanf("%d%d",&x,&y); int res=query(x,y); if(same(x,y)) res -= q-i; cout<<res<<'\n'; } if(op[1]=='t'){ scanf("%d",&x); it iter = s.lower_bound(nd{0,x}); int x1=iter->l, x2=x, y1=x+1; if(st[x]){ int y2=iter->r; add_diff(x1,y1,x2,y2,i-q); split(x1,x2,y1,y2); } else{ int y2=(++iter)->r; add_diff(x1,y1,x2,y2,q-i); merge(x1,x2,y1,y2); } st[x]^=1; } } return 0; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/16 9:24:36

系统 监控

曲线图来源

作者头像 李华
网站建设 2026/5/25 2:24:32

分析系统日志定位电脑故障方法

分析系统日志定位电脑故障方法 导航 文章目录分析系统日志定位电脑故障方法导航一、 访问日志文件二、 核心分析步骤&#xff08;快速定位故障&#xff09;1. 筛选关键事件级别2. 聚焦故障时间范围3. 识别关键事件来源和ID4. 解读事件详情5. 关联分析事件链三、 针对常见故障的…

作者头像 李华
网站建设 2026/5/21 5:52:01

Vue day13

1.create-vue1.1创建项目1.2项目目录和关键项目2.setup3.reactive&#xff08;&#xff09;4.ref&#xff08;&#xff09;5.computed计算属性函数6.基础使用-侦听多个数据7.Vue3的生命周期API8.组合式API下的父传子和子传父9.模块引用10.defineExpose&#xff08;&#xff09;…

作者头像 李华
网站建设 2026/5/24 11:49:55

为什么你的元宇宙地产滞销?开发者定位盲区

一、血淋淋的市场崩塌&#xff1a;测试缺失引发的灾难链 2023年&#xff0c;林俊杰在Decentraland平台斥资12.3万美元购置的虚拟地产市值暴跌91%&#xff0c;仅余1万美元价值&#xff1b;同期全球最大元宇宙地产平台成交价中位数从45美元跌至5美元。这场崩盘表面是投机泡沫破裂…

作者头像 李华
网站建设 2026/5/10 3:22:27

2026年深海声呐AI开发指南:软件测试从业者的专业视角

一、引言&#xff1a;深海声呐AI的机遇与测试挑战 2026年&#xff0c;深海声呐AI技术迎来爆发式增长&#xff0c;成为海洋经济的关键杠杆&#xff0c;预计市场规模将增长500%以上。作为软件测试从业者&#xff0c;我们面临独特挑战&#xff1a;多源异构数据融合、极端环境仿真…

作者头像 李华