LGP8819 [CSP-S 2022] 星战 笔记
原题地址:传送门
题意简述
给定一个
失活一条边 失活以 为终点的所有边 激活一条边 激活以 为终点的所有边
每次操作之后,都需要判断原图是否是一个内向基环树森林(注:每个点出度都为
解决方案
我们发现对于操作一和操作三我们可以
记结点
此时哈希登场。我们给每个结点随机一个权值
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long lolo;
const int MaxN=5e5+5;
mt19937 mrd(time(0));
int N,M,W[MaxN],X,Y,Q,Opt;
lolo tsum,csum,fis[MaxN],cis[MaxN];
int main(){
scanf("%d%d",&N,&M);
for(int i = 1;i <= N;i++)W[i]=mrd(),tsum+=W[i];
for(int i = 1;i <= M;i++){
scanf("%d%d",&X,&Y);
fis[Y]+=W[X],csum+=W[X];
}
scanf("%d",&Q);memcpy(cis,fis,sizeof(fis));
for(int i = 1;i <= Q;i++){
scanf("%d%d",&Opt,&X);
if(Opt==1)scanf("%d",&Y),cis[Y]-=W[X],csum-=W[X];
if(Opt==2)csum-=cis[X],cis[X]=0;
if(Opt==3)scanf("%d",&Y),cis[Y]+=W[X],csum+=W[X];
if(Opt==4)csum+=fis[X]-cis[X],cis[X]=fis[X];
csum==tsum?puts("YES"):puts("NO");
}
return 0;
}
反思与总结
在这题中,我们先观察操作的时间复杂度,把对出度的维护转化为对入度的维护;再通过哈希的手段给不同元素(不同结点连出来的边)以不同的值标识,并计算它们的和(
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
· 为什么 退出登录 或 修改密码 无法使 token 失效