CF1423N BubbleSquare Tokens
I.CF1423N BubbleSquare Tokens
神仙构造题。
首先,我们令所有点初始都没有放币,所有边上都放了一个币。则此时每个点的权值即为它的度数。
然后,我们考虑从小到大计算每个点的权值。对于每个点,我们枚举它所有相邻且编号比它小的点,假如该点上没有币,就把币从连接两点的边上移到另一端的点上。明显这样操作并不会改变该点的权值,只会减少当前点的权值。
这之后,上述所有点上都有了币。则我们可以选择将某些币移回边上,显然这只会单纯增加当前点的权值。假设当前点与个点相邻,则它的权值可以被加上中任何一个数(取决于你究竟打算移回多少个币)。而这共个值中,最多只有个值被其余点占去,则当前点完全可以占住剩下那一个。直接使用一个哈希表维护有哪些值被占去即可。
时间复杂度或,取决于使用哪种哈希表。
代码:
#include<bits/stdc++.h>
using namespace std;
int n,m,cnt;
bool on[12510];
int sum[12510];
int val[1001000],s[1001000],t[1001000];
vector<int>v[12510];
set<int>hs;
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)scanf("%d%d",&s[i],&t[i]),val[i]=1,sum[s[i]]++,sum[t[i]]++,v[s[i]].push_back(i),v[t[i]].push_back(i);
for(int i=1;i<=n;i++){
for(auto j:v[i]){
if((s[j]^t[j]^i)>i)continue;
if(!on[s[j]^t[j]^i])on[s[j]^t[j]^i]=true,val[j]--,sum[i]--;
hs.insert(sum[s[j]^t[j]^i]);
}
for(auto j:v[i]){
if((s[j]^t[j]^i)>i)continue;
if(hs.find(sum[i])==hs.end())break;
on[s[j]^t[j]^i]=false,val[j]++,sum[i]++;
}
hs.clear();
}
for(int i=1;i<=n;i++)cnt+=on[i];
printf("%d\n",cnt);
for(int i=1;i<=n;i++)if(on[i])printf("%d ",i);if(cnt)puts("");
for(int i=1;i<=m;i++)printf("%d %d %d\n",s[i],t[i],val[i]);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 【杂谈】分布式事务——高大上的无用知识?