Then n - 1n−1 lines follow. ii-th line contains two integers f_{a_i}(1 \le f_{a_i} < i)fai​​(1≤fai​​<i), w_i(0 \le w_i \le 10^{18})wi​(0≤wi​≤1018) —The parent of the ii-th node and the edge weight between the ii-th node and f_{a_i} (ifai​​(istart from 2)2).

Output

Print a single integer — the answer of this problem, modulo 10000000071000000007.

样例输入1复制

2
12

样例输出1复制

0

样例输入2复制

5
1 0
2 0
3 0
4 0

样例输出2复制

35

题意:给你一颗n个节点的有根树,让你求那个公式的值。

题解:首先来看如何判定两个节点的路径权值异或起来为0,我们借助异或的一个这样的性质 x^x=0那么我们不妨维护出根节点到所有节点的异或值,如果两个节点x,y,根节点到x的异或值和根节点到y的异或值相等,那么x异或到y的值就一定为0.

接下来我们考虑一对符合条件的节点x,y对答案的贡献。

例如这个树中的2和4节点,我们容易知道,2和4对答案的贡献数量就是4下面那一块(就4这一个节点,)和2右边那一块(2,1,3,5)这四个节点。那么怎么计算具体的数量呢。

我们把总的贡献数量分为2类来分开求解。1、计算两个节点在同一条链上。例如上面说到的2,4就是在同一条链上(这里讲的同一条链上是其中一个节点在和根节点的路径上含有另一个节点。)那么我们就可以在dfs过程中,在dfs一个节点的子节点之前,把当前节点的贡献加到map里,加的数量用一个变量tmp来维护。它记录的是该整颗树的节点减去当前节点的子树节点数。那么数量也就是它的子树中的节点如果和它是有效的节点对,该节点外面可以贡献的节点数量。当dfs子节点结束后,就返回到之前的数值,对另外一个节点进行dfs,这样可以保证每一次的tmp是针对一个链的。

2、计算不在同一条链上的节点。同样是dfs,不过这次我们是先dfs,然后更新信息,这样就是一种从下往上更新贡献信息的操作,因为更新答案是进入dfs就更新的,进入当前节点更新ans的时候,他的子节点还没有加到贡献里,所以就不会重复计算在同一条立链上的节点,只会计算在不同链上的节点。

本博客参考这个巨巨的博客:https://blog.csdn.net/qq_38515845/article/details/90582561如果有描述不清楚的地方,可以上这个博客学习。

细节见代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define rt return
#define dll(x) scanf("%I64d",&x)
#define xll(x) printf("%I64d\n",x)
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define db(x) cout<<"== [ "<<x<<" ] =="<<endl;
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;}
ll lcm(ll a, ll b) {return a / gcd(a, b) * b;}
ll powmod(ll a, ll b, ll MOD) {ll ans = 1; while (b) {if (b % 2)ans = ans * a % MOD; a = a * a % MOD; b /= 2;} return ans;}
inline void getInt(int* p);
const int maxn = 100010;
const int inf = 0x3f3f3f3f;
/*** TEMPLATE CODE * * STARTS HERE ***/
int n;
struct node
{int next;ll x;
};
ll ans = 0ll;
std::vector<node> son[maxn];
const ll mod = 1e9 + 7;
ll num[maxn];
void dfs_num(int x)
{// num[x] 代表x的子树的节点个数。//
    num[x]++;for (auto y : son[x]){dfs_num(y.next);num[x] += num[y.next];}
}
map<ll, int> m;
ll tmp = 0ll;
void dfs1(int id, ll s)
{// 同一条链ans = (ans + 1ll * num[id] * m[s]) % mod;for (auto y : son[id]){tmp = (tmp + 1ll * num[id] - num[y.next]) % mod;m[s] = (m[s] + tmp) % mod;dfs1(y.next, s ^ y.x);m[s] -= tmp;m[s] = (m[s] + mod) % mod;tmp -= 1ll * num[id] - num[y.next];tmp = (tmp + mod) % mod;}
}
void dfs2(int id, ll s)
{// 不同链ans = (ans + 1ll * num[id] * m[s]) % mod;for (auto y : son[id]){dfs2(y.next, s ^ y.x);}m[s] = (m[s] + num[id]) % mod;
}
int main()
{// freopen("D:\\common_text\\code_stream\\in.txt","r",stdin);//freopen("D:\\common_text\\code_stream\\out.txt","w",stdout);
    gbtb;cin >> n;int id; ll x; node temp;repd(i, 2, n){cin >> id;cin >> x;temp.x = x;temp.next = i;son[id].push_back(temp);}dfs_num(1);// db(ans);dfs1(1, 0ll);m.clear();dfs2(1, 0ll);cout << (ans + mod) % mod;return 0;
}inline void getInt(int* p) {char ch;do {ch = getchar();} while (ch == ' ' || ch == '\n');if (ch == '-') {*p = -(getchar() - '0');while ((ch = getchar()) >= '0' && ch <= '9') {*p = *p * 10 - ch + '0';}}else {*p = ch - '0';while ((ch = getchar()) >= '0' && ch <= '9') {*p = *p * 10 + ch - '0';}}
}

 

