Portal --> broken qwq

Description

  初始的时候给你一棵树,每个节点上有一个正整数,这棵树经过一些操作之后可能变成一个森林,两个人轮流选择当前森林中的一棵树的树根,将该节点上面的数\(K\)变成\([K/a]\)(下取整,\(a\in [2,K+1]\)),当一个节点上的数变成\(0\)之后,这个节点会消失然后其所有儿子都会变成新的树根,如果一个人操作后森林中没有节点了那么该玩家获胜,求先手(\(Alice\))还是后手(\(Marisa\))有必胜策略

​  数据范围:\(n<=100000\),节点上的数不超过\(2^{63}\)
  

Solution

​  首先你的语文要好才能做出这题qwq注意数据范围是不超过,所以我们要用unsigned long long。。

​  然后考虑转化一下问题(所以为什么我想到怎么转化但是不会做==)

​  我们可以把问题转成一个取石子的模型,因为每个点至多操作\(log_2val+1\)次,然后。。因为\(a\in [2,val+1]\)所以。。总能让这个新的\(val\)(记为\(val'\))满足\(log_2val'+1\)等于一个小于\(log_2val+1\)的数,并且任意一个这个范围内的数都可以取到,所以。。。我们就看成一个节点上有\(log_2val\)个石子,每次都要取一个根节点上的至少一颗石子这样就好了

  然后。。接下来的事情就是。。\(sg\)函数

​  根据\(sg\)定理,一个局面的\(sg\)值为其拆成的子游戏的\(sg\)值的异或和,考虑当\(val=0\)的情况,这个节点的\(sg\)值应该就是其儿子的\(sg\)值异或和(因为。。\(val=0\)就相当其每一个儿子都是它拆出来的一个子游戏,而一个人在其中一个儿子的树中操作并不会影响到别的儿子的树,所以它们是相互独立的(一开始我的理解是错的,并不是说不能中途对其他子游戏操作,而是两个子游戏互不影响即算为独立)

  然后我们就可以得到\(val=0\)时的\(sg\)值,接下来要用的就是\(sg\)的另一个求法:一个局面的\(sg\)值是其后继局面的\(sg\)值的\(mex\),所以我们先取一次\(mex\)得到\(val=1\)的时候的\(sg\)值,再\(mex\)一次得到\(val=2\)的,以此类推。。然后我们就可以得到这个节点实际上的\(sg\)值啦

​  最后我们根据\(sg[1]\)判断先手获胜还是后手获胜即可

​   

​  代码大概长这个样子

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define ull unsigned long long
using namespace std;
const int N=1e5+10;
struct xxx{int y,nxt;
}a[N*2];
int h[N],val[N],in[N],sg[N];
int vis[N];
int n,m,tot,T,mark;
void add(int x,int y){a[++tot].y=y; a[tot].nxt=h[x]; h[x]=tot;}
void init(){memset(h,-1,sizeof(h));tot=0;memset(sg,0,sizeof(sg));
}
void dfs(int fa,int x){int u,son=0,ret=0,cnt;for (int i=h[x];i!=-1;i=a[i].nxt){u=a[i].y;if (u==fa) continue;++son;dfs(x,u);ret^=sg[u];}++mark;vis[ret]=mark;cnt=0;sg[x]=0;for (int i=1;i<=val[x];++i){while (vis[sg[x]]==mark) ++sg[x];vis[sg[x]]=mark;}
}int main(){
#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);
#endifull tmp;int x,y;while (scanf("%d",&n)!=EOF){for (int i=1;i<=n;++i){cin>>tmp;val[i]=(int)(log(1.0*tmp)/log(2.0))+1;}init();for (int i=1;i<n;++i){scanf("%d%d",&x,&y);++x; ++y;add(x,y); add(y,x);}dfs(0,1);if (sg[1]) printf("Alice\n");else printf("Marisa\n");}
}

转载于:https://www.cnblogs.com/yoyoball/p/9690506.html

【2016北京集训】魔法游戏相关推荐

  1. (2016北京集训十)【xsy1529】小Q与进位制 - 分治FFT

    题意很简单,就是求这个数... 其实场上我想出了分治fft的正解...然而不会打...然后打了个暴力fft挂了... 没啥好讲的,这题很恶心,卡常卡精度还爆int,要各种优化,有些dalao写的很复杂 ...

  2. 【2016北京集训测试赛】river

    HINT 注意是全程不能经过两个相同的景点,并且一天的开始和结束不能用同样的交通方式. [吐槽] 嗯..看到这题的想法的话..先想到了每个点的度为2,然后就有点不知所措了 隐隐约约想到了网络流,但并没 ...

  3. (2016北京集训十二)【xsy1542】疯狂求导

    题解: 这题看起来很难...但是实际上并没有想象中的那么难 第一眼看上去不会求导公式怎么办?不要紧,题目背景非常良心的给出了题目中的导数计算公式 求完导合并同类项很恶心怎么办?不要紧,样例解释说明了不 ...

  4. 2016北京集训测试赛(十三) Problem B: 网络战争

    Solution KD tree + 最小割树 转载于:https://www.cnblogs.com/ZeonfaiHo/p/7420354.html

  5. 【2016北京集训测试赛(八)】 直径 (虚树+树的直径)

    Description 注意:时限更改为4s 题解 考虑最原始的直径求法:找到离根节点(或离其他任意一点)最远的节点far1,再从far1出发找到离far1最远的节点far2,far1至far2的距离 ...

  6. 2016北京集训测试赛(九)Problem C: 狂飙突进的幻想乡

    Solution 我们发现, 对于一条路径来说, 花费总时间为\(ap + q\), 其中\(p\)和\(q\)为定值. 对于每个点, 我们有多条路径可以到达, 因此对于每个区间中的\(a\)我们可以 ...

  7. 北京集训:20180310

    北京集训的第一天,我完美爆零...... 这其中的经历,十分有趣呢. T1: 这题一看就是先猜一个性质然后利用他去求解. 如果我们知道怎么插入,怎么判定的话,可以线段树分治的说. 然后我猜了一个结论: ...

  8. 哈利波特魔法游戏(原创)

    背景 最近自学动态规划和图论,真的很难,所以想放松一下,用了3天的时间自己手敲,编了一个哈利波特的游戏(因为我是哈迷).目前功能尚未完善,后续更新. 简单的介绍 后期会增加提升等级和颜色变换的功能,敬 ...

  9. 球球大作战 2016年最火游戏前十 开发的新思路 和玩家体验

    游戏以玩家间的实时互动PK为设计宗旨,通过简单的规则将玩家操作直接转化为游戏策略,体验智谋碰撞的战斗乐趣.在这个球球的世界里,每个人都化身为一颗独特的球球,大球吃小球,努力生存下来就是唯一的目标. 2 ...

  10. 2016清华集训滚粗记

    DAY-1 白天还要去上学... 晚上吃了顿火锅就直接去火车站了... 都没有时间陪妹子看<你的名字>! 上火车之前好像知道了在绵阳发生的一些奇怪的事情... 在火车上和光老师周鹏还有jk ...

最新文章

  1. 树莓派出微控制器了!Raspberry Pi Pico 只需 4 美元
  2. HP一年升两年保修实例!(附图片)
  3. Django 笔记5 -- 数据库
  4. 类型转换出现在赋值运算符左边的情况
  5. jquery table ajax,JQuery Ajax动态加载Table数据的实例讲解
  6. uic计算机课程表,美国UIC大学研究生毕业率能达到多少?申请条件、专业课程汇总...
  7. Sublime Text 3 、WebStorm配置实时刷新
  8. 作者:高富平(1963-),男,博士,华东政法大学二级教授、博士生指导小组负责人...
  9. (1)JavaScript入门
  10. TeraTerm自动登录(Login)
  11. c++ 小游戏 NO 4 eye
  12. 常用 Peano 余项泰勒公式
  13. 本人面试两个月真实经历:面试了20家大厂之后,发现这样介绍项目经验,显得项目很牛逼!
  14. 汽车汽配行业SaaS多租户系统助力车企打通行业壁垒,构建数字化管理平台
  15. 804计算机考研,北京邮电大学804信号系统考研经验
  16. 9大增长黑客牛人组织盘点,增长黑客发展奠基人!
  17. 计算机语言中print是什么意思,PASCAL 语言中print是什么意思?
  18. python file是什么意思_Python一直提示runfile是什么意思?
  19. 文件管理(以Unix系统为例)
  20. 干接点信号_百度百科

热门文章

  1. 七年三套房,阿里程序员炫富,努力就有回报,感谢当初的选择!
  2. 阿里专家:怎么样消除程序员的中年危机?
  3. 2016年度最受欢迎的100个Java库
  4. 架构师都应该知道的康威定律
  5. 电脑下载python3.5.2教程_Win10系统如何搭建Python 3.5.2开发环境
  6. 使用UUID和int自增主键的区别
  7. PHP获取数组中重复值的键值
  8. C++ 11 新特性
  9. cocos2d-x 3.2线程安全的消息中心
  10. 一个有趣的.net程序死锁问题