牛客练习赛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)次(即在这条边连接的两个点 ...
随机推荐
- Python黑客编程知识点整理
Python转义字符 转义字符 意义 ASCII码值(十进制) \a 响铃(BEL) 007 \b 退格(BS) ,将当前位置移到前一列 008 \f 换页(FF),将当前位置移到下页开头 012 \ ...
- HDU2066dijkstra模板题
问题描述: 题目描述:Problem Description 虽然草儿是个路痴(就是在杭电待了一年多,居然还会在校园里迷路的人,汗~),但是草儿仍然很喜欢旅行,因为在旅途中 会遇见很多人(白马王 ...
- CCF_201604-2_俄罗斯方块
用一个4*2的数组记录方块的位置,每一次移动前判断每个方块位置下面是否已有方块,直到不能移动,将该数组更新到原来的图上,输出即可. #include<cstdio> #include< ...
- (七)mybatis批量操作,分页插件
首先使用方式很简单: SqlSession sqlSession = sessionFactory.openSession(ExecutorType.BATCH); 批量操作核心:改变执行sql的方式 ...
- js发展历史与基础
最早的浏览器是WWW浏览器 Mosaic浏览器是互联网历史上第一个获普遍使用和能够显示图片的网页浏览器,于1993年问世 浏览器组成部分: 1)shell部分(外壳) 2)内核部分 ① 渲染引擎(语法 ...
- java 获取两个时间之前所有的日期
正序(2017-01-01 ~2019-xxxxx) package com.founder.util; import java.text.SimpleDateFormat; import java. ...
- docker介绍 架构 安装
Docker是什么? docker是一个开源的软件部署解决方案: docker也是轻量级的应用容器框架: docker可以打包.发布.运行任何的应用. Docker 是一个开源的应用容器引擎,基于 G ...
- 简单ts文件结构
一.ts文件结构 DEMO{ 1. .vscode:特有文件夹,调试的配置文件,启动浏览器 2. Js:放ts编译后的文件,不管 3. Ts:放ts文件,敲代码 4. tsconfig.json:ts ...
- apache主配置文件httpd.conf详解
[root@lamp conf]# vi httpd.conf.bak 1 # 2 # This is the main Apache HTTP server configuration file. ...
- windows下修改tomcat的startup.bat脚本文件后台运行
1.修改startup.bat文件 rem Get remaining unshifted command line arguments and save them in the set CMD_LI ...