牛客练习赛56 B 小琛和他的学校
题目链接: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 小琛和他的学校的更多相关文章
- 牛客练习赛56 E 小雀和他的王国
题目链接:https://ac.nowcoder.com/acm/contest/3566/E 思路:tarjan缩点,桥重建图,dfs跑树的直径. #include <iostream> ...
- 牛客练习赛48 C 小w的糖果 (数学,多项式,差分)
牛客练习赛48 C 小w的糖果 (数学,多项式) 链接:https://ac.nowcoder.com/acm/contest/923/C来源:牛客网 题目描述 小w和他的两位队友teito.toki ...
- 牛客练习赛48 A· 小w的a+b问题 (贪心,构造,二进制)
牛客练习赛48 A· 小w的a+b问题 链接:https://ac.nowcoder.com/acm/contest/923/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C ...
- 牛客练习赛44 C 小y的质数 (数论,容斥定理)
链接:https://ac.nowcoder.com/acm/contest/634/C 来源:牛客网 题目描述 给出一个区间[L,R],求出[L,R]中孪生质数有多少对. 由于这是一个区间筛质数的模 ...
- 牛客练习赛44 B 小y的线段 (思维)
链接:https://ac.nowcoder.com/acm/contest/634/B 来源:牛客网 题目描述 给出n条线段,第i条线段的长度为a_ia i ,每次可以从第i条线段的j位置跳到第 ...
- 牛客练习赛44 A 小y的序列 (模拟,细节)
链接:https://ac.nowcoder.com/acm/contest/634/A 来源:牛客网 小y的序列 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语 ...
- 牛客练习赛48 D 小w的基站网络
链接:https://ac.nowcoder.com/acm/contest/923/D来源:牛客网 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言52428 ...
- 牛客练习赛40 A 小D的剧场 (思维dp)
链接:https://ac.nowcoder.com/acm/contest/369/A 题目描述 若你摘得小的星星 你将得到小的幸福 若你摘得大的星星 你将得到大的财富 若两者都能摘得 你将得到 ...
- 牛客练习赛40 C 小A与欧拉路(树的直径)
链接:https://ac.nowcoder.com/acm/contest/369/C 题目描述 小A给你了一棵树,对于这棵树上的每一条边,你都可以将它复制任意(可以为0)次(即在这条边连接的两个点 ...
随机推荐
- 基于H5与webGL的 3d 电子围栏展示
前言 现代工业化的推进在极大加速现代化进程的同时也带来的相应的安全隐患,在传统的可视化监控领域,一般都是基于 Web SCADA 的前端技术来实现 2D 可视化监控,本系统采用 Hightopo 的 ...
- Asp.net core 2.x/3.x 的 Globalization 和 localization 的使用 (一) 使用方法
由于Api的接口需要返回多语言,因此参考了网上很多篇文章,,有些文章写的太过于理论,看起来比较费劲,今天下午搞了一个下午,总结了一下经验,, 做这个功能时,主要参考了两篇文章: https://blo ...
- An internal error occurred during: "Launching New_configuration". Path for project must have only on
在Eclipse中按照如下操作 Project -> Properties -> Run/Debug Settings: 1. select "Launching New_con ...
- 使用卷影拷贝提取ntds.dit
一.简介 通常情况下,即使拥有管理员权限,也无法读取域控制器中的C:\Windows\NTDS\ntds.dit文件.使用windows本地卷影拷贝服务,就可以获得该文件的副本. 在活动目录中,所有的 ...
- golang学习笔记(二):流程控制
欢迎访问我的博客和github! 今天咱们把烦人的事情丢一丢,继续来学习go的基础知识. 这篇文章记录go语言的流程控制和更多类型. 流程控制 for Go 只有一种循环结构:for 循环. 基本的 ...
- Markdown 教程
Markdown 简介 Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档. Markdown 语言在 2004 由约翰·格鲁伯(英语:John Gruber)创建. ...
- 未来JDK中将不再包含JDBC-ODBC桥
今天才发现一个重要问题,java中居然没有这个桥了.让初学者真的泪流了! 甲骨文公司主要技术人员.JDBC规范领导者Lance Andersen今天在博客中称,从Java SE 8(java 1.8版 ...
- 快速应用开发(RAD)平台 - 20 年的演进
过去几年中,现代软件开发的整体环境发生了巨大的变化.对我个人来说,这种变化与宇宙的加速膨胀差不多.第二个千年刚到来时,产业的发展看起来还不是那么快,只是逐步在前进.现在技术发展的复杂度和多样性已经可以 ...
- 《Head first设计模式》学习笔记
1. 单例模式 2. 工厂模式 3. 抽象工厂 4. 策略模式 5. 观察者模式 6. 装饰者模式 7. 命令模式 8. 适配器模式 9. 外观模式 10. 模版方法模式 11. 迭代器模式 设计模式 ...
- 20200105--python学习数据类型总结
总结 python中的数据类型:整型/布尔类型/字符串/元组/列表/字典/集合 注意:列表,字典,集合都不能作为字典中的key,也不能作为集合中的元素 数据类型: (1)整型 (2)布尔类型:只有两个 ...