P5445-[APIO2019]路灯【set,树状数组套线段树】

正题

题目链接:https://www.luogu.com.cn/problem/P5445


题目大意

n+1n+1n+1个点,iiii+1i+1i+1个点之间有一条边,qqq个操作

  1. 断开/连接第xxxx+1x+1x+1之间的边
  2. 询问目前为止aaabbb点在多少个操作后是联通的(包括开始前)

解题思路

粗略的思想是我们可以用setsetset来维护联通的块,但是这样很难统计答案,我们需要加上点其他东西。

考虑使用一个(n+1)×(n+1)(n+1)\times(n+1)(n+1)×(n+1)的矩形来表示这个图的联通性,第(i,j)(i,j)(i,j)个点储存目前的操作为止iiijjj到结束会联通多久。

以下矩形用(x1,y1,x2,y2)(x_1,y_1,x_2,y_2)(x1,y1,x2,y2)来表示
为什么用矩形,因为每次都一定是连接两个区间或者断开一个区间,所以每次操作可以视为矩形操作。

为什么是目前的操作到结束位置,因为如果直接维护答案那么每次操作后有些位置的答案要加一,这样存就保证了一个静止状态,方便赋值。

对于一次操作连接[l1,r1][l_1,r_1][l1,r1][l2,r2][l_2,r_2][l2,r2]我们可以将矩形(l1,l2,r1,r2)(l_1,l_2,r_1,r_2)(l1,l2,r1,r2)这个矩形加上一个q−tq-tqtttt表示当前是第几个操作),断开的话就减去就好了。

需要注意如果这个时候询问的两个区间联通,那么询问出来的答案是到结束而不是到目前为止的,所以要减去一个q−tq-tqt

