题意

链接:https://ac.nowcoder.com/acm/contest/2995/E
来源:牛客网

卡特莉正在爬树,此时她又在树梢发现了一个谜题,为了不令她分心以至于发生意外,请你帮她解决这个问题。
具体地来说,我们定义树上从u到v简单路径上所有点权中最大值与最小值的差值为这条路径的"平衡值",记为balance(u,v)。

思路

首先,把这个式子拆成两部分,一部分计算最大值的和,另一部分计算最小值的和。

如何计算最大值的和?

将点按点权从小到大排序,从小到大遍历每个点u,记u为访问过,找u连的点v,如果v访问过了,那么说明v肯定比u小,所以u的权值在这两个集合作为最大值,乘上sz[fu]和sz[fv]即为u对答案的贡献。可能会有疑问为啥要乘上sz[fu],乘上sz[fv]不就是u对v所在集合的贡献吗?实则不然,比如看样例:

1
10
9 9 6 2 4 5 8 5 5 6
2 1
3 1
4 3
5 3
6 4
7 2
8 4
9 5
10 3

蓝色表示每个点按顺序更新后所在集合的sz,当遍历到u=2的时候,发现连的点7和1都访问过,说明权值都是小于等于9的,所以将2和7合并后,u所在集合的sz变成了2,那么2再和1合并时,不仅2可以作为1所在集合的点的最大值,而且7这个点是可以陪着2一起连向1所在集合的,因为最大值依然是2这个点。

对于最小值的和的求法是类似的,按权值从大到小排序……

代码

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int N=5e5+5;
const int mod=1e9+7;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
int read()
{
int x=0;
char ch=getchar();
while(!isdigit(ch))
{
ch=getchar();
}
while(isdigit(ch))
{
x=x*10+(ch-'0');
ch=getchar();
}
return x;
}
struct node
{
ll x,w;
}a[N];
bool cmp1(node a,node b)
{
return a.w<b.w;
}
bool cmp2(node a,node b)
{
return a.w>b.w;
}
vector<int> g[N];
ll pre[N],mx[N],mn[N],sz[N],vis[N];
ll find(ll x)
{
if(x==pre[x])
return x;
return pre[x]=find(pre[x]);
}
int main()
{
std::ios::sync_with_stdio(false);
int t=read();
while(t--)
{
int n=read();
for(int i=1; i<=n; i++)
{
g[i].clear();
a[i].w=read();
a[i].x=i;
mx[i]=mn[i]=a[i].w;
}
for(int i=1; i<n; i++)
{
int u=read(),v=read();
g[u].push_back(v);
g[v].push_back(u);
}
sort(a+1,a+n+1,cmp1);
for(int i=1; i<=n; i++)
pre[i]=i,sz[i]=1,vis[i]=0;
ll ans1=0;
for(int i=1; i<=n; i++)
{
ll u=a[i].x,fu=find(u);
vis[u]=1;
for(int j:g[u])
{
if(!vis[j]) continue;
int fj=find(j);
pre[fj]=fu;
ans1=(ans1+sz[fu]*sz[fj]%mod*a[i].w%mod)%mod;
(sz[fu]+=sz[fj])%=mod;
}
// cout<<u<<" "<<sz[fu]<<endl;
}
// cout<<ans1<<endl;
sort(a+1,a+1+n,cmp2);
for(int i=1; i<=n; i++)
pre[i]=i,sz[i]=1,vis[i]=0;
ll ans2=0;
for(int i=1; i<=n; i++)
{
int u=a[i].x,fu=find(u);
vis[u]=1;
for(int j:g[u])
{
if(!vis[j]) continue;
int fj=find(j);
pre[fj]=fu;
ans2=(ans2+sz[fu]*sz[fj]%mod*a[i].w%mod)%mod;
(sz[fu]+=sz[fj])%=mod;
}
// cout<<u<<" "<<sz[fu]<<endl;
}
// cout<<ans2<<endl;
cout<<(ans1%mod-ans2%mod+mod)%mod<<endl;
}
return 0;
}

  

