题意:有一棵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. javaweb基础(17)_jsp九个内置对象

    一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...

  2. ios下通过webservice获取数据

    经历了两天的摸索,终于成功获取了数据,因为公司要做一个停车入库的信息查询,所以需要访问webservice的接口,由于没有接触过webservice,所以第一天就是各种搜索资料,类库,各种尝试,甚至是 ...

  3. jq 下拉框

    <div class="alls"> <div class="item"> <div class="all"& ...

  4. c++ 用指针操作数组

    #include <iostream> using namespace std; const int Max = 5; double * fill_array(double * first ...

  5. CSS3边框图片-像素虚边的问题

    虽然CSS3新增了这个功能,但是在W3school里面并没有给出具体详细的解释,还好网上不乏大神给你我们很全面的解释其中的原理-css3:border-image边框图像详解 边框图片的原理是四个角不 ...

  6. logging记录了其他操作的问题

    做atm作业的时候,记录转账操作的那个功能的文件里,同时也记录了增加账号和冻结账号的操作 2018-11-28 17:14:51,754 : transfer : INFO : 用户edward向用户 ...

  7. 在Unix系统上,从源文件、目标文件、可执行文件的编译过程

    是由“编译器驱动”(compiler driver)完成的: unix> gcc -o hello hello.c 在这里,gcc的编译器驱动程序读取源文件hello.c, #include & ...

  8. LeetCode(154) Find Minimum in Rotated Sorted Array II

    题目 Follow up for "Find Minimum in Rotated Sorted Array": What if duplicates are allowed? W ...

  9. OpenStack, kvm, qemu-kvm以及libvirt之关系

    OpenStack, kvm, qemu-kvm以及libvirt之关系: KVM是最底层的hypervisor,它是用来模拟CPU的运行,它缺少了对network和周边I/O的支持,所以我们是没法直 ...

  10. 解决VMware vSphere Client无法连接ESXi虚拟主机方法

    1 一般情况下重启services.sh就可以解决(或图形界面下restart management agent)services.sh restart2 若重启services.sh报错且仍然无法连 ...