题目链接:https://ac.nowcoder.com/acm/contest/3566/B

思路:一条路可把图分为左右两部分。

l_ci, l_peo, r_ci, r_peo, w 分别为左边城市数和人数,右边城市数和人数,该路的费用。

我们知道,左边的人要去右边的r_ci个城市,右边的人要去左边的l_ci个城市,

那么该路的费用就是 cost = 2*w*(l_ci*r_peo + r_ci*l_peo);(注意来回)。

我们可以用拓扑排序来得出一条边的左右人数和城市情况。

 #include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
using namespace std;
typedef long long ll; const int N = (int)2e5+;
struct node{
int to,nxt;
}e[N<<];
struct Info{
int ci,peo;
Info(){ci = peo = ;}
}info[N];
int A[N],W[N],du[N],head[N];//人数,路费,度数
bool vis[N];
int n,u,v,w,tot;ll sum_peo; inline void add(int u,int v){
e[tot].to = v; e[tot].nxt = head[u]; head[u] = tot++;
e[tot].to = u; e[tot].nxt = head[v]; head[v] = tot++;
} void top_sort(){
//度数为1的压入
queue<int > que;
for(int i = ; i <= n; ++i){
if(du[i] == ){
vis[i] = ;
que.push(i);
}
} while(!que.empty()){
int now = que.front(); que.pop();
//加上自己城市的情况
info[now].ci += ;
info[now].peo += A[now];
for(int o = head[now]; ~o; o = e[o].nxt){
int to = e[o].to;
if(!vis[to]){
//传递自己城市的情况
info[to].ci += info[now].ci;
info[to].peo += info[now].peo;
if(--du[to] == ){
vis[to] = ;
que.push(to);
}
}
}
}
} void show_info(){
for(int i = ;i <= n; ++i){
printf("now = %d city = %d people = %d\n",i,info[i].ci,info[i].peo);
}
} inline ll cost(Info& u,int i){
Info v;
v.ci = n-u.ci;
v.peo = sum_peo - u.peo;
// printf("u.c = %d v.c = %d u.p = %d v.p = %d W = %d\n",u.ci,v.ci,u.peo,v.peo,W[i]);
return (ll)*W[i]*((ll)u.ci*v.peo+(ll)v.ci*u.peo);
} int main(){ scanf("%d",&n);
for(int i = ; i <= n; ++i) head[i] = -; tot = ;
for(int i = ; i <= n; ++i){
scanf("%d",A+i);
sum_peo += A[i];
}
for(int i = ; i < n; ++i){
scanf("%d%d%d",&u,&v,W+i);
add(u,v);
++du[u]; ++du[v];//无向边
}
top_sort();
//show_info();
for(int i = ; i < *(n-); i+=){
//我们总是选一条边城市数少的一边去得出另一边的人数和城市情况
int x = info[e[i].to].ci < info[e[i^].to].ci ? e[i].to : e[i^].to;
// printf("city = %d\n",x);
printf("%lld\n",cost(info[x],+(i>>)));
} return ;
}

