不难的题目。因为SG性质,所以只需要对一棵树求出。

然后如果发现从上往下DP不太行,所以从下往上DP。

考虑一个点对子树的合并,考虑下一个删的点在哪一个子树,那么剩下的状态实际上就是把一个子树所有能达到的状态异或上一个数。

此时还有不到子树的状态,直接插入子树SG异或值。

所以显然,就是维护一个支持全部异或,以及状态合并,查询mex的数据结构,直接trie合并带tag就好了。

时空复杂度 \(O(n \log n)\)

#include <bits/stdc++.h>const int MAXN = 100010;
const int UP = 21;
const int MN = MAXN * (UP + 1);
int son[MN][2], val[MN], tag[MN], txt;
void mktag(int u, int v) { tag[u] ^= v; }
void pushdown(int u, int dig) {if (tag[u]) {if (son[u][0]) mktag(son[u][0], tag[u]);if (son[u][1]) mktag(son[u][1], tag[u]);if (tag[u] >> dig & 1)std::swap(son[u][0], son[u][1]);tag[u] = 0;}
}
void update(int u) { val[u] = val[son[u][0]] + val[son[u][1]]; }
void insert(int & x, int v, int dig = UP) {if (!x) x = ++txt, son[x][0] = son[x][1] = val[x] = tag[x] = 0;if (dig == -1) return (void) (val[x] = 1);pushdown(x, dig);insert(son[x][v >> dig & 1], v, dig - 1);update(x);
}
int merge(int x, int y, int dig = UP) {if (!x || !y) return x | y;pushdown(x, dig), pushdown(y, dig);son[x][0] = merge(son[x][0], son[y][0], dig - 1);son[x][1] = merge(son[x][1], son[y][1], dig - 1);if (dig != -1) update(x);return x;
}
int query(int u, int dig = UP) {if (!u) return 0;if (val[son[u][0]] < (1 << dig)) return query(son[u][0], dig - 1);return query(son[u][1], dig - 1) | 1 << dig;
}
int head[MAXN], nxt[MAXN << 1], to[MAXN << 1], tot;
void addedge(int b, int e) {nxt[++tot] = head[b]; to[head[b] = tot] = e;nxt[++tot] = head[e]; to[head[e] = tot] = b;
}
int sg[MAXN], rts[MAXN];
bool vis[MAXN];
int solve(int u, int fa = 0) {vis[u] = true;int pre = 0, & rt = rts[u];for (int i = head[u]; i; i = nxt[i]) if (to[i] != fa)solve(to[i], u), pre ^= sg[to[i]];for (int i = head[u]; i; i = nxt[i]) if (to[i] != fa) {mktag(rts[to[i]], pre ^ sg[to[i]]);rt = merge(rt, rts[to[i]]);}insert(rt, pre);sg[u] = query(rt);return rt;
}
int n, m;
int main() {std::ios_base::sync_with_stdio(false), std::cin.tie(0);int T; std::cin >> T;while (T --> 0) {std::cin >> n >> m;for (int i = 1; i <= m; ++i) {int t1, t2; std::cin >> t1 >> t2;addedge(t1, t2);}int ans = 0;for (int i = 1; i <= n; ++i) if (!vis[i])solve(i), ans ^= sg[i];std::cout << (ans ? "Alice" : "Bob") << '\n';tot = 0; memset(head, 0, n + 1 << 2);memset(vis, 0, n + 1); txt = 0;memset(rts, 0, n + 1 << 2);}return 0;
}

转载于:https://www.cnblogs.com/daklqw/p/11563341.html

