Codeforces 1423N - BubbleSquare Tokens(归纳+构造)
一道思维题。
题目没有说无解输出 \(-1\),这意味着对于任意 \(G\) 一定存在一个合法的排列方案。因此可以考虑采用归纳法。对于一个点的情况显然成立,重点在于如何从 \(n-1\) 个点推到 \(n\) 个点。
然后就是我所想不到的地方了。考虑与第 \(n\) 个点相邻的点集 \(S\),我们先在第 \(n\) 个点与 \(S\) 相连的边上都放上一枚硬币,这样不过这样可能会不合法,因此我们需要调整。注意,由于是归纳,因此我们需要在不改变 \(1\sim n-1\) 号点的权值的情况下尝试调整 \(n\) 的权值,否则就会导致 \(1\sim n-1\) 不合法,也就是归纳前提不成立了。
进一步分析这个模型,注意到对于一个点 \(x\in T\) 有两种方法在不改变 \(x\) 的权值的前提下改变 \(n\) 的权值:
- 在 \(x\) 与 \(n\) 的边上拿走一个硬币,在 \(x\) 上放上一个硬币。
- 在 \(x\) 与 \(n\) 的边上放上一个硬币,在 \(x\) 上拿走一个硬币。
我们考虑这样的算法,对于所有 \(x\in S\) 且 \(x\) 上面没有硬币,我们对 \(x\) 进行一遍操作 \(1\),这样可以确保所有 \(S\) 中的硬币都可以进行操作 \(2\)。然后设现在 \(n\) 的权值为 \(v\),那么我们显然可以通过 \(2\) 操作将 \(n\) 的权值变为 \([v,v+|S|]\) 中的任意一个数。我们希望 \(n\) 的权值与 \(S\) 中点的权值都不同,而 \(S\) 中的点最多只有 \(|S|\) 个权值,因此总能变成一个不在 \(|S|\) 中的权值,得证。
代码异常好写:
u1s1 这种思维题就是题解写起来容易,想起来死活想不到……
const int MAXN=1.25e4;
const int MAXM=1e6;
int n,m,u[MAXM+5],v[MAXM+5],val[MAXN+5],w[MAXM+5],is[MAXN+5];
vector<pii> g[MAXN+5];
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;w[i]=1,i++){
scanf("%d%d",&u[i],&v[i]);
g[u[i]].pb(mp(v[i],i));
g[v[i]].pb(mp(u[i],i));
val[u[i]]++;val[v[i]]++;
}
for(int i=1;i<=n;i++){
queue<pii> q;set<int> st;
for(pii p:g[i]){
if(p.fi>i) continue;
if(!is[p.fi]) w[p.se]--,is[p.fi]++,val[i]--;
q.push(p);st.insert(val[p.fi]);
}
while(st.find(val[i])!=st.end()){
pii p=q.front();q.pop();
w[p.se]++;is[p.fi]--;val[i]++;
}
} vector<int> resv;
for(int i=1;i<=n;i++) if(is[i]) resv.pb(i);printf("%u\n",resv.size());
for(int i=0;i<resv.size();i++) printf("%d%c",resv[i]," \n"[i+1==resv.size()]);
for(int i=1;i<=m;i++) printf("%d %d %d\n",u[i],v[i],w[i]);
return 0;
}
Codeforces 1423N - BubbleSquare Tokens(归纳+构造)的更多相关文章
- Educational Codeforces Round 10 B. z-sort 构造
B. z-sort 题目连接: http://www.codeforces.com/contest/652/problem/B Description A student of z-school fo ...
- Codeforces 707C Pythagorean Triples(构造三条边都为整数的直角三角形)
题目链接:http://codeforces.com/contest/707/problem/C 题目大意:给你一条边,问你能否构造一个包含这条边的直角三角形且该直角三角形三条边都为整数,能则输出另外 ...
- Codeforces 1246D/1225F Tree Factory (构造)
题目链接 https://codeforces.com/contest/1246/problem/D 题解 首先考虑答案的下界是\(n-1-dep\) (\(dep\)为树的深度,即任何点到根的最大边 ...
- Codeforces - 1202D - Print a 1337-string... - 构造
https://codeforces.com/contest/1202/problem/D 当时想的构造是中间两个3,然后前后的1和7组合出n,问题就是n假如是有一个比较大的质数因子或者它本身就是质数 ...
- Codeforces 743C - Vladik and fractions (构造)
Codeforces Round #384 (Div. 2) 题目链接:Vladik and fractions Vladik and Chloe decided to determine who o ...
- Codeforces 1368E - Ski Accidents(构造+思维)
Codeforces 题面传送门 & 洛谷题面传送门 神仙构造题(不过可能我构造太烂了?) 首先考虑这个奇奇怪怪的 \(\dfrac{4}{7}\),以及这个每个点出度最多为 \(2\) 的条 ...
- Codeforces 1270E - Divide Points(构造+奇偶性)
Codeforces 题目传送门 & 洛谷题目传送门 显然,直接暴力枚举是不可能的. 考虑将点按横纵坐标奇偶性分组,记 \(S_{i,j}=\{t|x_t\equiv i\pmod{2},y_ ...
- codeforces 622C. Optimal Number Permutation 构造
题目链接 假设始终可以找到一种状态使得值为0, 那么两个1之间需要隔n-2个数, 两个2之间需要隔n-3个数, 两个3之间隔n-4个数. 我们发现两个三可以放到两个1之间, 同理两个5放到两个3之间. ...
- Codeforces 1019C Sergey's problem 构造
原文链接https://www.cnblogs.com/zhouzhendong/p/CF1019C.html 题目传送门 - CF1019C 题意 给定一个有 $n$ 个节点 . $m$ 条边的有向 ...
随机推荐
- 初学Python-day13 文件处理1
IO操作 一.os模块 作用:包含了操作系统的基本功能,提供了非常丰富的用来处理文件和目录的函数或方法. 1.属性 函数名 函数说明 name 获取操作系统的类型 uname 获取操作系统的信息(li ...
- [技术博客] Django中文件的保存与访问
[技术博客] Django中文件的保存与访问 在TextMarking项目开发中,数据库需要保存用户上传的文本文档. 原型设计:用户点击上传文本->保存文本->文本发送到后端保存为文件. ...
- OO_JAVA_表达式求导_单元总结
OO_JAVA_表达式求导_单元总结 这里引用个链接,是我写的另一份博客,讲的是设计层面的问题,下面主要是对自己代码的单元总结. 程序分析 (1)基于度量来分析自己的程序结构 第一次作业 程序结构大致 ...
- Intellij IDEA 2021.2.3 最新版免费激活教程(可激活至 2099 年,亲测有效)
申明,本教程 Intellij IDEA 最新版破解.激活码均收集与网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除.如条件允许,建议大家购买正版. 本教程更新于:2021 年 10 月 ...
- Myod 选做
一.题目要求 1.复习c文件处理内容 2.编写myod.c 用myod XXX实现Linux下od -tc -tx XXX的功能 3.main与其他分开,制作静态库和动态库 4.编写Makefile ...
- K8s 离线集群部署(二进制包无dashboard)
https://www.cnblogs.com/cocowool/p/install_k8s_offline.html https://www.jianshu.com/p/073577bdec98 h ...
- CentOS7自动备份oracle数据库
1.环境 操作系统:CentOS 7 数据库:11.2.0.1.0 2.登录服务器 切换oracle用户,备份需要在oracle用户下进行 #su - oracle 在oracle家目录下创建bin目 ...
- 你们不要再吵了! Java只有值传递..
写在前边 上次聊到Java8新特性 lambda时,有小伙伴在评论区提及到了lambda对于局部变量的引用,补充着博客的时候,知识点一发散就有了这篇对于值传递还是引用传递的思考.关于这个问题为何会有如 ...
- vm扩展磁盘容量后不能启动
主要原因是,新添加的磁盘空间没有分配,系统识别不出来,导致不能开机. 解决方法: 找到虚拟机的文件路径地址,默认是C:\Users\用户名\Documents\Virtual Machines\Cen ...
- c++学习笔记3(内联函数)
函数调用是有开销的,调用时需将参数放入栈中,返回地址也要放入,返回时还需从栈中取出,跳转返回地址去执行,需几条语句的时间,如果本身程序代码短,则会显得十分浪费,所以引入了内联函数的机制 写法:在函数前 ...