【HDU4303】Hourai Jeweled
2024-08-27 16:25:07
题意
有一棵n个结点的树,每个结点都有一个值,没一条边都有一个颜色。如果某条路径上,相邻的边颜色不同,那么把这路径上所有的点的值加起来。 输出所有符合条件的路径上值的和。 n<=300000。
分析
场上读错题了。当时以为是路径上所有的边都不能有相同的颜色,雾。。。
树形DP。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <map>
using namespace std;
const int maxn=+;
int head[maxn],Next[*maxn],to[*maxn],col[*maxn],val[maxn];
int n,sz;
long long ans;
void add_edge(int a,int b,int c){
sz++;
to[sz]=b;
col[sz]=c;
Next[sz]=head[a];
head[a]=sz;
}
long long f[maxn],num[maxn];
void dp(int u,int fa,int co){
long long alltmp=,allnum=;
num[u]=;f[u]=val[u];
map<int,long long>Mdp;
map<int,long long>Mnum; for(int i=head[u];i;i=Next[i]){
int v=to[i];
if(v!=fa){
dp(v,u,col[i]);
if(co!=col[i]){
f[u]+=f[v]+val[u]*num[v];
num[u]+=num[v];
}
ans+=f[v]+val[u]*num[v];
alltmp+=f[v]+val[u]*num[v];
allnum+=num[v];
Mnum[col[i]]+=num[v];
Mdp[col[i]]+=f[v]+val[u]*num[v];
}
}
long long temp=;
for(int i=head[u];i;i=Next[i]){
if(to[i]!=fa){
temp+=f[to[i]]*(allnum-Mnum[col[i]])+num[to[i]]*(alltmp-Mdp[col[i]]);
}
}
ans+=temp/;
}
int main(){
while(scanf("%d",&n)!=EOF){
ans=;
memset(head,,sizeof(head));
sz=;
for(int i=;i<=n;i++)
scanf("%d",&val[i]);
int a,b,c;
for(int i=;i<n;i++){
scanf("%d%d%d",&a,&b,&c);
add_edge(a,b,c);
add_edge(b,a,c);
}
dp(,,);
printf("%lld\n",ans);
}
return ;
}
最新文章
- Java中对session的简单操作
- SQL中关于字符串的处理
- 使用 SharedPreferences 实现数据的存储和读取
- webconfig和appconfig中出现特殊字符如何处理
- angularJs中将字符串转换为HTML格式
- 理解C#系列 / C#语言的特性
- 【转】简明vim练级攻略
- python_Opencv_图像的基础操作
- Java之IO流补充
- 基于MATLAB边缘检测算子的实现
- iOS NFC
- Linux增加开放端口号
- styled-components解决全局样式&#39;injectGlobal&#39; 废除的问题
- linux 下修改etc/profile文件
- OkHttp3源码详解(五) okhttp连接池复用机制
- 透彻掌握Promise的使用
- linux中pam模块
- JMeter性能测试基础 (4)-使用JMeter录制测试脚本
- 大数据入门第十四天——Hbase详解(三)hbase基本原理与MR操作Hbase
- Android中获取屏幕长宽的方法
热门文章
- Android 进阶7:进程通信之 AIDL 的使用
- 学习Java有没有什么捷径?
- php语法笔记
- linux中文件或者文件夹的基本操作(复制,移动,删除,查找,压缩)
- win键盘映射成mac键盘
- Cam350导入Allegro的*.rou文件
- windows中文编码报错 com.google.gson.JsonIOException: java.nio.charset.MalformedInputException: Input length = 1
- javaMail邮件接收解析内容及附件 及删除邮件
- 【转】使用Jmeter测试Webservice简单示例
- 怎么样使用yum来安装mysql