牛客练习赛56 B 小琛和他的学校的更多相关文章

  1. 牛客练习赛56 E 小雀和他的王国

    题目链接:https://ac.nowcoder.com/acm/contest/3566/E 思路:tarjan缩点,桥重建图,dfs跑树的直径. #include <iostream> ...

  2. 牛客练习赛48 C 小w的糖果 (数学,多项式,差分)

    牛客练习赛48 C 小w的糖果 (数学,多项式) 链接:https://ac.nowcoder.com/acm/contest/923/C来源:牛客网 题目描述 小w和他的两位队友teito.toki ...

  3. 牛客练习赛48 A· 小w的a+b问题 (贪心,构造,二进制)

    牛客练习赛48 A· 小w的a+b问题 链接:https://ac.nowcoder.com/acm/contest/923/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C ...

  4. 牛客练习赛44 C 小y的质数 (数论,容斥定理)

    链接:https://ac.nowcoder.com/acm/contest/634/C 来源:牛客网 题目描述 给出一个区间[L,R],求出[L,R]中孪生质数有多少对. 由于这是一个区间筛质数的模 ...

  5. 牛客练习赛44 B 小y的线段 (思维)

    链接:https://ac.nowcoder.com/acm/contest/634/B 来源:牛客网 题目描述 给出n条线段,第i条线段的长度为a_ia i ​ ,每次可以从第i条线段的j位置跳到第 ...

  6. 牛客练习赛44 A 小y的序列 (模拟,细节)

    链接:https://ac.nowcoder.com/acm/contest/634/A 来源:牛客网 小y的序列 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语 ...

  7. 牛客练习赛48 D 小w的基站网络

    链接:https://ac.nowcoder.com/acm/contest/923/D来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言52428 ...

  8. 牛客练习赛40 A 小D的剧场 (思维dp)

    链接:https://ac.nowcoder.com/acm/contest/369/A 题目描述 若你摘得小的星星 你将得到小的幸福  若你摘得大的星星 你将得到大的财富  若两者都能摘得 你将得到 ...

  9. 牛客练习赛40 C 小A与欧拉路(树的直径)

    链接:https://ac.nowcoder.com/acm/contest/369/C 题目描述 小A给你了一棵树,对于这棵树上的每一条边,你都可以将它复制任意(可以为0)次(即在这条边连接的两个点 ...

随机推荐

  1. python学习Day06--编码

    [主要内容] 1. is 和 == 区别 id()函数 == 判断两边的值 is 判断内存地址回顾编码: 1. ASCII: 英文, 特殊字符, 数字, 8bit, 1byte 2. GBK: 中文 ...

  2. DOCKER 学习笔记7 Docker Machine 在阿里云实例化ECS 以及本地Windows 实例化虚拟机实战

    前言 通过以上6小节的学习,已经可以使用DOCKER 熟练的部署应用程序了.大家都可以发现使用 DOCKER 带来的方便之处,因为现在的话,只是在一台服务器上部署,这样部署,我们只需要一条命令,需要的 ...

  3. MQTT协议的学习

    MQTT是一个客户端服务端架构的发布/订阅模式的消息传输协议.它的设计思想是轻巧.开放.简单.规范,易于实现.这些特点使得它对很多场景来说都是很好的选择,特别是对于受限的环境如机器与机器的通信(M2M ...

  4. Ubuntu下python使用pyenv+virtualenv进行版本和包隔离

    安装pyenv 参考:https://github.com/pyenv/pyenv git clone https://github.com/pyenv/pyenv.git ~/.pyenv echo ...

  5. Codeforces_831

    A.线性判断. #include<bits/stdc++.h> using namespace std; ] = {}; int main() { ios::sync_with_stdio ...

  6. CCF_ 201512-4_送货

    一道拖了很久了题,用bool开的vis不会爆内存,dfs回溯的话会超时,于是有了一个很巧妙的dfs. #include<iostream> #include<cstring> ...

  7. java4选择结构 二

    public class jh_01_为什么使用switch选择结构 { /* * 韩嫣参加计算机编程大赛 * 如果获得第一名,将参加麻省理工大学组织的1个月夏令营 * 如果获得第二名,将奖励惠普笔记 ...

  8. Mario是一个基于.NETCore的简单快速开发框架

    Mario .NET Core简单快速开发框架 Mario是一个基于.NET Core的简单快速开发框架 GitHub:https://github.com/deeround/Mario 技术特点 基 ...

  9. 初入机器学习,安装tensorflow包等问题总结

    学习python,机器学习(maching-lerning).深度学习(deep-learning)等概念也是耳熟能详.我最近从新手开始学习maching-learning知识,不过课程偏向基本的理论 ...

  10. djiango 配置文件(setings)

    """ Django settings for ORM project. Generated by 'django-admin startproject' using D ...