2021牛客暑期多校训练营5 E-Eert Esiwtib(树形dp+位运算)

E-Eert Esiwtib

位运算考虑贡献时分0/1按位模拟考虑
fu,0/1/2f_{u,0/1/2}fu,0/1/2表示子树u中点(包括u)到u所有路径的或/与/异或值。

转移的时候我们要考虑两个东西,一个是位运算对于路径值的影响,另一个是位运算对于所有路径值的或/与/异或和的影响。

合并子树的时候自己稍微推下式子即可,按位并且0/1拆分考虑贡献更容易帮助理解。

Alkaid~题解

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
template <class T=int> T rd()
{T res=0;T fg=1;char ch=getchar();while(!isdigit(ch)) {if(ch=='-') fg=-1;ch=getchar();}while( isdigit(ch)) res=(res<<1)+(res<<3)+(ch^48),ch=getchar();return res*fg;
}
const int N=200010;
int h[N],e[N],ne[N],op[N],idx;
void add(int a,int b,int c){e[idx]=b,ne[idx]=h[a],op[idx]=c,h[a]=idx++;}
int n,m;
ll val[N];
vector<pair<int,int>> q[105];
ll f[N][3],g[N][3];
ll ans[N][3];
int sz[N];
void update(int u,int v,int op)
{if(op==0){f[u][0]|=f[v][0]|val[u];f[u][1]&=f[v][1]|val[u];f[u][2]^=(sz[v]&1?val[u]:0)|(~val[u]&f[v][2]);}else if(op==1){f[u][0]|=f[v][0]&val[u];f[u][1]&=f[v][1]&val[u];f[u][2]^=f[v][2]&val[u];}else{f[u][0]|=(f[v][0]&~val[u])|(~f[v][1]&val[u]);f[u][1]&=(f[v][1]&~val[u])|(~f[v][0]&val[u]);f[u][2]^=(sz[v]&1?val[u]:0)^f[v][2];}
}
void dfs(int u,int fa)
{sz[u]=1;f[u][0]=0; // 或f[u][1]=-1;// 与f[u][2]=0; // 异或for(int i=h[u];i!=-1;i=ne[i]){int v=e[i];if(v==fa) continue;dfs(v,u);sz[u]+=sz[v];update(u,v,op[i]);}memcpy(g[u],f[u],sizeof f[u]);f[u][0]|=val[u];f[u][1]&=val[u];f[u][2]^=val[u];
}
int main()
{n=rd(),m=rd();memset(h,-1,sizeof h);for(int i=1;i<=n;i++) val[i]=rd<ll>();for(int i=2;i<=n;i++) {int u=rd(),op=rd();add(u,i,op);}for(int i=1;i<=m;i++){int d=rd(),u=rd();q[d].push_back({u,i});}for(int d=0;d<=100;d++){if(d) for(int i=1;i<=n;i++) val[i]+=i;dfs(1,0);for(auto&[u,k]:q[d]) memcpy(ans[k],g[u],sizeof g[u]);}for(int i=1;i<=m;i++) printf("%lld %lld %lld\n",ans[i][0],ans[i][1],ans[i][2]);return 0;
}

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

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

相关文章

大赛:2021省选 总结

文章目录概要想清楚再敲代码&#xff01;&#xff01;&#xff01;仔细审题&#xff01;&#xff01;&#xff01;Day1T1 卡牌游戏T2 矩阵游戏T3 图函数day 2T1 宝石T2 滚榜T3 支配概要 想清楚再敲代码&#xff01;&#xff01;&#xff01; 仔细审题&#xff01;&#xff01…