时间复杂度O(nlog⁡2n)O(n\log^2n)O(nlog2n)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<set>
#define lowbit(x) (x&-x)
using namespace std;
const int N=3e5+10,M=N<<7;
struct line{int l,r;line(int ll=0,int rr=0){l=ll;r=rr;}
};
bool operator<(line x,line y)
{return x.r<y.r;}
int n,q,rt[N];
char st[N];
set<line> s;
set<line>::iterator it;
struct Seq_Tree{int w[M],ls[M],rs[M],cnt;void Change(int &x,int L,int R,int pos,int val){if(!x)x=++cnt;w[x]+=val;if(L==R)return;int mid=(L+R)>>1;if(pos<=mid)Change(ls[x],L,mid,pos,val);else Change(rs[x],mid+1,R,pos,val);return;}int Ask(int x,int L,int R,int l,int r){if(!x)return 0;if(L==l&&R==r)return w[x];int mid=(L+R)>>1;if(r<=mid)return Ask(ls[x],L,mid,l,r);if(l>mid)return Ask(rs[x],mid+1,R,l,r);return Ask(ls[x],L,mid,l,mid)+Ask(rs[x],mid+1,R,mid+1,r);}
}T;
void Change(int x,int y,int val){if(y>n)return;while(x<=n){T.Change(rt[x],1,n,y,val);x+=lowbit(x);}return;
}
int Ask(int x,int y){int ans=0;while(x){ans+=T.Ask(rt[x],1,n,1,y);x-=lowbit(x);}return ans;
}
void Updata(int x1,int x2,int y1,int y2,int val){Change(x1,y1,val);Change(x2+1,y2+1,val);Change(x2+1,y1,-val);Change(x1,y2+1,-val);return;
}
void Cut(int x,int t){it=s.lower_bound(line(x,x));int l=(*it).l,r=(*it).r;s.erase(it);Updata(l,x,x+1,r,t-q);s.insert(line(l,x));s.insert(line(x+1,r));return;
}
void Link(int x,int t){it=s.lower_bound(line(x,x));int x1=(*it).l,y1=(*it).r;s.erase(it);it=s.lower_bound(line(x,x));int x2=(*it).l,y2=(*it).r;s.erase(it);Updata(x1,y1,x2,y2,q-t);s.insert(line(x1,y2));return;
}
int main()
{// printf("%d\n",sizeof(T)>>20);scanf("%d%d",&n,&q);scanf("%s",st+1);n++;s.insert((line){1,n});Updata(1,n,1,n,q);for(int i=1;i<n;i++)if(st[i]=='0')Cut(i,0);for(int i=1;i<=q;i++){char op[10];scanf("%s",op);if(op[0]=='q'){int l,r;scanf("%d%d",&l,&r);it=s.lower_bound(line(l,l));int a=(*it).r;it=s.lower_bound(line(r,r));int b=(*it).r;printf("%d\n",Ask(l,r)-(a==b)*(q-i));}else{int x;scanf("%d",&x);if(st[x]=='0')st[x]='1',Link(x,i);elsest[x]='0',Cut(x,i);}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319807.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【dfs】【hash】有趣的英语角(2015特长生 T2/luogu 1019)

正题 luogu 1019 题目大意 给你若干个词语&#xff0c;让你把他们连起来&#xff08;重复段叠在一起&#xff09;&#xff0c;每个词语最多用两次&#xff0c;问你该串最长是多少 解题思路 dfs枚举一个单词后面接哪个单词&#xff0c;然后枚举重叠长度&#xff0c;再用hash判…

基环树小记

概念 基环树就是有n个点n条边的图&#xff08;比树多出现一个环&#xff09;。 特殊形态的基环树 无向树(N点N边无向图) 外向树(每个点只有一条入边) 内向树(每个点只有一条出边) 以上三种树有十分优秀的性质&#xff0c;就是可以直接将环作为根。就可以对每个环的子树进行单…

【每日一题】7月1日题目精讲 借教室

来源&#xff1a;牛客网 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 131072K&#xff0c;其他语言262144K 64bit IO Format: %lld文章目录题目描述题解&#xff1a;差分&#xff1a;二分&#xff1a;整合代码&#xff1a;题目描述 在大学期…

利用BenchmarkDotNet 测试 .Net Core API 同步和异步方法性能

事由&#xff1a;这两天mentor给我布置了个任务让我用BenchmarkDotNet工具去测试一下同一个API 用同步和异步方法写性能上有什么差别。顺带提一下&#xff1a;啊啊啊啊 等我仔细看文档的时候文档 发现它让我用Release的模式去运行benchmark。 emmm...其实我之前一直在用Debug模…

CF280C-Game on Tree【数学期望】

正题 题目链接:https://www.luogu.com.cn/problem/CF280C 题目大意 nnn个点的一棵树&#xff0c;每次选择一个没有染色的点把它和它的子树染黑&#xff0c;求期望全部染黑的步数。 解题思路 可以理解为我们按照一个顺序轮流染色&#xff0c;如果一个点有祖先节点在它前面就不…

糊涂的教授(2015特长生 T3)

题目大意 平面上有n个矩阵&#xff0c;和n个数字&#xff0c;对于每个矩阵选择矩阵内的一个数字作为编号&#xff0c;让你给出唯一方案&#xff0c;使每个数字只作为一个矩阵的编号&#xff08;多种方案即为不可行的&#xff09; 解题思路 因为多种方案是不可行的&#xff0c…

MATLAB线性规划相关函数用法

一.线性规划的Matlab标准形式及软件求解 1. MATLAB中规定线性规划的标准形式为 其中c和 x为n 维列向量&#xff0c; A、 Aeq 为适当维数的矩阵&#xff0c;b 、beq为适当维数的列向量。 &#xff08;Aeq 对应约束条件中等式约束的系数矩阵&#xff0c;A为约不等式约束的系数矩…

势能线段树(均摊分析)

势能线段树 线段树能够通过打懒标记实现区间修改的条件有两个&#xff1a; 能够快速处理懒标记对区间询问结果的影响能够快速实现懒标记的合并 但有的区间修改不满足上面两个条件&#xff08;如区间整除/开方/取模等&#xff09;。 但某些修改存在一些奇妙的性质&#xff0c…

.NET Core 出得云端入得本地,微软让跨平台应用勇敢表达

地铁公交的上班路上、咖啡馆里等人的时候&#xff0c;这些碎片化时间都是现代人学习和充电的机会&#xff0c;根据第42次CNNIC中国互联网发展状况统计报告&#xff0c;截至2018年6月&#xff0c;网络文学用户规模已达4.06亿&#xff0c;占网民总体50.6%&#xff1b;手机网络文学…

【每日一题】7月3日精讲—毒瘤xor

【每日一题】7月3日精讲—毒瘤xor 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 32768K&#xff0c;其他语言65536K Special Judge, 64bit IO Format: %lld文章目录题目描述题解&#xff1a;代码&#xff1a;题目描述 输入描述: 第一行一个整…

【DP】集合问题(2015特长生 T4/luogu 1466)

正题 luogu 1466 题目大意 给你1~n的一个集合&#xff0c;问你有多少种方案把该集合分成两个集合&#xff0c;且两集合的数字之和相等 解题思路 设fi,jf_{i,j}fi,j​为放好i个数且集合1的和比集合2的和大j的方案书 那么对于第i个放到两个集合中&#xff0c;分别从fi−1,j−…

P5212-SubString【LCT,SAM】

正题 题目链接:https://www.luogu.com.cn/problem/P5212 题目大意 开始一个字符串SSS&#xff0c;有nnn次操作 在SSS末尾加入一个字符串询问一个串在SSS中出现了多少次 强制在线 解题思路 强制在线的话&#xff0c;只有SAM\text{SAM}SAM能够支持动态插字符了&#xff0c;但…

了解改良圈算法

一.相关知识——Hamilton圈 什么是Hamilton圈&#xff1f; 哈密顿图&#xff08;哈密尔顿图&#xff09;&#xff08;英语&#xff1a;Hamiltonian path&#xff0c;或Traceable path&#xff09;是一个无向图&#xff0c;由天文学家哈密顿提出&#xff0c;由指定的起点前往指…

ASP.NET Core Middleware

中间件(Middleware)是ASP.NET Core中的一个重要特性。所谓中间件就是嵌入到应用管道中用于处理请求和响应的一段代码。ASP.NET Core Middleware可以分为两种类型&#xff1a;Conventional MiddlewareIMiddlewareConventional Middleware这种中间件没有实现特定的接口或者继承特…

NOIP复健计划——动态规划

树形DP [POI2011] DYN-Dynamite 二分KKK check(mid)&#xff1a; 能否选出mmm个点&#xff0c;使得 ∀i为关键点&#xff0c;Minjisselected{dis(i,j)}≤mid\forall i为关键点&#xff0c;Min_{j\ is\ selected}\{dis(i,j)\}\leq mid∀i为关键点&#xff0c;Minj is selecte…

【每日一题】7月6日精讲—平衡二叉树

来源&#xff1a;牛客网&#xff1a; 文章目录题目描述题解&#xff1a;代码&#xff1a;时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 1048576K&#xff0c;其他语言2097152K 64bit IO Format: %lld题目描述 平衡二叉树&#xff0c;顾名思义就…

【DP】晨练计划(ybtoj)

正题 ybtoj 题目大意 给你n个时间点 在第i个时间点跑步有aia_iai​点贡献&#xff0c;但会加一点疲惫值&#xff0c;疲惫值不能超过m 当前疲惫值为x&#xff0c;那么你可以花x点时间来清空疲惫值&#xff0c;当然也可以啥都不干 问你第n个时间后疲惫值为0的最大贡献 解题思…

MATLAB灰色预测

一.灰色预测 1.灰色系统下的灰色预测 <1>什么是灰色系统&#xff1f; 所谓的灰色系统其实就是夹杂在白色系统和黑色系统之中的一种系统&#xff0c;而白色系统就是全部信息已知的系统&#xff0c;黑色系统就是全部信息未知的系统。所以&#xff0c;夹在这两种系统中间…

ASP.NET Core 中的依赖注入

什么是依赖注入软件设计原则中有一个依赖倒置原则&#xff08;DIP&#xff09;&#xff0c;为了更好的解耦&#xff0c;讲究要依赖于抽象&#xff0c;不要依赖于具体。而控制反转(Ioc)就是这样的原则的其中一个实现思路, 这个思路的其中一种实现方式就是依赖注入(DI)。什么是依…

P4357-[CQOI2016]K远点对【K-Dtree】

正题 题目链接:https://www.luogu.com.cn/problem/P4357 题目大意 平面上给出nnn个点&#xff0c;求第kkk远的点对距离。 解题思路 K-Dtree\text{K-Dtree}K-Dtree的模板题&#xff0c;但是这里只有二维&#xff0c;大概是每次根据一个维度把nnn个点分成两半像线段树一样丢到下…