转载于:https://www.cnblogs.com/qieqiemin/p/10945604.html

2019 ACM/ICPC 全国邀请赛(西安)J And And And (树DP+贡献计算)相关推荐

  1. 2019 ACM - ICPC 全国邀请赛(南昌) 题解(9 / 12)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 The 2019 ICPC China Nanchang National Invitation ...

  2. 2019 ACM - ICPC 全国邀请赛(西安)题解(9 / 13)

    The 2019 ACM-ICPC China Shannxi Provincial Programming Contest 目录 The 2019 ACM-ICPC China Shannxi Pr ...

  3. 2019 ACM - ICPC 西安邀请赛 B. Product (杜教筛) 简单数论(bushi)

    G.(2019 ACM/ICPC 全国邀请赛(西安)B) Product Weblink https://nanti.jisuanke.com/t/39269 Problem && S ...

  4. 2019 ICPC全国邀请赛(西安)I. Cracking Password(序列检验,BSGS,细节题)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 2019 ICPC全国邀请赛(西安)I. Cracking Password Weblink http ...

  5. 2019 ACM - ICPC 上海网络赛 E. Counting Sequences II (指数型生成函数)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  6. 2023年ICPC全国邀请赛(陕西)-Volunteer角度

    2023年ICPC全国邀请赛(陕西)今日开赛.笔者作为只会调试百行出头的js小游戏的弱鸡学生,只能通过担任志愿者来为赛事贡献一份力量了. (图为开幕式现场) 现场的气氛是很好的,热闹是一定的.作为服务 ...

  7. 2021 ICPC全国邀请赛(西安)太原理工大学收获3枚奖牌

    2021 ICPC 国际大学生程序设计竞赛全国邀请赛,于2021年6月5-6日在西安西北工业大学举行. 这次比赛,太原理工大学共派出3个队伍参加比赛,获得2枚银牌1枚铜牌. 通过这个比赛,锻炼了队伍, ...

  8. 2019 ACM/ICPC 南京站 E.Observation,区间筛

    题目大意 求 (∑d=LR(fdxor K))(modP)\Big(\sum\limits_{d=L}^{R} (f_d\text{ xor } K)\Big)\pmod{P}(d=L∑R​(fd​  ...

  9. 哈理工大学ACM程序设计全国邀请赛D D Pairs(FFT)

    题意:给你一个长度为N(N<=100000)的数列,Q(Q<=200000)次询问,每次给出一个K,问数列中有多少个二元组它们的和小于K 思路:显然不会做嘛,一个比较直接的想法是怎么把所有 ...

最新文章

  1. 谈python函数的参数处理
  2. 记一次性能优化,限制tcp_timewait数量,快速回收和重用
  3. Psych101(part1)--Day1
  4. C#反射之Assembly.Load,Assembly.LoadFile 与 Assembly.LoadFrom方法介绍
  5. C#窗体应用程序崩溃解决方法总结
  6. E. Number Challenge
  7. 【转】使用多个 Azure 订阅(按照订阅收费)
  8. java 双等号(==) 与equals方法的介绍和区别
  9. Java工程师的进阶之路-Kafka篇(一)
  10. UnityParticle2:5x基础模块
  11. 春Phone计划 51cto沙龙郑州站活动
  12. 启动优化之Android-Startup
  13. 用js写出水仙花数_JavaScript求取水仙花数
  14. Perl 6 - CPAN
  15. 不懂驾驭人性,你还谈什么管理?
  16. 红帽OpenStack私有云部署
  17. android百度地图拖拽地图定位,百度地图,拖动地图,定位marker固定在屏幕中心位置...
  18. 漏刻有时API接口实战开发系列(2):萤石工作室Ezviz Studio设置摄像头的相关参数
  19. 【Active Learning - 00】主动学习重要资源总结、分享(提供源码的论文、一些AL相关的研究者)
  20. Spring的IOC创建对象的方式和代码基本解释为什么要有ioc的思维以及Ioc容器和spring依赖注入的解释

热门文章

  1. Python 中的黑暗角落(三):模块与包
  2. Flash开发iOS应用全攻略(四)——如何为iTunes Connect准备应用
  3. python爬虫怎么挣钱_python爬虫12 | 爸爸,他使坏,用动态的 Json 数据,我要怎么搞?...
  4. pion webrtc 示例代码解析 一
  5. 一台CentOS云主机更改源的记录
  6. 嵌入式Linux入门11:应用层编程应用和分类
  7. 完成一个分析H264码流的工具
  8. 【Elastischearch】Elastischearch 的 ID 生成器 UUIDGenerator
  9. 【clickhouse】clickhouse表引擎之ReplacingMergeTree
  10. 【Kafka】kafka 重平衡(Rebalance)