CometOJ-[Contest #10]鱼跃龙门【exgcd】

正题 题目链接:https://cometoj.com/problem/1479 题目大意 给出nnn求一个最小的x(x>0)x(x>0)x(x>0)满足 (∑i1xi)≡0(modn)\left(\sum_{i1}^xi\right)\equiv 0(\mod n)(i1∑x​i)≡0(modn) 1≤n≤1012,1≤T≤1001\leq n\leq 10^{12},1\leq T\leq 1001≤n≤1012,1≤…

牛客题霸 [ 最小的K个数] C++题解/答案

牛客题霸 [ 最小的K个数] C题解/答案 题目描述 输入n个整数&#xff0c;找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字&#xff0c;则最小的4个数字是1,2,3,4。 题解&#xff1a; 如果有n<k的就输出空vector 然后对input进行排序&#xff0c;取前k个值 代码&…

codeforces1559 D2. Mocha and Diana (Hard Version)(并查集+启发式合并+随机化)

D2. Mocha and Diana (Hard Version) RunningBeef题解 首先将图1的点与1号点所在的连通块相连&#xff0c;图2类似。 然后就是在图1和图2中选择没有和1号点在同一个连通块的点&#xff0c;能连边就连。 #include<bits/stdc.h> using namespace std; using lllong long…

ybtoj祭坛

文章目录冲啊&#xff01;&#xff08;100题祭&#xff09;125题祭140题祭首次登顶&唯一AC150题祭160题祭170题祭冲啊&#xff01;&#xff08;100题祭&#xff09; 2021.4.11 刚好100道 其实是前几天到的&#xff08;忘了是哪一道了。。。&#xff09; 今天写省选题解开了…

牛客题霸 [ 判断一棵二叉树是否为搜索二叉树和完全二叉树] C++题解/答案

牛客题霸 [ 判断一棵二叉树是否为搜索二叉树和完全二叉树] C题解/答案 题解&#xff1a; 搜索二叉树满足以下性质&#xff1a; 1.非空左子树的所以键值小于其根节点的键值 2.非空右子树的所有键值大于其根节点的键值 3.左&#xff0c;右子树都是二叉搜索树 完全二叉树&#x…

CF573D-Bear and Cavalry【动态dp】

正题 题目链接:https://www.luogu.com.cn/problem/CF573D 题目大意 给出nnn个人nnn匹马&#xff0c;每个人/马有能力值wiw_iwi​/hih_ihi​。 第iii个人开始对应第iii匹马&#xff0c;每个人不能选择对应的马&#xff0c;给每个人分配一个马后求最大的∑wihj\sum w_i\times …

C++ __gnu_pbds(hash,可并堆,平衡树)

pb_ds 是GNU-C自带的一个C的扩展库&#xff0c;其中实现了很多数据结构&#xff0c;比STL里面的功能更强大 #include<ext/pb_ds/assoc_container.hpp> #include<ext/pb_ds/tree_policy.hpp> // 用tree #include<ext/pb_ds/hash_policy.hpp> // 用hash #…

理解至上:二叉堆与优先队列详细用法

文章目录二叉堆概述插入代码访问代码完整代码优先队列&#xff1a;priority_queue基本用法小根堆的声明&#xff1a;结构体注意Thanks for reading&#xff01;二叉堆 概述 为什么不用pq呢 算比较简单的数据结构了 它可以用log的时间复杂度插入元素和访问&#xff08;取出&am…

AT5661-[AGC040C]Neither AB nor BA【模型转换】

正题 题目链接:https://www.luogu.com.cn/problem/AT5661 题目大意 一个包含A,B,CA,B,CA,B,C的序列&#xff0c;每次可以选择相邻的两个除了ABABAB和BABABA的删去。 求有多少个长度为NNN的序列可以删完。 1≤N≤1071\leq N\leq 10^71≤N≤107 解题思路 因为每次是删除一个奇…

牛客题霸 [矩阵的最小路径和] C++题解/答案

牛客题霸 [矩阵的最小路径和] C题解/答案、 题目描述 给定一个 n * m 的矩阵 a&#xff0c;从左上角开始每次只能向右或者向下走&#xff0c;最后到达右下角的位置&#xff0c;路径上所有的数字累加起来就是路径和&#xff0c;输出所有的路径中最小的路径和。 题解&#xff…

2021牛客暑期多校训练营7 B-xay loves monotonicity(线段树+不降子序列)

P4198 楼房重建 线段树维护以某点为开头的最长不下降子序列 使用下面calc函数能够计算线段树u维护的区间中&#xff0c;以x为开头最长不下降子序列的个数。 calc需要维护区间最值。 template<typename T> int calc(int u,T x) {if(tree[u].ltree[u].r) return tree[u]…

不止代码:最长上升序列

文章目录题目描述样例解析仔细审题&#xff01;&#xff01;&#xff01;&#xff01;代码题目描述 给定一个序列 求出它的单调上升序列长度并输出这个序列 样例 in: 13 7 9 16 38 24 37 18 44 19 21 22 63 15 out&#xff1a; max8 7 9 16 18 19 21 22 63解析 这题我一开始…

AT2305-[AGC010D]Decrementing【博弈论】

正题 题目链接:https://www.luogu.com.cn/problem/AT2305 题目大意 nnn个数字两个人进行博弈&#xff0c;每个人的操作为 选择一个大于1的数字减一之后所有数字除以所有数字的gcdgcdgcd 无法操作者败&#xff0c;保证初始所有数字互质 求是否先手必胜 1≤n≤1051\leq n\leq…

牛客题霸 [删除链表的倒数第n个节点] C++题解/答案

牛客题霸 [删除链表的倒数第n个节点] C题解/答案 题目描述 给定一个链表&#xff0c;删除链表的倒数第n个节点并返回链表的头指针 例如&#xff0c; 给出的链表为:1->2->3->4->5, n 2. 删除了链表的倒数第n个节点之后,链表变为1->2->3->5. 备注&#xf…

2021牛客暑期多校训练营7 K-xay loves sequence(主席树+二分)

K-xay loves sequence 首先不考虑模kkk的限制&#xff0c;容易想到对原数组做一个差分得到diai−ai−1d_ia_i-a_{i-1}di​ai​−ai−1​&#xff0c;显然对于∀1≤i≤nai0\forall_{1\leq i\leq n} a_i0∀1≤i≤n​ai​0 等价于∀1≤i≤ndi0\forall_{1\leq i\leq n} d_i0∀1≤i…

ASP.NET Core 搭配 Nginx 的真实IP问题

一.前言Nginx&#xff08;Engine X&#xff09;是一个高性能HTTP和反向代理服务&#xff0c;是由俄罗斯人伊戈尔赛索耶夫为访问量第二的Rambler.ru站点&#xff08;俄文&#xff1a;Рамблер&#xff09;开发的&#xff0c;第一个公开版本0.1.0发布于2004年10月4日。 如果…

不止代码:保留道路(ybtoj 最小生成树)

文章目录题目描述解析代码thanks for reading!题目描述 解析 其实就是修建道路 我一开始只能想到枚举g去跑最小生成树 是m^2的算法&#xff08;50pts&#xff09; 但是其实每次加入的边只有一条 而且之前都不在最小生成树上的边以后也肯定不会在 所以可以建一个新的边的集合存…

P7515-[省选联考 2021A卷]矩阵游戏【差分约束】

正题 题目链接:https://www.luogu.com.cn/problem/P7515 题目大意 有一个n∗mn*mn∗m的矩形AAA&#xff0c;然后给出一个(n−1)∗(m−1)(n-1)*(m-1)(n−1)∗(m−1)的矩形BBB满足 Bi,jAi,jAi1,jAi,j1Ai1,j1B_{i,j}A_{i,j}A_{i1,j}A_{i,j1}A_{i1,j1}Bi,j​Ai,j​Ai1,j​Ai,j1​…

牛客题霸 [链表中环的入口节点] C++题解/答案

牛客题霸 [链表中环的入口节点] C题解/答案 题目描述 对于一个给定的链表&#xff0c;返回环的入口节点&#xff0c;如果没有环&#xff0c;返回null 拓展&#xff1a; 你能给出不利用额外空间的解法么&#xff1f; 题解&#xff1a; 判断环有个很巧妙的方法&#xff0c;之…