题目传送门

题目大意

给出 \(t\) 个 \(n\) 个点 \(m\) 条边的无向图,每次可以从任意一棵树选择一条边删掉,然后该树不与根(为 \(1\) )联通的部分被删掉。不能操作的人输。问谁有必胜策略。

每棵树都满足:每个环都只会挂在叶子节点上。

\(n\le 100,m\le 500\)

思路

怎么说呢?很厉害的题目吧。

首先考虑一个树的情况,我们设 \(sg(u)\) 表示 \(u\) 子树内的 \(sg\) 函数值,我们可以得到转移式:

\[sg(u)=\text{mex}_{v\in son_u}\{sg(v)\}
\]
\[\Rightarrow sg(u)=\otimes_{v\in son_u} (sg(v)+1)
\]

这个可以通过打表发现,不过有一种比较巧妙的方法,就是说我们把主链拉出来,那么相当于每一个节点连了一条链,那么,删边就相当于取石子了。

然后考虑拓展到任意图上。这里给出一个结论:

一个环如果大小为偶数,它的顶点产生的贡献为 \(0\),反之为 \(1\)。

相当于环大小为偶数时,把环缩为一个点,否则再连向一个点。

考虑证明,我们发现我们可以通过枚举破掉环上哪条边来求,你发现环大小为偶数时,你破掉之后两条链长度一定一奇一偶,也就是对该环的根(挂的叶子)产生的贡献一定为偶数,所以第一个未出现的正整数一定为 \(1\)。同理,我们可以推出环大小为奇数的情况,这里就不再赘述了。

这里提醒一些细节:

  • 需要考虑重边

  • 需要考虑多个环串在一个顶点的情况

具体见代码就好了。

\(\texttt{Code1}\)

#include <cstdio>
#include <vector>
#include <cstring>
#include <bits/stdc++.h>
using namespace std; #define Int register int
#define MAXN 105 template <typename T> inline void read (T &t){t = 0;char c = getchar();int f = 1;while (c < '0' || c > '9'){if (c == '-') f = -f;c = getchar();}while (c >= '0' && c <= '9'){t = (t << 3) + (t << 1) + c - '0';c = getchar();} t *= f;}
template <typename T> inline void write (T x){if (x < 0){x = -x;putchar ('-');}if (x > 9) write (x / 10);putchar (x % 10 + '0');} int T,n,m,sg[MAXN],dep[MAXN],vis[MAXN]; int toop,head[MAXN],to[MAXN * 10],nxt[MAXN * 10]; void Add_Edge (int u,int v){
to[++ toop] = v,nxt[toop] = head[u],head[u] = toop;
to[++ toop] = u,nxt[toop] = head[v],head[v] = toop;
} int dfs (int u,int fa){
bool flag = 0;
dep[u] = dep[fa] + 1,vis[u] = 1;
for (Int i = head[u];i;i = nxt[i]){
int v = to[i];
if (!v) continue;
if (v == fa && !flag){
flag = 1;
continue;
}
if (vis[v]){
sg[v] ^= (dep[u] - dep[v] + 1 & 1);
to[i ^ 1] = 0;
return v;
}
else{
int cur = dfs (v,u);
if (!cur) sg[u] ^= sg[v] + 1;
else if (cur ^ u) return cur;
}
}
return 0;
} void clear (){
toop = 1,memset (head,0,sizeof (head));
for (Int i = 1;i <= n;++ i) sg[i] = dep[i] = vis[i] = 0;
} signed main(){
while (~scanf ("%d",&T)){
int ans = 0;
while (T --> 0){
read (n),read (m),clear ();
for (Int i = 1,u,v;i <= m;++ i) read (u),read (v),Add_Edge (u,v);
dfs (1,0),ans ^= sg[1];
}
puts (ans ? "Sally" : "Harry");
}
return 0;
}

\(\texttt{Code2}\)

#include <cstdio>
#include <vector>
using namespace std; #define Int register int
#define MAXN 105 template <typename T> inline void read (T &t){t = 0;char c = getchar();int f = 1;while (c < '0' || c > '9'){if (c == '-') f = -f;c = getchar();}while (c >= '0' && c <= '9'){t = (t << 3) + (t << 1) + c - '0';c = getchar();} t *= f;}
template <typename T> inline void write (T x){if (x < 0){x = -x;putchar ('-');}if (x > 9) write (x / 10);putchar (x % 10 + '0');} vector <int> G[MAXN];
int T,n,m,top,sg[MAXN],dep[MAXN],vis[MAXN],sta[MAXN]; void Add_Edge (int u,int v){
G[u].push_back (v),
G[v].push_back (u);
} void dfs (int u,int fa){
bool flag = 0;
sta[++ top] = u,vis[u] = 1;
for (Int i = 0;i < G[u].size();++ i){
int v = G[u][i];
if (v == fa && !flag){
flag = 1;
continue;
}
if (vis[v] == 1){
int cnt = 1;
while (sta[top] != v){
cnt ++;
vis[sta[top --]] = 0;
}
sg[v] ^= (cnt & 1);
}
else if (vis[v] == -1){
dfs (v,u);
if (vis[v]) sg[u] ^= sg[v] + 1;
}
}
if (vis[u]) -- top;
return ;
} void clear (){
top = 0;
for (Int i = 1;i <= n;++ i) sg[i] = dep[i] = 0,vis[i] = -1,G[i].clear ();
} signed main(){
while (~scanf ("%d",&T)){
int ans = 0;
while (T --> 0){
read (n),read (m),clear ();
for (Int i = 1,u,v;i <= m;++ i){
read (u),read (v);
if (u ^ v) Add_Edge (u,v);
}
dfs (1,0),ans ^= sg[1];
}
puts (ans ? "Sally" : "Harry");
}
return 0;
}

