校内训练0609 problem c
【题目大意】
给一棵树,求有多少条路径满足总和-最大值 是P的倍数
n<=10^5, P<=10^7
【题解】
一看就是点分治嘛
不考虑子树合并,考虑poj1741的做法,每次考虑经过重心的路径,用优先队列,从小到达添加并求答案即可。
容斥下。
# include <queue>
# include <stdio.h>
# include <string.h>
# include <iostream>
# include <algorithm>
// # include <bits/stdc++.h> using namespace std; typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
const int N = 1e5 + , M = 2e5 + , MAX = 1e7 + ;
const int mod = 1e9+; # define RG register
# define ST static int n, P, v[N];
int head[N], nxt[M], to[M], tot;
inline void add(int u, int v) {
++tot; nxt[tot] = head[u]; head[u] = tot; to[tot] = v;
}
inline void adde(int u, int v) {
add(u, v), add(v, u);
} namespace DFZ {
bool vis[N];
int sz[N], mx[N];
inline void dfsSize(int x, int fa = ) {
sz[x] = , mx[x] = ;
for (int i=head[x]; i; i=nxt[i]) {
if(to[i] == fa || vis[to[i]]) continue;
dfsSize(to[i], x);
sz[x] += sz[to[i]];
if(sz[to[i]] > mx[x]) mx[x] = sz[to[i]];
}
}
int mi, centre;
inline void dfsCentre(int x, int tp, int fa = ) {
if(sz[tp] - sz[x] > mx[x]) mx[x] = sz[tp] - sz[x];
if(mx[x] < mi) mi = mx[x], centre = x;
for (int i=head[x]; i; i=nxt[i]) {
if(to[i] == fa || vis[to[i]]) continue;
dfsCentre(to[i], tp, x);
}
} struct pa {
int x, s, mx, fa;
pa() {}
pa(int x, int s, int mx, int fa) : x(x), s(s), mx(mx), fa(fa) {}
friend bool operator < (pa a, pa b) {
return a.mx > b.mx;
}
}; priority_queue<pa> q;
int buc[MAX];
int st[M], stn; inline void delAns(int x, int s, int fa) {
-- buc[s];
for (int i=head[x]; i; i=nxt[i]) {
if(to[i] == fa || vis[to[i]]) continue;
delAns(to[i], (s + v[to[i]]) % P, x);
}
} inline ll doit(int x, int temp_s, int temp_mx, int temp_fa, int Vx) {
ll ret = ; (temp_s += v[x]) %= P; temp_mx = max(temp_mx, v[x]);
while(!q.empty()) q.pop(); stn = ;
q.push(pa(x, temp_s, temp_mx, temp_fa));
while(!q.empty()) {
pa tp = q.top(); q.pop();
// tp.s + S - Vx - mx = 0 (mod P)
// S = Vx + mx - tp.s
ret += buc[((tp.mx + Vx - tp.s) % P + P) % P];
++ buc[tp.s];
st[++stn] = tp.s;
for (int i=head[tp.x]; i; i=nxt[i]) {
if(to[i] == tp.fa || vis[to[i]]) continue;
q.push(pa(to[i], (tp.s + v[to[i]]) % P, max(tp.mx, v[to[i]]), tp.x));
}
}
for (int i=stn; i; --i) -- buc[st[i]];
return ret;
} ll ans;
inline void dfs(int x) {
dfsSize(x); mi = n;
dfsCentre(x, x);
x = centre;
// ===== //
// printf("x = %d\n", x);
ans += doit(x, , , , v[x]);
// ===== //
vis[x] = ;
for (int i=head[x]; i; i=nxt[i])
if(!vis[to[i]]) {
ans -= doit(to[i], v[x], v[x], x, v[x]);
dfs(to[i]);
}
} inline void main() {
ans = ;
dfs();
ans += n;
cout << ans << endl;
}
} int main() {
freopen("c.in", "r", stdin);
freopen("c.out", "w", stdout);
cin >> n >> P;
for (int i=, u, tv; i<n; ++i) {
scanf("%d%d", &u, &tv);
adde(u, tv);
}
for (int i=; i<=n; ++i) scanf("%d", v+i);
DFZ::main();
return ;
}
/*
5 2
1 2
1 3
2 4
3 5
1 3 3 1 2
*/
校内训练0609 problem c的更多相关文章
- 「校内训练 2019-04-23」越野赛车问题 动态dp+树的直径
题目传送门 http://192.168.21.187/problem/1236 http://47.100.137.146/problem/1236 题解 题目中要求的显然是那个状态下的直径嘛. 所 ...
- [4.14校内训练赛by hzwer]
来自FallDream的博客,未经允许,请勿转载,谢谢. hzwer又出丧题虐人 4道noi.... 很奇怪 每次黄学长出题总有一题我做过了. 嗯题目你们自己看看呗 好难解释 ----- ...
- [2017.4.7校内训练赛by hzwer]
来自FallDream的博客,未经允许,请勿转载,谢谢. 报警啦.......hzwer又出丧题虐人啦..... 4道ctsc...有一道前几天做过了,一道傻逼哈希还wa了十几次,勉强过了3题..我好 ...
- [3.24校内训练赛by hzwer]
来自FallDream的博客,未经允许,请勿转载,谢谢. ----------------------------------------------------------------------- ...
- 19_04_19校内训练[Game]
题意 给出n,等概率地生成一个1~n的数列.现在有n个人从左到右站成一排,每个人拿有当前数列位置上的数字,并且一开始都不知道数字是多少(但知道n是多少).从左到右让每个人进行如下选择: 1.选择保留自 ...
- 19_04_02校内训练[deadline]
题意 给出一个二分图,左边为A集合,右边为B集合,要求把A集合中每一个点染为黑白两色中的一种,B集合中的颜色已定.染色后对于原本相邻且颜色相同的点,建立新的二分图,即得到了两个新的二分图,它们是独立的 ...
- 平面图转对偶图&19_03_21校内训练 [Everfeel]
对于每个平面图,都有唯一一个对偶图与之对应.若G‘是平面图G的对偶图,则满足: G'中每一条边的两个节点对应着G中有公共边的面,包括最外部无限大的面. 直观地讲,红色标出来的图就是蓝色标出的图的对偶图 ...
- fzyzojP3979 -- [校内训练20180914]魔法方阵
原题见CF632F https://blog.csdn.net/Steaunk/article/details/80217764 这个比较神仙了 点边转化, 把max硬生生转化成了路径最大值,再考虑所 ...
- 日常训练赛 Problem C – Complete Naebbirac’s sequence
比赛链接https://vjudge.net/contest/256988#status/17111202012/C/0/ 大意:三个操作,使得输入的数中,从1-n,每一个数出现的次数相同. wa代码 ...
随机推荐
- How to Upload multiple files to documentLibrary in one time
In a Sharepoint 2013 website,we can upload one file to the documentlibrary by click "Uploa ...
- 【紫书】(UVa12096) The SetStack Computer
突然转进到第五章的low题目的原因是做到图论了(紫书),然后惊喜的发现第一题就做不出来.那么里面用到了这一题的思想,我们就先解决这题.当然,dp必须继续做下去,这是基本功.断不得. 题意分析 这条题真 ...
- Spark集群管理器介绍
Spark可以运行在各种集群管理器上,并通过集群管理器访问集群中的其他机器.Spark主要有三种集群管理器,如果只是想让spark运行起来,可以采用spark自带的独立集群管理器,采用独立部署的模式: ...
- CentOS环境配置Hadoop(一)
配置Linux开发环境(hadoop-2.6.4) 一.准备工具 VMware-workstation-10.0.1注册机 CentOS-6.5-x86_64-bin-DVD1 jdk-7u79-li ...
- 剑指offer-旋转数组的最小数字06
题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋 ...
- 第一课:SVN代码管理
SVN:是一个跨平台的开源的版本控制系统.svn版本管理工具管理着随时间改变的各种数据.这些数据放置在一个中央资料档案库中.svn会备份并记录每个文件每次的修改更新变动.svn的工作流程:1.在中央库 ...
- import方法引入模块详解
在python用import或者from...import或者from...import...as...来导入相应的模块,作用和使用方法与C语言的include头文件类似.其实就是引入某些成熟的函数库 ...
- Hadoop执行bin/stop-all.sh时no namenode to stop异常
1 先关闭hadoop所有服务 命令: bin/stop-all.sh 2 格式化namenode 命令: bin/hadoop namenode -format 3 重新启动所有服务 命令: bin ...
- 【bzoj1263】[SCOI2006]整数划分 高精度
题目描述 从文件中读入一个正整数n(10≤n≤31000).要求将n写成若干个正整数之和,并且使这些正整数的乘积最大. 例如,n=13,则当n表示为4+3+3+3(或2+2+3+3+3)时,乘积=10 ...
- 【bzoj2453】维护队列/【bzoj2120】数颜色 分块+二分
题目描述 你小时候玩过弹珠吗? 小朋友A有一些弹珠,A喜欢把它们排成队列,从左到右编号为1到N.为了整个队列鲜艳美观,小朋友想知道某一段连续弹珠中,不同颜色的弹珠有多少.当然,A有时候会依据个人喜好, ...