题意:有一棵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,数论)的更多相关文章

  1. 【2019.8.20 NOIP模拟赛 T2】小B的树(tree)(树形DP)

    树形\(DP\) 考虑设\(f_{i,j,k}\)表示在\(i\)的子树内,从\(i\)向下的最长链长度为\(j\),\(i\)子树内直径长度为\(k\)的概率. 然后我们就能发现这个东西直接转移是几 ...

  2. 【2019.7.15 NOIP模拟赛 T2】与非树(nand)(树形DP)

    树形\(DP\) 实际上,这道题应该不是很难. 我们设\(f_{x,i,j}\)表示在以\(x\)为根的子树内,原本应输出\(i\),结果输出了\(j\)的情况数. 转移时,为了方便,我们先考虑与,再 ...

  3. 【NOIP2016提高A组集训第14场11.12】随机游走——期望+树形DP

    好久没有写过题解了--现在感觉以前的题解弱爆了,还有这么多访问量-- 没有考虑别人的感受,没有放描述.代码,题解也写得歪歪扭扭. 并且我要强烈谴责某些写题解的代码不打注释的人,像天书那样,不是写给普通 ...

  4. HDU-4679 Terrorist’s destroy 树形DP,维护

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4679 题意:给一颗树,每个边有一个权值,要你去掉一条边权值w剩下的两颗子树中分别的最长链a,b,使得w ...

  5. 【DP_树形DP专题】题单总结

    转载自 http://blog.csdn.net/woshi250hua/article/details/7644959#t2 题单:http://vjudge.net/contest/123963# ...

  6. 动态规划——树形dp

    动态规划作为一种求解最优方案的思想,和递归.二分.贪心等基础的思想一样,其实都融入到了很多数论.图论.数据结构等具体的算法当中,那么这篇文章,我们就讨论将图论中的树结构和动态规划的结合——树形dp. ...

  7. 两种解法-树形dp+二分+单调队列(或RMQ)-hdu-4123-Bob’s Race

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4123 题目大意: 给一棵树,n个节点,每条边有个权值,从每个点i出发有个不经过自己走过的点的最远距离 ...

  8. hdu1520 (树形dp)

    hdu1520 http://acm.hdu.edu.cn/showproblem.php?pid=1520 题意是给定一棵树,每个结点有一个价值,要我们选择任意个结点使得总价值最大,规则是如果父亲结 ...

  9. [WC2018]通道——边分治+虚树+树形DP

    题目链接: [WC2018]通道 题目大意:给出三棵n个节点结构不同的树,边有边权,要求找出一个点对(a,b)使三棵树上这两点的路径权值和最大,一条路径权值为路径上所有边的边权和. 我们按照部分分逐个 ...

  10. HDU 5977 Garden of Eden (树形dp+快速沃尔什变换FWT)

    CGZ大佬提醒我,我要是再不更博客可就连一月一更的频率也没有了... emmm,正好做了一道有点意思的题,就拿出来充数吧=.= 题意 一棵树,有 $ n (n\leq50000) $ 个节点,每个点都 ...

随机推荐

  1. Url Rewrite 重写

    前几天看到园子里一篇关于 Url 重写的文章<获取ISAPI_Rewrite重写后的URL>, URL-Rewrite 这项技术早已不是一项新技术了,这个话题也已经被很多人讨论过多次.搜索 ...

  2. 不安装oracle客户端如何使用plsql连接数据库

    不安装oracle客户端如何使用plsql连接数据库 1. 准备工作 1.1下载plsqldev破解版软件 我这里使用plsqldev715版本 1.2下载instantclient-basic-wi ...

  3. 解决 cocos2dx iOS/mac 设置纹理寻址模式后纹理变黑的问题

    sprite:getTexture():setTexParameters(gl.LINEAR,gl.LINEAR,gl.REPEAT,gl.REPEAT) 在安卓设备上,设置了纹理自定义寻址模式,纹理 ...

  4. js中实现杨辉三角

    实现效果:杨辉三角 即: 提示用户输入要实现的杨辉三角行数: 请输入杨辉三角的行数: 8 代码实现后的效果如下: 1 1.1 1.2.1 1.3.3.1 1.4.6.4.1 1.5.10.10.5.1 ...

  5. JQ之$.ajax()方法以及ajax跨域请求

    AJAX(Asynchronous javascript AND xml :异步javascript和xml):是一种创建交互式网页应用的网页开发技术.AJAX可以在不重新加载整个页面的情况下与服务器 ...

  6. 02Qt信号与槽(1)

    信号与槽 1.概述 ​ 信号和槽机制是 Qt 的核心机制,信号和槽是一种高级接口,应用于对象之间的通信,它是 Qt 的核心特性,也是 Qt 区别于其他工具包的重要地方.信号和槽是 Qt 自行定义的一种 ...

  7. 分享几个能用的 editplus 注册码

    转载自: https://www.cnblogs.com/shihaiming/p/6422441.html 原文:http://host.zzidc.com/wljc/1286.html EditP ...

  8. laravel5 使用try catch

    在laravel5中使用以下代码并没有捕获异常 try{ var_dump($val); }catch (Exception $e){ var_dump($e); }  Laravel 5 时代控制器 ...

  9. php加密解密函数大全

    第一种: <?php function encryptDecrypt($key, $string, $decrypt){ if($decrypt){ $decrypted = rtrim(mcr ...

  10. golang 函数的特殊用法

    1.可以复用一些写法.经常在单元测试过程中需要new一些对象可以new的操作抽离出来 package main import "fmt" type S struct { } fun ...