思路:一條路可把圖分為左右兩部分。
l_ci, l_peo, r_ci, r_peo, w 分別為左邊城市數和人數,右邊城市數和人數,該路的費用。
我們知道,左邊的人要去右邊的r_ci個城市,右邊的人要去左邊的l_ci個城市,
那麼該路的費用就是 cost = 2*w*(l_ci*r_peo + r_ci*l_peo);(注意來回)。
我們可以用拓撲排序來得出一條邊的左右人數和城市情況。
1 #include 2 #include 3 #include 4 #include 5using
namespace
std;
6 typedef long
long
ll;7
8const
int n = (int)2e5+100;9
struct
nodee[n<<1
];12
struct
info
15}info[n];
16int a[n],w[n],du[n],head[n];//
人數,路費,度數
17bool
vis[n];
18int
n,u,v,w,tot;ll sum_peo;
1920 inline void add(int u,int
v)24
25void
top_sort()33}
3435
while(!que.empty())50}
51}52}
53}5455
void
show_info()59}
6061 inline ll cost(info& u,int
i)68
69int
main()
77for(int i = 1; i < n; ++i)
82top_sort();
83//
show_info();
84for(int i = 0; i < 2*(n-1); i+=2)90
91return0;
92 }
牛客練習賽56 小魂和他的數列
題目鏈結 給出乙個數列,讓求長度為k的嚴格遞增子串行有多少個 怎麼做呢?顯然dp 這個是很好想的 for int i 1 i n i for int i 2 i m i 這個dp顯然tle 所以 當時沒有做出來。做到這裡不會做了。想不到怎麼優化。顯然在最裡面的那個迴圈的作用是字首和 小於a i 的位...
牛客 3566B 小琛和他的學校 樹形dp
小琛是一所學校的校長。他的學校有n個校區 編號1 n 被n 1條雙向道路連線,呈樹形結構。第i個校區共有ai個學生。第i天早上,所有的學生會沿最短路走到第i個校區參加活動,晚上再原路返回。乙個人通過第j條通道一次 即一人次 需要小琛支付wj的維護費用。小琛想知道第n天結束之後,對於每一條通道,他總共...
牛客練習賽56 C
預處理出該序列中的每個數是第幾大的,然後依次按照大小插入到樹狀陣列中,沒插入乙個數字,就判斷現在在陣列中的數比當前數小的數有多少個,讓後逐層更新一下,更新k層,最後把低k層的數加起來即可。include include using namespace std typedef long long ll...