歡樂島上有個非常好玩的遊戲,叫做「緊急集合」。在島上分散有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 41 2
2 3
2 4
4 55 6
4 5 6
6 3 1
2 4 4
6 6 6
輸出樣例#1:
5 22 54 1
6 0
40%的資料中n<=2000,m<=2000
100%的資料中,n<=500000,m<=500000
幾乎裸的板子題
相會點只有三個,乙個是ab的lca,乙個是ac的lca,另乙個是bc的lca
這個的原因是到兩個點的lca再往別的地方走路徑就需要×2,很顯然另乙個點往這個lca走最近
勉強卡過了luogu測評機,但沒能卡過loj測評機
上**
#include#include#include#include#include#define rep(i,a,b) for(int i=a;i<=b;i++)#define dwn(i,a,b) for(int i=a;i>=b;i--)
#define maxn 500050
#define maxm 1000050
using namespace std;
int to[maxm],nxt[maxm],fir[maxn],tot,dp[maxn][25],n,m,dep[maxn];
void ade(int u,int v)
void get_tree(int x,int fa)
}struct zlkans[4];
int lca(int x,int y)
bool cmpp(zlk q,zlk w)
void print(int x)
int tots=1;while(x>=tots) tots*=10;tots/=10;
while(tots>0) putchar('0'+x/tots),x%=tots,tots/=10;
}int main()
get_tree(1,0);
rep(i,1,m)
return 0;
}
AHOI2008 緊急集合 聚會
歡樂島上有個非常好玩的遊戲,叫做 緊急集合 在島上分散有n個等待點,有n 1條道路連線著它們,每一條道路都連線某兩個等待點,且通過這些道路可以走遍所有的等待點,通過道路從乙個點到另乙個點要花費乙個遊戲幣。參加遊戲的人三人一組,開始的時候,所有人員均任意分散在各個等待點上 每個點同時允許多個人等待 每...
AHOI2008 緊急集合 聚會
歡樂島上有個非常好玩的遊戲,叫做 緊急集合 在島上分散有n個等待點,有n 1條道路連線著它們,每一條道路都連線某兩個等待點,且通過這些道路可以走遍所有的等待點,通過道路從乙個點到另乙個點要花費乙個遊戲幣。參加遊戲的人三人一組,開始的時候,所有人員均任意分散在各個等待點上 每個點同時允許多個人等待 每...
AHOI2008 緊急集合 聚會
緊急集合 聚會 題目大意 給出乙個無向圖,每一次給出圖中的三個點,求離三個點距離之和最小的點。解決方法 倍增lca。首先我們兩兩點之間求出lca,那麼離他們距離之和最近的點就是三個點中深度最深的點,想一想為什麼?我們假設存在乙個點離三個點距離之和更近且深度更淺,那麼我們將它的深度往下走乙個,一定會有...