牛客練習賽56 B 小琛和他的學校

2022-05-20 23:24:01 字數 1076 閱讀 6793

思路:一條路可把圖分為左右兩部分。

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 5

using

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...