洛谷 4281 緊急集合

2022-05-25 19:36:16 字數 1576 閱讀 3202

歡樂島上有個非常好玩的遊戲,叫做「緊急集合」。在島上分散有n個等待點,有n-1條道路連線著它們,每一條道路都連線某兩個等待點,且通過這些道路可以走遍所有的等待點,通過道路從乙個點到另乙個點要花費乙個遊戲幣。

參加遊戲的人三人一組,開始的時候,所有人員均任意分散在各個等待點上(每個點同時允許多個人等待),每個人均帶有足夠多的遊戲幣(用於支付使用道路的花費)、地圖(標明等待點之間道路連線的情況)以及對話機(用於和同組的成員聯絡)。當集合號吹響後,每組成員之間迅速聯絡,了解到自己組所有成員所在的等待點後,迅速在n個等待點中確定乙個集結點,組內所有成員將在該集合點集合,集合所用花費最少的組將是遊戲的贏家。

小可可和他的朋友邀請你一起參加這個遊戲,由你來選擇集合點,聰明的你能夠完成這個任務,幫助小可可贏得遊戲嗎?

第一行兩個正整數n和m(n<=500000,m<=500000),之間用乙個空格隔開。分別表示等待點的個數(等待點也從1到n進行編號)和獲獎所需要完成集合的次數。 隨後有n-1行,每行用兩個正整數a和b,之間用乙個空格隔開,表示編號為a和編號為b的等待點之間有一條路。 接著還有m行,每行用三個正整數表示某次集合前小可可、小可可的朋友以及你所在等待點的編號。

一共有m行,每行兩個數p,c,用乙個空格隔開。其中第i行表示第i次集合點選擇在編號為p的等待點,集合總共的花費是c個遊戲幣。

輸入 #1複製

6 4  

1 2

2 3

2 4

4 55 6

4 5 6

6 3 1

2 4 4

6 6 6

輸出 #1複製

5 2

2 54 1

6 0

40%的資料中n<=2000,m<=2000

100%的資料中,n<=500000,m<=500000

題解:罕見這麼水的紫題。。。lca直接上就行啦

#include#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

const

int n=500002

;typedef

long

long

ll;struct

nodee[n*2

];int n,m,t,x,y,a,b,c,d[n],f[n][22

];int

cnt,head[n];

void add(int x,int

y)void dfs(int u,int

fa)}

int lca(int x,int

y)

for(int i=20;i>=0;i--)

if(f[x][i]!=f[y][i])

return f[x][0];}

intmain()

dfs(

1,0);

for(int i=1;i<=m;i++)

return0;

}

洛谷P4281 緊急集合 聚會 LCA

給出一棵樹,每次給出三個點x,y zx,y,z,求哪乙個點與這三個點的距離之和最近。首先,很明顯的一件事情是 給出一棵樹上的三個點,這三個點中總有兩個的lca lca是一樣的。證明 假設我們能找到乙個點,這個點的左子樹中有2個標記點,右子樹中有1個標記點 或者左子樹1個,右子樹2個 那麼很明顯左子樹...

P4281 AHOI2008 緊急集合 聚會

題意描述 link 歡樂島上有個非常好玩的遊戲,叫做 緊急集合 在島上分散有 n 個等待點,有 n 1 條道路連線著它們,每一條道路都連線某兩個等待點,且通過這些道路可以走遍所有的等待點,通過道路從乙個點到另乙個點要花費乙個遊戲幣。參加遊戲的人三人一組,開始的時候,所有人員均任意分散在各個等待點上 ...

P4281 AHOI2008 緊急集合 聚會

給定一棵樹,邊權為 1 多次詢問,給出三個點 a,b,c 求三個點的中點和到中點的總距離 定義中點為 x 滿足 dis a,x dis b,x dis c,x 最小 除錯日誌 jump 陣列開小,只開了 19 首先是樹上兩點距離 dis x,y dep x dep y 2 dep lca x,y 根...