第十六届浙江大学宁波理工学院程序设计大赛 E 雷顿女士与平衡树(并查集)的更多相关文章

  1. 第十六届浙江大学宁波理工学院程序设计大赛 D 雷顿女士与分队hard version(dp)

    题意 链接:https://ac.nowcoder.com/acm/contest/2995/D来源:牛客网 卡特莉接到来自某程序设计竞赛集训队的邀请,来为他们进行分队规划. 现在集训队共有n名选手, ...

  2. nitacm第十六届浙江大学宁波理工学院程序设计大赛总结

    校赛时间:2019.11.30周六下午12:00-16:00 重现赛链接:https://ac.nowcoder.com/acm/contest/2995#question 体验: 11点多到达石鳞大 ...

  3. 第十六届“二十一世纪的计算”学术研讨会 密西根州立大学教授Anil K. Jain主题演讲

    Biometrics---How Do I Know Who You Are? 密西根州立大学教授Anil K. Jain主题演讲" title="第十六届"二十一世纪的 ...

  4. 第十六届“二十一世纪的计算”学术研讨会 图灵奖获得者Butler W. Lampson主题演讲

    Personal Control of Digital Data 图灵奖获得者Butler W. Lampson主题演讲" title="第十六届"二十一世纪的计算&qu ...

  5. 第十六届“二十一世纪的计算”学术研讨会 牛津大学肿瘤成像学教授Michael Brady主题演讲

    Computing and Healthcare 牛津大学肿瘤成像学教授Michael Brady主题演讲" title="第十六届"二十一世纪的计算"学术研讨 ...

  6. 北京师范大学第十六届程序设计竞赛决赛 I 如何办好比赛

    链接:https://www.nowcoder.com/acm/contest/117/I来源:牛客网 如何办好比赛 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他 ...

  7. 西电大第十六届程序设计竞赛 A-GRE

    题目描述    不愤不启不悱不发,王萌萌为了能够成功上研,开始刻苦背GRE单词,但是由于她过于刻苦,在背会英语单词的同时,把中文读音忘了.于是王萌萌又开始复习起中文发音,她先从数字开始复习起...  ...

  8. “纽劢科技杯”第十六届同济大学程序设计竞赛暨上海邀请赛同步赛 J-张老师的游戏

    传送门 题目描述     在空闲时间,张老师习惯性地和菜哭武玩起了取石子游戏,这次的游戏规则有些不同,在他们面前有n堆石子,其中,第i堆石子的个数为a[i],现在制定规则如下:     从张老师开始, ...

  9. 北京师范大学第十六届程序设计竞赛决赛-重现赛-B题

    一.题目链接 https://www.nowcoder.com/acm/contest/117/B 二.题意 给定一组序列$a_1,a_2,\cdots,a_n$,表示初始序列$b_1,b_2,\cd ...

随机推荐

  1. HDU-6115

    我们将A省简化为由N个城市组成,某些城市之间存在双向道路,而且A省的交通有一个特点就是任意两个城市之间都能通过道路相互到达,且在不重复经过城市的情况下任意两个城市之间的到达方案都是唯一的.聪明的你一定 ...

  2. CodeForces845G-Shortest PathProblem?

    You are given an undirected graph with weighted edges. The length of some path between two vertices ...

  3. 【Webpack】315- 手把手教你搭建基于 webpack4 的 vue2 多页应用

    背景 前司和现司都会存在这种业务场景:有很多 H5 页面是不相关的,如果使用 SPA 的话,对于很多落地页和活动页不太友好,有一些纯前端页面加载过慢,所以就萌生了创建一个多页面 MPA 的框架. 起初 ...

  4. 【NodeJS】nvm

    [NodeJS]nvm node多版本管理 NVM_HOME=C:\env\nvm NVM_SYMLINK=C:\env\nodejs 查看版本 nvm v 查看当前使用的node版本 nvm cur ...

  5. 1篇文章搞清楚8种JVM内存溢出(OOM)的原因和解决方法

    前言 撸Java的同学,多多少少会碰到内存溢出(OOM)的场景,但造成OOM的原因却是多种多样. 堆溢出 这种场景最为常见,报错信息: java.lang.OutOfMemoryError: Java ...

  6. Test 1023 T1&T2

    T1 popust (贪心 TimeLimit: 1000MS Memory Limit: 32768KB ​ 米尔科饿了如熊,偶然发现当地一家餐馆.餐厅提供\(n\)种餐,有一个有趣的定价政策:每种 ...

  7. ssm整合——Mybatis配置(1)

    mybatis搭建-基于注解 1. 环境准备 1.1 新建maven的webapp项目 1.2 新建必要的目录和文件 1.3 文件配置 pom.xml junit默认创建是4.11,手动改成4.12 ...

  8. 解压小游戏之打砖块(C#+unity)

    z这个小游戏很简洁,很简单,非常适合一个人玩,特别减压

  9. 超级详细Mysql安装步骤图解

    数据库忘记装了,然后今天才装上.刚开始有点蒙蔽,进入mysql官网一堆英文,小声逼逼没有学号英语的我.废话不都说,直接上图 1.输入网址 https://www.mysql.com/downloads ...

  10. PWN INTEGER OVERFLOW 整数溢出

    0x00      Preview Last few passage I didn't conclude some important points and a general direction o ...