bzoj3729-Gty的游戏【Splay,博弈论】

正题

题目链接:https://darkbzoj.tk/problem/3729


题目大意

给出nnn个点的一棵树,第iii个节点上有aia_iai个石子,然后每次可以选择不超过LLL个石子移动到父节点处。要求支持操作

  • 以一个节点的子树进行博弈是否有先手必胜
  • 修改一个节点的石子个数
  • 插入一个新的叶子

1≤n,m≤5×104,1≤L≤1091\leq n,m\leq 5\times 10^4,1\leq L\leq 10^91n,m5×104,1L109


解题思路

额,首先是阶梯博弈和巴什博弈的缝合怪

巴什博弈结论是石头直接模上一个L+1L+1L+1,然后阶梯博弈要分奇偶深度

然后不带插入的话就是维护dfsdfsdfs序区间的奇数深度和偶数深度的异或和就好了,但是要插入所以要一次改一堆dfsdfsdfs序,所以要用SplaySplaySplay维护就好了。

时间复杂度O(mlog⁡n)O(m\log n)O(mlogn)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e5+10;
struct node{int to,next;
}a[N<<1];
int n,m,L,tot,ls[N],dep[N],v[2][N];
int t[N][2],fa[N],w[2][N],d[N],last;
bool Direct(int x)
{return t[fa[x]][1]==x;}
void PushUp(int x){if(!x)return;w[0][x]=v[0][x]^w[0][t[x][0]]^w[0][t[x][1]];w[1][x]=v[1][x]^w[1][t[x][0]]^w[1][t[x][1]];d[x]=min(dep[x],min(d[t[x][0]],d[t[x][1]]));return;
}
void Rotate(int x){int y=fa[x],z=fa[y];int xs=Direct(x),ys=Direct(y);int w=t[x][xs^1];t[x][xs^1]=y;t[y][xs]=w;if(z)t[z][ys]=x;if(w)fa[w]=y;fa[y]=x;fa[x]=z;PushUp(y);PushUp(x);return; 
}
void Splay(int x,int f){while(fa[x]!=f){int y=fa[x];if(fa[y]==f)Rotate(x);else if(Direct(x)==Direct(y))Rotate(y),Rotate(x);else Rotate(x),Rotate(x);}return;
}
int Find(int x,int k){if(d[t[x][0]]<=k)Find(t[x][0],k);if(dep[x]<=k)return x;return Find(t[x][1],k);
}
void addl(int x,int y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;return;
}
void dfs(int x,int F){t[last][1]=x;fa[x]=last;last=x;dep[x]=dep[F]+1;if(dep[x]&1)swap(v[0][x],v[1][x]);for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(y==F)continue;dfs(y,x);}return;
}
void Downdata(int x)
{PushUp(x);if(fa[x])Downdata(fa[x]);return;}
int main()
{freopen("1.in","r",stdin);freopen("1.out","w",stdout);scanf("%d%d",&n,&L);d[0]=n+1;for(int i=1;i<=n;i++)scanf("%d",&v[0][i]),v[0][i]%=(L+1);for(int i=1;i<n;i++){int x,y;scanf("%d%d",&x,&y);addl(x,y);addl(y,x);}last=N-1;d[N-1]=dep[N-1]=n+1;dfs(1,0);t[last][1]=N-2;fa[N-2]=last;last=N-2;d[N-2]=dep[N-2]=n+1;Downdata(last);int sum=0;scanf("%d",&m);for(int i=1;i<=m;i++){int op,z,x,y;scanf("%d",&op);if(op==1){scanf("%d",&x);x^=sum;if(i==106)i++,i--;Splay(x,0);if(d[t[x][1]]>dep[x]){if(w[(dep[x]&1)^1][t[x][1]])puts("MeiZ"),sum++;else puts("GTY");}else{y=Find(t[x][1],dep[x]);Splay(y,x);if(w[(dep[x]&1)^1][t[y][0]])puts("MeiZ"),sum++;else puts("GTY");}}else if(op==2){scanf("%d%d",&x,&y);x^=sum;y^=sum;Splay(x,0);v[dep[x]&1][x]=y%(L+1);PushUp(x);}else if(op==3){scanf("%d%d%d",&x,&y,&z);z^=sum;x^=sum;y^=sum;dep[y]=dep[x]+1;v[dep[y]&1][y]=z%(L+1);PushUp(y);Splay(x,0);int k=t[x][1];while(t[k][0])k=t[k][0];Splay(k,x);fa[y]=k;t[k][0]=y;PushUp(k);PushUp(x);}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318909.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

牛客题霸 [ 求路径] C++题解/答案

牛客题霸 [ 求路径] C题解/答案 题目描述 一个机器人在mn大小的地图的左上角&#xff08;起点&#xff0c;下图中的标记“start"的位置&#xff09;。 机器人每次向下或向右移动。机器人要到达地图的右下角。&#xff08;终点&#xff0c;下图中的标记“Finish"的位…

【.NET Core项目实战-统一认证平台】第七章 网关篇-自定义客户端限流

上篇文章我介绍了如何在网关上增加自定义客户端授权功能&#xff0c;从设计到编码实现&#xff0c;一步一步详细讲解&#xff0c;相信大家也掌握了自定义中间件的开发技巧了&#xff0c;本篇我们将介绍如何实现自定义客户端的限流功能&#xff0c;来进一步完善网关的基础功能。…

codeforces855 C. Helga Hufflepuff‘s Cup(树形dp)

C. Helga Hufflepuff’s Cup 比较经典的树形dp套路。由于题目限制某类点的数量&#xff0c;因而状态需要记录一下子树中该特殊点的数量。 设计dp&#xff1a; fu,j,kf_{u,j,k}fu,j,k​以uuu为根的子树中&#xff0c;选了jjj个特殊值&#xff08;点权K&#xff09;&#xff0c…

牛客题霸 [链表中倒数第k个结点] C++题解/答案

链表中倒数第k个结点 题解&#xff1a; 我们把链表存两份&#xff0c;让其中一个先走k个节点&#xff0c;然后两个链表一起走&#xff0c;直到第一个链表到头&#xff0c;因为两个相差k个节点&#xff0c;所以第二个链表停的位置就是倒数第k个 代码&#xff1a; /* struct …

P3343-[ZJOI2015]地震后的幻想乡【dp,数学期望】

正题 题目链接:https://www.luogu.com.cn/problem/P3343 题目大意 给出nnn个点的一张无向图&#xff0c;每条边被修复的时间是[0,1][0,1][0,1]的一个随机实数&#xff0c;求这张图联通期望时间。 1≤n≤10,m≤n(n−1)21\leq n\leq 10,m\leq \frac{n(n-1)}{2}1≤n≤10,m≤2n(n…

codeforces229 D. Towers(dp+贪心)

D. Towers 设计dp&#xff1a; fif_ifi​表示考虑到iii时满足题意的最小代价。 考虑最后一步&#xff0c;也就是最后一组合并即fifj{aj1⋯ai}f_if_j\{a_{j1}\dotsa_i\}fi​fj​{aj1​⋯ai​} 在满足最优条件的同时让当前aia_iai​最小&#xff08;贪心&#xff09; #include&…

1.14 日志(递推ybtoj)

明天要模拟&#xff0c;n年未碰电脑&#xff0c;先不学新的了。。。。 1.错排问题 dp最棒了 code: #include #include #include #include #include using namespace std; const int MINT_MAX; long long f[25][25]{ };//f[i][j]表示有i个数&#xff0c;其中j个数可以随便填 …

牛客题霸 [买卖股票的最好时机] C++题解/答案

买卖股票的最好时机 题解&#xff1a; 设两个变量&#xff0c;一个为minn&#xff0c;一个为maxx 当遇到比当前minn还小的价钱时&#xff0c;就更新minn 当与minn大时&#xff0c;就计算如果这个价卖出&#xff0c;赚多少钱&#xff0c;maxx不断更新取最大值 这样&#xff0c…

P7600-[APIO2021]封闭道路【堆,dp】

正题 题目链接:https://www.luogu.com.cn/problem/P7600 题目大意 给出nnn个点的一棵树&#xff0c;边有边权&#xff0c;对于每个kkk求去掉最小边权和的点使得每个点的度数都不超过kkk。 1≤n≤1051\leq n\leq 10^51≤n≤105 题目大意 APIO遇到的原题&#xff0c;和CF1119F…

codeforces1497 D. Geniue(dp+图论)

D. Geniue Frozen_Guardian题解 Implicit_总结 首先把此序列看作一个完全图&#xff0c;然后按照边权从小到大的顺序枚举边。 如何按照边权从小到大枚举边? 下面考虑形如边(a,b)(a,b)(a,b)都默认a<ba<ba<b。 任意考虑两条边(a,b)(a,b)(a,b)和(c,d)(c,d)(c,d)&…

1.16 模拟(排序)

# 总结 845分 我好菜啊qwq 第九题&#xff08;站队&#xff09;出了bug。。。 没有考虑到中位数会存在重叠错误问题&#xff08;直接卡掉5个点就离谱&#xff09; 后来发现其实第九题暴搜也能过。。。&#xff08;要是IOI赛制就能ak了&#xff09; 前面的水题不贴了 # 9.士兵站…

牛客题霸 [判断一个链表是否为回文结构] C++题解/答案

判断一个链表是否为回文结构 题目描述 给定一个链表&#xff0c;请判断该链表是否为回文结构。 题解&#xff1a; 直接将链表内的数据存入string中&#xff0c;然后从两端开始向中间判断即可 代码&#xff1a; /*** struct ListNode {* int val;* struct ListNode *next;…

HDU6736 F.Forest Program(dfs找环)

F.Forest Program 千摆渡题解 找环可以使用dfs一遍求出。 方法为&#xff1a;vis数组设置为三种状态&#xff0c;0表示未被访问过。1表示正在被访问&#xff0c;即边指向的结点是当前结点在dfs树上的祖先节点。2表示访问完毕。同时dfs的同时记录每一个结点的先驱pre。如果边访…

P7324-[WC2021]表达式求值【dp】

正题 题目链接:https://www.luogu.com.cn/problem/P7324 题目大意 给一个只包含mmm个值的表达式&#xff0c;<<<表前后取最小值&#xff0c;>>>表前后取最大&#xff0c;???可以是小于也可以是大于。 然后nnn次给出这mmm个值&#xff0c;所有方案下表达…

平面分割 题解(1.16 递推模拟)

平面分割 代码一行&#xff0c;解析一箱~~ 解析 计f[i]&#xff1a;从1到i累加之和 先假设最好情况&#xff0c;p2&#xff1b; 此时第一条会增加1个 第二条与第一条相交&#xff0c;再加2个 第三条与前2条相交&#xff0c;再加3个 … 故n条时共增加f[n]个&#xff0c;共f[n]…

牛客题霸 [二叉树的最大深度]C++题解/答案

二叉树的最大深度 题目描述 求给定二叉树的最大深度&#xff0c; 最大深度是指树的根结点到最远叶子结点的最长路径上结点的数量。 题解&#xff1a; 众所周知&#xff0c;树有左子树和右子树&#xff0c;每向下一层&#xff0c;深度就1, 所以我们就不断递归&#xff0c;看…

AT1983-[AGC001E]BBQ Hard【dp,组合数学】

正题 题目链接:https://www.luogu.com.cn/problem/AT1983 题目大意 给出nnn个数对(ai,bi)(a_i,b_i)(ai​,bi​) 求 ∑i1n∑ji1n(aibiajbjaiaj)\sum_{i1}^n\sum_{ji1}^n\binom{a_ib_ia_jb_j}{a_ia_j}i1∑n​ji1∑n​(ai​aj​ai​bi​aj​bj​​) 1≤n≤2105,1≤ai,bi≤20001…

.NET Core实战项目之CMS 第二章 入门篇-快速入门ASP.NET Core看这篇就够了

本来这篇只是想简单介绍下ASP.NET Core MVC项目的&#xff08;毕竟要照顾到很多新手朋友&#xff09;&#xff0c;但是转念一想不如来点猛的&#xff08;考虑到急性子的朋友&#xff09;&#xff0c;让你通过本文的学习就能快速的入门ASP.NET Core。既然是快速入门所以过多过深…

codeforces1301 F. Super Jaber(多源bfs+枚举)

F. Super Jaber 最终答案的方案可以分为2种&#xff1a; 不使用传送&#xff0c;即曼哈顿距离。从起点S到最近&#xff08;步数最少&#xff09;的颜色为C的格子x&#xff0c;传送到离终点T最近的颜色也为c的格子y&#xff0c;再走到T&#xff08;从S到x以及y到T的过程中均使…

题解: 区间合并(opj 2-4-7620)

一开始轻视这道题了&#xff0c;想用各种各样奇怪的区间标记把这道题水掉&#xff0c;结果WA声一片。。&#xff08;我大意了&#xff0c;没有AC&#xff01;&#xff09; 后来大脑开始思考&#xff0c;贪心解决掉了&#xff0c;AC快乐~~&#xff08;忽略这道题来自分治…qwq&a…