嵊州D2T3 玛利亚∙多斯普拉泽雷斯 完美配对
嵊州D2T3
玛利亚∙多斯普拉泽雷斯
公墓一共有 n 个墓地,通过 n − 1 条通道相连。
每次,推销员可以在选择一个墓地推销给玛利亚。
但是,考虑很多的玛利亚会尽量否决这个提议。
她会选择一个墓地,否决掉它和与它相连的墓地。
但为了礼仪,玛利亚不会选择推销员推销的或者已经被否决的墓地。
同样,为了礼仪,推销员也不会推销已经被否决的墓地。
如果某个被推销的墓地没有被否决,那么销售员就胜利了。
否则玛利亚就胜利了。
除此之外,玛利亚可以在任意时间以洪水为借口删除一些通道,每次删除的通道数量也是任意的,不过删除的通道总数不能超过 K。
两个墓地相连意味着这两个墓地由一条通道直接连接。
请判断双方都在最优策略下,谁能获胜。
Input
第一行两个整数 n, K,表示墓地数和允许删除的通道数量。
接下来 n−1 行,每行两个整数 ui , vi,表示 ui 号墓地与 vi 号墓地之间有一条通道。
Output
输出一行。
如果推销员胜利,输出’salesman’,否则输出’Maria’(不包括引号)。
Examples
| cemetery.in | cemetery.out |
| 2 1 1 2 | Maria |
Notes
对于所有数据,满足 0 ≤ K < n ≤ 5000。
Subtask1[10pts]
n ≤ 3
Subtask2[25pts]
n ≤ 6
Subtask3[30pts]
K = 0
Subtask4[35pts]
无特殊限制
Solve!
自言自语
我看完Solution后,想很煞笔的说句:
我怎么没听过“博弈”呀?
原来,是我蒻爆了。。。
题目解析
A:salesman B:Maria
给出一棵树
每次 A 可以选择一个点染 A
B 可以选择一个点把它和与它相邻的点染 B
B 可以在任何时候去掉一些边,
但总数不超过一个定值k
染过的点不能选择,但是染色标记可以覆盖
若最后所有点都染 B 色,B 赢,否则 A 赢
解题思路
这种题目可以按照Subtask一个一个想
Subtask1[10pts]
n ≤ 3
几个分类讨论就好啦
Subtask2[25pts]
n ≤ 6
首先可以发现边不管什么时候去掉 都是一样的
所以可以先枚举去边的情况,再进行搜索
Subtask3[30pts]
K = 0
可以发现,当且仅当 n = 2,赢
Subtask4[35pts]
无特殊限制
若原树不存在完美匹配,A 一定赢
A 每次操作可以强迫 B 和他一起染掉一个匹配
最后肯定会剩下孤立点,A 再选这个点就是 A 色了
若存在,A 可以第一步强迫 B 破坏掉完美匹配的性质,依然 A 赢
结论 2:若 K = 0 , N ≥ 3,A 赢
但是我还是想知道:
完美匹配又是什么呢?
在图论中,一个「匹配」(matching)是一个边的集合,其中任意两条边都没有公共顶点。
例如,图 3、图 4 中红色的边就是图 2 的匹配。
A 每次操作可以强迫 B 和他一起染掉一个匹配
最后肯定会剩下孤立点,A 再选这个点就是 A 色了