题解 Christmas Game的更多相关文章

  1. 题解 AT4278 【[ABC115A] Christmas Eve Eve Eve】

    题目传送门. 分析 根据题目,我们可以发现要求如下: \(d\)的值 输出 \(d=25\) Christmas \(d=24\) Christmas Eve \(d=23\) Christmas E ...

  2. POJ3160 Father Christmas flymouse[强连通分量 缩点 DP]

    Father Christmas flymouse Time Limit: 1000MS   Memory Limit: 131072K Total Submissions: 3241   Accep ...

  3. poj 3013 Big Christmas Tree (最短路径Dijsktra) -- 第一次用优先队列写Dijsktra

    http://poj.org/problem?id=3013 Big Christmas Tree Time Limit: 3000MS   Memory Limit: 131072K Total S ...

  4. 【POJ3710】Christmas Game (博弈-树上的删边问题)

    [题目] Description Harry and Sally were playing games at Christmas Eve. They drew some Christmas trees ...

  5. Codeforces:Good Bye 2018(题解)

    Good Bye 2018! 题目链接:https://codeforces.com/contest/1091 A. New Year and the Christmas Ornament 题意: 给 ...

  6. AtCoder Beginner Contest 115 题解

    题目链接:https://abc115.contest.atcoder.jp/ A Christmas Eve Eve Eve 题目: Time limit : 2sec / Memory limit ...

  7. Good Bye 2018题解

    Good Bye 2018题解 题解 CF1091A [New Year and the Christmas Ornament] 打完cf都忘记写题解了qwq 题意就是:给你一些黄,蓝,红的球,满足蓝 ...

  8. Codeforces Round #611 (Div. 3) A-F简要题解

    contest链接:https://codeforces.com/contest/1283 A. Minutes Before the New Year 题意:给一个当前时间,输出离第二天差多少分钟 ...

  9. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

随机推荐

  1. 新东方集团K12公益免费课战役记

    作者:张建鑫, 曾任IBM高级软件架构师, 滴滴高级技术专家, 现任新东方集团高级技术总监 1月31日,集团领导决定由产品技术中心的新东方APP团队牵头做周一到周五的集团公益课, 提供给全国中小学生使 ...

  2. Java 学习:对象和类

    对象和类 从认识的角度考虑是先有对象后有类.对象,是具体的事物.类,是抽象的,是对对象的抽象. 从代码运行角度考虑是先有类后又对象.类是对象的模板. 对象:对象是类的一个实例,有状态和行为. 类:类是 ...

  3. vue ele table表格 设置只能勾选一个

    table 更改属性设置: <el-table ref="multipleTable" :data="tableData" tooltip-effect= ...

  4. redis未授权getshell的4种方式

    前言 redis未授权漏洞或弱口令一直是很有用的渗透突破口,最近正好闲的无事就拿redis来测试一些,做一个简单的收集,方便自己日后的回顾. 漏洞描述 Redis 默认情况下,会绑定在 0.0.0.0 ...

  5. ThreadLocal原理简单刨析

    ThreadLocal原理简单刨析 ThreadLocal实现了各个线程的数据隔离,要知道数据是如何隔离的,就要从源代码分析. ThreadLocal原理 需要提前说明的是:ThreadLocal只是 ...

  6. 浅析Is-a,Has-a与like-a

    在面向对象的设计领域里,有很多设计思路,主要有三种:is-a.has-a.like-a. 这三种在java的类.接口.抽象类中很多体现,下面简述一下其定义. 1.Is-a(继承关系) is-a,顾名思 ...

  7. table头部固定,内容滚动,类似新闻一下向上滚动

    html: <div class="ul_box"> <table class="table1"> <thead> < ...

  8. tk.mybatis中常用方法的使用(最实用)

    一.前言 不知道环境和maven依赖怎么配置的,先看一下这个: SpringBoot整合tk.mybatis 二.方法的介绍和使用 插入方法 int insertSelective(T var1); ...

  9. tar解压缩问题

    gzip: stdin: unexpected end of filetar: 归档文件中异常的 EOFtar: 归档文件中异常的 EOFtar: Error is not recoverable: ...

  10. 现在互联网好多bug 想到都烦

    我接触计算机十多年了,只是在15年前发布一篇给计算机有关的技术文章,后来就在也不发表了,今天在163博客写个备录,,写到一半结果误 关了,,浪费了好几个小时,还以为像以前那样,又要重写,,这也是我不爱 ...