news 2026/6/9 21:23:40

《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/6/9 17:44:38

python 之 Langchain GenAI 聊天模型集成

一、环境准备与初始化 1.1 Gemini开发者API方式from langchain_google_genai import ChatGoogleGenerativeAI# 推荐做法&#xff1a;提前在环境变量中设置API Key # export GOOGLE_API_KEY你的API密钥# 直接代码中指定API Key也可以 model ChatGoogleGenerativeAI(model"…

作者头像 李华
网站建设 2026/6/9 17:43:30

微软二月补丁日修复六个零日漏洞

微软在2026年2月的月度补丁日发布了针对六个新分类零日通用漏洞披露&#xff08;CVE&#xff09;的修复程序&#xff0c;此次发布涵盖了微软产品套件中的50多个漏洞。 尽管漏洞总数比1月份的大量漏洞减少了约一半&#xff0c;但趋势科技零日倡议&#xff08;ZDI&#xff09;的达…

作者头像 李华
网站建设 2026/6/9 17:44:47

大数据环境下Doris架构设计全解析

大数据环境下Doris架构设计全解析 关键词&#xff1a;Apache Doris、MPP架构、实时分析、列式存储、分区分桶 摘要&#xff1a;在大数据时代&#xff0c;企业对实时分析的需求日益迫切。Apache Doris作为一款高性能、易扩展的分析型数据库&#xff0c;凭借其MPP&#xff08;大规…

作者头像 李华
网站建设 2026/6/9 17:45:45

Python量化交易:玩转Pandas:金融数据清洗与时间序列分析实战

Python量化交易:玩转Pandas:金融数据清洗与时间序列分析实战 玩转Pandas:金融数据清洗与时间序列分析实战 第一部分:Pandas金融核心——时间序列的基石 1.1 时间索引的力量 1.2 Resample:重采样的艺术 1.3 Rolling:滑动窗口与趋势捕捉 第二部分:金融数据的脏活累活——清…

作者头像 李华
网站建设 2026/6/9 17:44:42

小白程序员转行大模型:AI时代新风口与学习资料免费领!程序员转行大模型,真的是新时代的选择吗?

文章指出&#xff0c;在AI技术飞速发展的今天&#xff0c;程序员面临技能升级转型需求。大模型技术因其市场需求旺盛、薪资待遇优厚及技能提升价值&#xff0c;成为程序员转行的热门选择。文章详细阐述了学习大模型的途径&#xff0c;包括掌握基础知识、实践项目及关注行业动态…

作者头像 李华