(图片来源:http://www.renfei.org/blog/bipartite-matching.html)
举例来说:
如下图所示,如果在某一对男孩和女孩之间存在相连的边,就意味着他们彼此喜欢。
是否可能让所有男孩和女孩两两配对,使得每对儿都互相喜欢呢?

图论中,这就是完美匹配问题。
如果换一个说法:最多有多少互相喜欢的男孩/女孩可以配对儿?
这就是最大匹配问题。
就是说,你要把一堆的点的连线中,删去一些,最后要求:每个点有且仅有一个出边。
所以他们要两两双向思嘛~呵呵呵o(* ̄︶ ̄*)o
但是,怎么求他们能不能两两配对嘛……
我瞄了一眼题解
Std代码不对应,请忽略!
#include <cstdio>
#include <algorithm>
#include <vector>
#define FOR(i, l, r) for(int i = l; i <= r; ++i)
#define mp(x, y) make_pair(x, y)
using namespace std;
typedef long long ll;
const int N = ;
const ll inf = 1e15;
struct edge{int u, v, lim;} e[N];
bool operator < (edge a, edge b) {return a.lim < b.lim;}
vector<pair<int, ll> > ans;
int n, m, Q, x;
int fa[N], a[N], og[N];
ll up[N];
int find(int x) {return x == fa[x] ? x : fa[x] = find(fa[x]);}
int main()
{
freopen("poisoning.in" , "r" , stdin);
freopen("poisoning.out" , "w", stdout); scanf("%d%d%d", &n, &m, &Q);
FOR(i, , n)
{
scanf("%d", a + i);
ans.push_back(mp(, a[i]));
}
FOR(i, , m) scanf("%d%d%d", &e[i].u, &e[i].v, &e[i].lim);
FOR(i, , n) fa[i] = i, up[i] = a[i], og[i] = ;
sort(e + , e + m + );
FOR(i, , m)
{
int p = find(e[i].u), q = find(e[i].v);
if (p == q) continue;
og[q] = min(max((ll)og[p], e[i].lim - up[p]), max((ll)og[q], e[i].lim - up[q]));
up[q] += up[p]; fa[p] = q; ans.push_back(mp(og[q], up[q]));
}
sort(ans.begin(), ans.end());
for(int i = ; i < ans.size(); ++i)
ans[i].second = max(ans[i].second, ans[i - ].second);
while (Q--)
{
scanf("%d", &x);
printf("%d\n", (--upper_bound(ans.begin(), ans.end(), make_pair(x, inf))) -> second + x);
}
return ;
}
Std
???
又用了STL?
看来std是个高手呀!
for循环都懒得写了,哼╭(╯^╰)╮
回到本源
若原树存在完美匹配
如果 B 能通过切边,把所有匹配都分割开来,B 赢,
否则 A 赢 充分性显然 A 选一个点,B 选与他匹配的一个点就好了
必要性: 如果不能完全分隔开,必然留下一个连通块,K = 0 , n > 2
由结论 2,A 赢
所以,贪心看下树有没有完美匹配就好了
时间复杂度 O(n)
5000 是用来吓唬人的?!?!?!
OK!
嵊州D2T3 玛利亚∙多斯普拉泽雷斯 完美配对的更多相关文章
- 在Grafana使用普罗米修斯
aaarticlea/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPCEtLSBHZW5lcmF0b3I6IE ...
- 记录一次k8s环境尝试过程(初始方案,现在已经做过很多完善,例如普罗米修斯)
记录一次Team k8s环境搭建过程(初始方案,现在已经做过很多完善,例如普罗米修斯) span::selection, .CodeMirror-line > span > span::s ...
- 一步步教你用Prometheus搭建实时监控系统系列(一)——上帝之火,普罗米修斯的崛起
上帝之火 本系列讲述的是开源实时监控告警解决方案Prometheus,这个单词很牛逼.每次我都能联想到带来上帝之火的希腊之神,普罗米修斯.而这个开源的logo也是火,个人挺喜欢这个logo的设计. 本 ...
- (2012年旧文)纪念史蒂夫乔布斯---IT界的普罗米修斯
谈苹果与乔布斯系列一 IT界的普罗米修斯 纪念PC界的先驱 史蒂夫乔布斯 2012-4-5 清明节,纪念IT时代的开创人—伟大的史蒂夫 乔布斯. 没有乔布斯,计算机还是属于一群科技人士的工具,没有漂 ...
- 当ABAP遇见普罗米修斯
Jerry每次在工作场合中同Prometheus(普罗米修斯)打交道时,都会"出戏",因为这个单词给我的第一印象,并不是用go语言实现的微服务监控利器,而是名导雷德利·斯科特(Ri ...
- 普罗米修斯Prometheus监控安装
普罗米修斯Prometheus监控安装 架构: 服务端:192.168.0.204 客户端:192.168.0.206 环境准备:所有节点安装go 语言环境 rz go1.12.linux-amd64 ...
- 监控神器-普罗米修斯Prometheus的安装
搬砖党的福音:普罗米修斯-监控神器 功能: 在业务层用作埋点系统 Prometheus支持多种语言(Go,java,python,ruby官方提供客户端,其他语言有第三方开源客户端).我们可以通过客户 ...
- 普罗米修斯+grafana监控k8s
其实现原理有点类似ELK.node-exporter组件负责收集节点上的metrics监控数据,并将数据推送给prometheus, prometheus负责存储这些数据,grafana将这些数据通过 ...
- 普罗米修斯!Ubuntu下prometheus监控软件安装使用
*Prometheus* 是一个开源的服务监控系统和时间序列数据库 官方网站:prometheus.io 一.安装prometheus cd /usr/local/ #进入安装目录 wg ...
随机推荐
- main()如果返回0,则代表程序正常退出,返回非零代表程序异常退出。
读到这里,大家应该了解了main函数返回值的来龙去脉了.下面介绍一下main函数返回值的作用以及如何获得这个返回值.main函数的返回值用于说明程序的退出状态.如果返回0,则代表程序正常退出.返回其它 ...
- 【C#】获取任意文件的缩略图
原文:[C#]获取任意文件的缩略图 因为用shell取缩略图时,对于损坏的文件,读出来的图有黑边,所以就诞生了以下方法,不过这个效率要比用shell取的低3-4倍. 1.添加类WindowsThumb ...
- Win10中解决Prolific PL2303出现错误代码10的问题
PL2303 是Prolific 公司生产的一种高度集成的RS232-USB接口转换器,在Win10中默认安装的驱动程序会出现错误代码10的问题,如下图所示: 下载Win10上可以用的PL2303驱动 ...
- C++和QML混合的QT程序调试方法
以前调试只是QML或者只是C++的QT程序很简单,断点打上,直接debug按钮一点,喝一口水,自然就停在断点了. 这次遇到C++和QML混合的程序,把CONFIG+=declarative_debug ...
- excel操作for(lutai)
条件统计某个区域的值 第一种方法: =SUMIFS(P2:P5,L2:L5,A2) 第一个参数:被求和的单元格范围 第二个参数:明细表条件值单元格范围 第三个参数:主表条件单元格(可以是范围) 公式的 ...
- Win8 Metro(C#)数字图像处理--2.62图像对数增强
原文:Win8 Metro(C#)数字图像处理--2.62图像对数增强 [函数名称] 对数增强 WriteableBitmap LogenhanceProcess(Writeabl ...
- RxJava入门优秀博客推荐
RxJava用了快半年了,现在越来越离不开这个库,从使用到逐渐接触它的背后实现,突然想写点什么关于RxJava的内容.在酝酿如何组织内容的时候,就去看看自己关于RxJava的收藏,发现满满的干货! 1 ...
- 基于VUE实现的新闻后台管理系统-一
基于VUE实现的新闻后台管理系统 前段时间拿到一个关于新闻后台的API,测试数据库使用SQLite,Restful服务是用Go写的,只要运行特定环境下的脚本(run.*)就会启动一个服务,依次后台为接 ...
- 在UWP的XAML中使用原始类型
问题: I'm trying to access the system namespace for StaticResource variables in XAML on UWP. Here's (m ...
- 如何把zip文件直接解压到内存里?
解压到硬盘再读进来耽误时间. var LZip: TZipFile; LMem: TMemoryStream; LBytes: TBytes;begin LZip := TZipFile.Cr ...