【清华集训2016】Alice和Bob又在玩游戏相关推荐

  1. Trie树合并 + SG函数 ---- BZOJ4730. Alice和Bob又在玩游戏(动态开点Trie 树上全局异或标记 + 合并 + 博弈论)

    题目大题 题目大意: 解题思路: 首先我们对于子树u的SG函数为SG函数为SG函数为 ⨁是异或和\bigoplus是异或和⨁是异或和 SG[u]=mex{⨁w∈(w的父亲在u到v的路径上)SG[w]∣ ...

  2. UOJ #274. 【清华集训2016】温暖会指引我们前行 [lct]

    #274. [清华集训2016]温暖会指引我们前行 题意比较巧妙 裸lct维护最大生成树 #include <iostream> #include <cstdio> #incl ...

  3. [清华集训2016]石家庄的工人阶级队伍比较坚强——三进制FWT

    题目链接: [清华集训2016]石家庄的工人阶级队伍比较坚强 题目大意:有$n=3^m$个人玩石头剪刀布,共$t$轮游戏,每轮每个人要和包括自己的所有人各进行$m$次石头剪刀布.每个人在$m$轮中的决 ...

  4. 【清华集训2016】数据交互

    [清华集训2016]数据交互 比较神的\(DDP\). 首先对于给出的一条链我们分两部分统计:\(lca\)以及其他部分. 我们设两个变量\(w_i,g_i\).一条路径的权值就是路径上所有点的\(w ...

  5. P6669 [清华集训2016] 组合数问题

    P6669 [清华集训2016] 组合数问题 题意: 给你n,m,k,问有多少对(i,j)满足K∣CijK|C_{i}^{j}K∣Cij​ (Cij是k的倍数C_{i}^{j}是k的倍数Cij​是k的 ...

  6. [清华集训2016]你的生命已如风中残烛——组合数学

    题目链接: [清华集训2016]你的生命已如风中残烛 题目大意:共有$m+1$张牌,其中有$n$张特殊牌,每张特殊牌有一个权值$w_{i}$表示取到这张牌能获得$w_{i}$次再抽牌的机会,保证$\s ...

  7. uoj#268. 【清华集训2016】数据交互(动态dp+堆)

    传送门 动态dp我好像还真没咋做过--通过一个上午的努力光荣的获得了所有AC的人里面的倒数rk3 首先有一个我一点也不觉得显然的定理,如果两条路径相交,那么一定有一条路径的\(LCA\)在另一条路径上 ...

  8. UOJ#272. 【清华集训2016】石家庄的工人阶级队伍比较坚强

    传送门 设运算 \(op1,op2\),一个表示三进制不进位的加法,一个表示不退位的减法 设 \(cnt1[x],cnt2[x]\) 分别表示 \(x\) 转成三进制后 \(1/2\) 的个数 那么 ...

  9. BZOJ.4738.[清华集训2016]汽水(点分治 分数规划)

    BZOJ UOJ 记\(val_i\)是每条边的边权,\(s\)是边权和,\(t\)是经过边数,\(k\)是给定的\(k\). 在点分治的时候二分答案\(x\),设\(|\frac st-k|=x\) ...

最新文章

  1. android特效按钮点击效果
  2. 移动端点击(click)事件延迟问题的产生与解决方法
  3. C# GDI+ 画坐标(x,y)
  4. 2015 Spark 将走向哪里?
  5. C语言 strcat_s 函数 - C语言零基础入门教程
  6. Solr 部分 局部字段修改 更新 删除
  7. 如何让.Net控件在设计时InitializeComponent()中不生成相关代码
  8. 04-01 常见接口协议
  9. Docker简单入门
  10. dapperpoco mysql_DapperPoco -- 基于Dapper的、轻量级的、高性能的、简单的、灵活的ORM框架...
  11. VirtualBox 安装 win11 虚拟机
  12. 如何将应用从Win7迁移到Win10 ?
  13. 从NLP任务中文本向量的降维问题,引出LSH(Locality Sensitive Hash 局部敏感哈希)算法及其思想的讨论...
  14. math_常用放缩不等式及其变形@指数@对数@三角函数@一次函数
  15. Office 365入门教程(一):开始使用Office 365
  16. 希尔伯特谱、边际谱、包络谱、瞬时频率/幅值/相位——Hilbert分析衍生方法及MATLAB实现
  17. hive建表与mysql建表的区别
  18. 【转载】200多个js技巧代码
  19. linux下的逆向工具有哪些,iOS逆向(八)逆向工具 otool 介绍
  20. GPS、谷歌、百度、高德坐标相互转换

热门文章

  1. javascript 对象详解
  2. 微软System Center 2012推进私有云计算
  3. Github上Pandas,Numpy和 Scipy三个库中20个最常用的函数
  4. OpenCV中XML文件和YAML文件的读写
  5. HashMap 你真的了解吗?
  6. 在Project 2010中添加自定义任务窗格
  7. 从汉诺塔讲递归的思考方式
  8. node(ActiveMq)
  9. [PHP] Laravel常见报错总结(持续更新)
  10. wordpress on Zencart (WOZ) Ultimate SEO URLs 静态化