JZOJ.5286【NOIP2017模拟8.16】花花的森林
Description
Input
Output
Sample Input
3
1 2 3
1 2
1 3
2
1
Sample Output
6
9
6
Data Constraint
Hint
题目大意就是要求删边和计算直径。
很明显每次删边后两边BFS计算直径必会超时,但我们可以通过lca和预处理节点到根节点的距离来快速计算,但删边后lca很可能有所变化,重新预处理lca的信息又太慢了。
我们可以试着逆向。
即正着删边看成反着添边。
这样子我们可以发现是等效的。
一开始每棵树的直径就是该点的权值。
当我们连上一条边,把两棵子树合并的时候,我们可以证明,这棵新的子树的直径的两个端点一定是合并前那两个子树四个端点中的两个,所以我们只要将四个端点两两配对比较一下距离我们就可以得出新的子树的直径。这里是计算树的距离我们仍然采用LCA。但这里我们惊奇地发现当两个棵子树合并的时候,它们的LCA一定是存在的,并且也是原图中的LCA(而删边很可能导致某两个点没有了LCA),于是我们可以预处理整棵树的LCA出来。至于两棵子树的合并,我们可以一开始就预处理节点的深度和到根节点的距离,这样在合并的时候就方便将深度深的节点的fa指向深度浅的节点。
计算ans也就直接乘上新的子树的直径再除以之前的两棵子树的直径,mod的话取个逆就好了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<ctime>
#define N 200005
#define mo 1000000007
using namespace std;
int head[N],next[N*],to[N*],va[N],up[N][],deep[N],x[N],y[N],n,f[N],num,qwq[N],sx[N],sy[N],fa[N],ma;
long long ans,dis[N],an[N];
long long kuai(long long a,int b){
long long d=;
long long qwq=a;
while (b){
if (b&) d=d*qwq%mo;
qwq=qwq*qwq%mo;
b>>=;
}
return d;
}
void add(int u,int v){
num++;
next[num]=head[u];
to[num]=v;
head[u]=num;
num++;
next[num]=head[v];
to[num]=u;
head[v]=num;
}
void updata(int u){
dis[u]=dis[fa[u]]+va[u];
up[u][]=fa[u];
for (int i=;i<=;i++)
up[u][i]=up[up[u][i-]][i-];
for (int i=head[u];i;i=next[i]){
int v=to[i];
if (v!=fa[u])
deep[v]=deep[u]+,fa[v]=u,updata(v);
}
}
int lca(int u,int v){
if (deep[u]<deep[v]) swap(u,v);
for (int i=;i>=;i--)
if (deep[v]<=deep[up[u][i]])
u=up[u][i];
if (u==v) return u;
for (int i=;i>=;i--)
if (up[u][i]!=up[v][i])
u=up[u][i],v=up[v][i];
return up[u][];
}
int find(int x){
if (f[x]==x) return x;
f[x]=find(f[x]);
return f[x];
}
void work(int a,int b){
if (deep[a]>deep[b]) swap(a,b);
int f1=find(a),f2=find(b);
f[f2]=f1;
long long qaq=dis[sx[f1]],qvq=dis[sy[f1]],qoq=dis[sx[f2]],qsq=dis[sy[f2]];
int t1=sx[f1],t2=sy[f1],t3=sx[f2],t4=sy[f2];
int l1=lca(sx[f1],sx[f2]),l2=lca(sx[f1],sy[f2]),l3=lca(sy[f1],sx[f2]),l4=lca(sy[f1],sy[f2]),l5=lca(sx[f2],sy[f2]),l6=lca(sx[f1],sy[f1]);
long long tmp3=qaq+qvq-*dis[l6]+va[l6],tmp2=qsq+qoq-*dis[l5]+va[l5];
long long tmp1=tmp3;
if (qaq+qoq-*dis[l1]+va[l1]>tmp1) tmp1=qaq+qoq-*dis[l1]+va[l1],sx[f1]=t1,sy[f1]=t3;
if (qaq+qsq-*dis[l2]+va[l2]>tmp1) tmp1=qaq+qsq-*dis[l2]+va[l2],sx[f1]=t1,sy[f1]=t4;
if (qvq+qoq-*dis[l3]+va[l3]>tmp1) tmp1=qvq+qoq-*dis[l3]+va[l3],sx[f1]=t2,sy[f1]=t3;
if (qvq+qsq-*dis[l4]+va[l4]>tmp1) tmp1=qvq+qsq-*dis[l4]+va[l4],sx[f1]=t2,sy[f1]=t4;
if (qsq+qoq-*dis[l5]+va[l5]>tmp1) tmp1=qsq+qoq-*dis[l5]+va[l5],sx[f1]=t3,sy[f1]=t4;
ans=ans*((tmp1%mo)%mo*(kuai(tmp2,mo-)%mo)%mo*(kuai(tmp3,mo-)%mo)%mo)%mo;
an[ma]=ans;
ma--;
}
int main(){
scanf("%d",&n);
for (int i=;i<=n;i++){
scanf("%d",&va[i]);
f[i]=i;
sx[i]=i;
sy[i]=i;
}
for (int i=,u,v;i<n;i++){
scanf("%d%d",&u,&v);
x[i]=u;
y[i]=v;
add(u,v);
}
deep[]=;
dis[]=;
fa[]=;
deep[]=;
updata();
for (int i=;i<n;i++)
scanf("%d",&qwq[i]);
num=;
ans=;
for (int i=;i<=n;i++)
ans=(ans*(va[i]%mo))%mo;
ma=n;
an[ma]=ans;
ma--;
for (int i=n-;i>=;i--){
work(x[qwq[i]],y[qwq[i]]);
}
for (int i=;i<=n;i++)
printf("%lld\n",an[i]);
return ;
}
神奇的代码
JZOJ.5286【NOIP2017模拟8.16】花花的森林的更多相关文章
- JZOJ.5287【NOIP2017模拟8.16】最短路
Description
- JZOJ.5285【NOIP2017模拟8.16】排序
Description
- [jzoj 5343] [NOIP2017模拟9.3A组] 健美猫 解题报告 (差分)
题目链接: http://172.16.0.132/senior/#main/show/5343 题目: 题解: 记旋转i次之后的答案为$ans_i$,分别考虑每个元素对ans数组的贡献 若$s_i& ...
- [JZOJ 5908] [NOIP2018模拟10.16] 开荒(kaihuang)解题报告 (树状数组+思维)
题目链接: https://jzoj.net/senior/#contest/show/2529/1 题目: 题目背景:尊者神高达作为一个萌新,在升级路上死亡无数次后被一只大黄叽带回了师门.他加入师门 ...
- [JZOJ 5909] [NOIP2018模拟10.16] 跑商(paoshang) 解题报告 (圆方树)
题目链接: https://jzoj.net/senior/#contest/show/2529/2 题目: 题目背景:尊者神高达很穷,所以他需要跑商来赚钱题目描述:基三的地图可以看做 n 个城市,m ...
- JZOJ 5286. 【NOIP2017提高A组模拟8.16】花花的森林 (Standard IO)
5286. [NOIP2017提高A组模拟8.16]花花的森林 (Standard IO) Time Limits: 1000 ms Memory Limits: 131072 KB Descript ...
- JZOJ 5236. 【NOIP2017模拟8.7A组】利普希茨
5236. [NOIP2017模拟8.7A组]利普希茨 (File IO): input:lipschitz.in output:lipschitz.out Time Limits: 1000 ms ...
- JZOJ 【NOIP2017提高A组模拟9.14】捕老鼠
JZOJ [NOIP2017提高A组模拟9.14]捕老鼠 题目 Description 为了加快社会主义现代化,建设新农村,农夫约(Farmer Jo)决定给农庄里的仓库灭灭鼠.于是,猫被农夫约派去捕 ...
- JZOJ 5246. 【NOIP2017模拟8.8A组】Trip(trip)
5246. [NOIP2017模拟8.8A组]Trip(trip) (File IO): input:trip.in output:trip.out Time Limits: 1500 ms Memo ...
随机推荐
- 哪种代理适合用于Web数据采集
在Web数据采集中为了避免被服务器封锁而通过代理下载的情况很常见.但是,并非所有的代理都适合于Web数据采集.下面是鲲鹏数据的技术人员给出的说明. 根据HTTP代理的匿名性可以将其分为以下几种: ...
- jquery删除一个元素,但保留里面的元素
删除元素/内容 如需删除元素和内容,一般可使用以下两个 jQuery 方法: remove() - 删除被选元素(及其子元素) empty() - 从被选元素中删除子元素 但是如果我想删除这个元素,但 ...
- 重写spring cloud config 本地bootstrap
在spring-cloud中使用了config-server之后,需要在client端加入bootstrap作为配置文件,其中通常包含如下: spring.application.name=ms-as ...
- 多线程-Fork/Join
Fork/Join Java7提供了Fork/Join来支持将一个任务拆分成多个“小任务”并行计算,再把多个“小任务”的结果合并成总的计算结果. 类图 Java7提供了ForkJoinPool来支持将 ...
- Atitti. 语法树AST、后缀表达式、DAG、三地址代码
Atitti. 语法树AST.后缀表达式.DAG.三地址代码 抽象语法树的观点认为任何复杂的语句嵌套情况都可以借助于树的形式加以描述.确实,不得不承认应用抽象语法树可以使语句翻译变得相对容易,它很好地 ...
- python 练习题1--打印三位不重复数字
题目:有四个数字:1.2.3.4,能组成多少个互不相同且无重复数字的三位数?各是多少? 程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去 掉不满足条件的排列. 程序源代码 ...
- ext树菜单实体类
package cn.edu.hbcf.common.vo; import java.util.ArrayList; import java.util.List; /** * ext树菜单 * * @ ...
- cocos2dx错误收集
1.读取ccb文件onNodeLoaded调用两次的问题 不小心把cocosbuilder里的控件的Custom class里填了两次自定义类,如下: 结果在onNodeLoaded时调用了两次,结果 ...
- 怎么来爬取代理服务器ip地址?
一年前突然有个灵感,想搞个强大的网盘搜索引擎,但由于大学本科学习软件工程偏嵌入式方向,web方面的能力有点弱,不会jsp,不懂html,好久没有玩过sql,但就是趁着年轻人的这股不妥协的劲儿,硬是把以 ...
- 交叉编译移植openssl
交叉编译openssl静态库步骤: 1.解压源码 tar xf openssl-1.1.1a.tar.gz 2.进入到解压后的源码目录 cd openssl-1.1.1a/ 3.配置Makefile ...