【NOIP2016练习】T2 forest (树形DP,数论)
题意:有一棵N个点的树,每个点上有点权
定义路径长度为所经过的所有点的点权之和,树的直径为一棵树中最大的路径长度
有N次询问,每次询问要求回答所有树的直径之积
每次询问后会删一条边,树的数量会+1
要求回答N次询问,答案 mod 10^9+7
n<=100000
思路:因为知道每次删哪条边所以可以离线倒着做,每次加一条边
加边会使两棵树合并,考虑树的合并
已知原树的形状,可知点之间的父子关系
考虑DP,设dp[u,1],dp[u,2]为以U为根,子树中路径的最长与次长值,同时记录从哪个儿子取到
f[u]为以U为根的子树中的路径最大长度
注意最长与次长必须由两个不同的儿子转移来,更新时注意
对于ans[i]要合并X与Y,在原树中它们必定是父子关系
设X为Y的父亲
新的ANS就是旧的ans/旧的f[y]*新的f[合并后子树的根,即X的最上层根节点]
向上递归即可
出现除法取模,使用费马小定理求逆元
a^(p-2)=a^-1 (mod p)
题解方法是暴力+倍增优化,直径由U1,V1,U2,V2四个点对取最大值
然而我懒得写了
const mo=;
var g:array[..,..]of int64;
h:array[..,..]of longint;
fa,cx,cy,b,ff:array[..]of longint;
f,a,ans:array[..]of int64;
head,vet,next:array[..]of longint;
n,i,x,y,tot:longint;
t:int64; procedure add(a,b:longint);
begin
inc(tot);
next[tot]:=head[a];
vet[tot]:=b;
head[a]:=tot;
end; function max(x,y:int64):int64;
begin
if x>y then exit(x);
exit(y);
end; procedure swap(var x,y:longint);
var t:longint;
begin
t:=x; x:=y; y:=t;
end; procedure dfs(u,pre:longint);
var e,v:longint;
begin
e:=head[u];
while e<> do
begin
v:=vet[e];
if v<>pre then
begin
ff[v]:=u;
dfs(v,u);
end;
e:=next[e];
end;
end; function mi(x,y:int64):int64;
var tmp:int64;
begin
mi:=; tmp:=x;
while y> do
begin
if y and = then mi:=mi*tmp mod mo;
tmp:=tmp*tmp mod mo;
y:=y>>;
end;
end; function exf(x:int64):int64;
begin
exit(mi(x,mo-));
end; begin
assign(input,'forest.in'); reset(input);
assign(output,'forest.out'); rewrite(output);
readln(n);
for i:= to n do
begin
read(a[i]);
f[i]:=a[i];
end;
for i:= to n- do
begin
read(cx[i],cy[i]);
add(cx[i],cy[i]);
add(cy[i],cx[i]);
end;
for i:= to n- do read(b[i]);
dfs(,-);
t:=;
for i:= to n do t:=t*a[i] mod mo;
ans[n]:=t;
for i:=n- downto do
begin
x:=cx[b[i]]; y:=cy[b[i]];
if ff[y]<>x then swap(x,y);
t:=t*exf(f[y]) mod mo;
fa[y]:=x;
while x> do
begin
if fa[x]= then t:=t*exf(f[x]) mod mo;
f[x]:=max(f[x],f[y]);
if g[y,]+a[y]>g[x,] then
begin
if h[x,]<>y then
begin
g[x,]:=g[x,]; h[x,]:=h[x,];
end;
g[x,]:=g[y,]+a[y];
h[x,]:=y;
end
else if (g[y,]+a[y]>g[x,])and(y<>h[x,]) then
begin
g[x,]:=g[y,]+a[y];
h[x,]:=y;
end;
f[x]:=max(f[x],g[x,]+g[x,]+a[x]);
y:=x; x:=fa[x];
end;
t:=t*f[y] mod mo;
ans[i]:=t;
end;
for i:= to n do writeln(ans[i]); close(input);
close(output);
end.
【NOIP2016练习】T2 forest (树形DP,数论)的更多相关文章
- 【2019.8.20 NOIP模拟赛 T2】小B的树(tree)(树形DP)
树形\(DP\) 考虑设\(f_{i,j,k}\)表示在\(i\)的子树内,从\(i\)向下的最长链长度为\(j\),\(i\)子树内直径长度为\(k\)的概率. 然后我们就能发现这个东西直接转移是几 ...
- 【2019.7.15 NOIP模拟赛 T2】与非树(nand)(树形DP)
树形\(DP\) 实际上,这道题应该不是很难. 我们设\(f_{x,i,j}\)表示在以\(x\)为根的子树内,原本应输出\(i\),结果输出了\(j\)的情况数. 转移时,为了方便,我们先考虑与,再 ...
- 【NOIP2016提高A组集训第14场11.12】随机游走——期望+树形DP
好久没有写过题解了--现在感觉以前的题解弱爆了,还有这么多访问量-- 没有考虑别人的感受,没有放描述.代码,题解也写得歪歪扭扭. 并且我要强烈谴责某些写题解的代码不打注释的人,像天书那样,不是写给普通 ...
- HDU-4679 Terrorist’s destroy 树形DP,维护
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4679 题意:给一颗树,每个边有一个权值,要你去掉一条边权值w剩下的两颗子树中分别的最长链a,b,使得w ...
- 【DP_树形DP专题】题单总结
转载自 http://blog.csdn.net/woshi250hua/article/details/7644959#t2 题单:http://vjudge.net/contest/123963# ...
- 动态规划——树形dp
动态规划作为一种求解最优方案的思想,和递归.二分.贪心等基础的思想一样,其实都融入到了很多数论.图论.数据结构等具体的算法当中,那么这篇文章,我们就讨论将图论中的树结构和动态规划的结合——树形dp. ...
- 两种解法-树形dp+二分+单调队列(或RMQ)-hdu-4123-Bob’s Race
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4123 题目大意: 给一棵树,n个节点,每条边有个权值,从每个点i出发有个不经过自己走过的点的最远距离 ...
- hdu1520 (树形dp)
hdu1520 http://acm.hdu.edu.cn/showproblem.php?pid=1520 题意是给定一棵树,每个结点有一个价值,要我们选择任意个结点使得总价值最大,规则是如果父亲结 ...
- [WC2018]通道——边分治+虚树+树形DP
题目链接: [WC2018]通道 题目大意:给出三棵n个节点结构不同的树,边有边权,要求找出一个点对(a,b)使三棵树上这两点的路径权值和最大,一条路径权值为路径上所有边的边权和. 我们按照部分分逐个 ...
- HDU 5977 Garden of Eden (树形dp+快速沃尔什变换FWT)
CGZ大佬提醒我,我要是再不更博客可就连一月一更的频率也没有了... emmm,正好做了一道有点意思的题,就拿出来充数吧=.= 题意 一棵树,有 $ n (n\leq50000) $ 个节点,每个点都 ...
随机推荐
- shell脚本,awk取奇数行与偶数行方法。
第一种方法: 第二种方法: 第三种方法:
- IOS版本判断
-(void)getIOSVersion { //#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 50000 //此方法和编译器相关 //quanju.iOS ...
- pandas处理较大数据量级的方法 - chunk,hdf,pkl
前情提要: 工作原因需要处理一批约30G左右的CSV数据,数据量级不需要hadoop的使用,同时由于办公的本本内存较低的缘故,需要解读取数据时内存不足的原因. 操作流程: 方法与方式:首先是读取数据, ...
- Mysql数据库查询语法详解
数据库的完整查询语法 在平常的工作中经常需要与数据库打交道 , 虽然大多时间都是简单的查询抑或使用框架封装好的ORM的查询方法 , 但是还是要对数据库的完整查询语法做一个加深理解 数据库完整查询语法框 ...
- leetcode-11-dfs
DFS算法: explore(G, v) visited(v) = trueprevisit(v) for each edge(v, u) in E: if not visited(u): explo ...
- 流式处理框架storm浅析(上篇)
本文来自网易云社区 作者:汪建伟 前言 前一段时间参与哨兵流式监控功能设计,调研了两个可以做流式计算的框架:storm和spark streaming,我负责storm的调研工作.断断续续花了一周的时 ...
- 小甲鱼零基础入门PYTHON
000.愉快的开始 00:17:37 ☆ 001.我和Python的第一次亲密接触 00:13:26 ★ 002.用Python设计第一个游戏 00:24:00 ★ 003.小插曲之变量和字符 ...
- 12章 应用spary制作高级网页组件
比较复杂的用户界面,tab面板 伸缩面板和折叠面板等组件. tab面板和菜单实际上分为两种 一种是切换各个tab页中的内容时并不刷新浏览器窗口,仅仅是被隐藏起来了 利用ja ...
- Matplotlib中文乱码解决办法
Matplotlib中文乱码 解决方法如下: 首先设置源码文件编码方式为UTF-8 #-*- coding: utf-8 -*- 接着设置字体属性字典 font = {'family': 'SimHe ...
- 51nod1832 先序遍历与后序遍历
对于给定的一个二叉树的先序遍历和后序遍历,输出有多少种满足条件的二叉树.两棵二叉树不同当且仅当对于某个x,x的左儿子编号不同或x的右儿子编号不同. Input 第一行一个正整数n(3<=n< ...