來自湘潭大學oj,題號:1267。
這裡用到了乙個樹的直徑(樹中的最長邊)的結論:當你找到一棵樹的最長邊後,這個樹中所有點的最長邊必定和這條邊的兩個端點相連。下面給出證明:
設這條最長邊的兩個端點分別為b和e;
1.當選擇的任意點m在這條最長邊上時:如果此時還存在另乙個點t,使得mt > max。則:mt + min > max + min = be這與題目假設相矛盾。
2.當選擇的任意點m不在這條最長邊上時:
α.與它相連的最長邊與be有交點時,假設交於x,則:m的最長邊 = mx + x的最長邊,而x在be上,所以m的最長邊 = mx + max即它的最長邊終止於be中的乙個點。
b.若無交點,假設m的最長邊為mn,則:取be上一點x,連線mx,有:mn > max + xm,mn + mx + max > 2mx + 2max > be與題設矛盾
由此,本題思路即為:先找到最長邊,然後將其餘的n - 2個點到最長邊兩個端點的距離算出,不斷地挑選這n-2個點到兩個端點的更長的那個路徑,最後加上這條最長路就是所求結果。
下面的**用c++11提交能過,而用g++則會wa
#include#include#include
#include
#include
#include
#define maxn 100005
#define f 0x3f
using
namespace
std;
struct
edge
};long
long dist[3
][maxn];
vector
graph[maxn];
inline
void
init()
queue
q;void bfs(int use,int
start)}}
return;}
intmain()
intpoint1,point2;
memset(dist,-1,sizeof
(dist));
//printf("now dist is %lld\n",dist[0][0]);
bfs(0,1
);
long
long maxone = 0
;
for(int i = 2;i <= n;++i)
maxone = 0
; bfs(
1,point1);
for(int i = 1;i <= n;++i)
bfs(
2,point2);
//printf("point1 is %d and point2 is %d\n",point1,point2);
long
long answer = 0
; answer += dist[1
][point2];
for(int i = 1;i <= n;++i)
}if(n == 1) answer = 0
; printf(
"%lld\n
",answer);
}return0;
}
2023年CCPC中南地區邀請賽總結
週六下午到的時候來到訂的酒店樓下卻發現酒店在裝修,感嘆湘潭人名寫意的生活態度。來不及休息,趕緊帶著行李參加熱身賽。因為前輩有在比賽中失誤重啟的經歷,我們特地重啟了下看d盤是否會還原。熱身賽題目比較簡單,大多是湘潭大學自己的題目,而且很多學校沒來,三發1a,排名第10。比賽時間週日上午9.00 14....
CCPC中南地區邀請賽小結
此行的時間很趕,周五出發週日回,杭州到湘潭,坐的是火車,還是比較累的。週六早上到,翻山越嶺找到了賓館,休息了一會兒就去找網咖了,因為下午還有一場團體天梯賽。在網咖裡待了三個多小時,這場初賽的題目相對上次的模擬題來說好像稍微好寫一點,不過因為沒帶紙和筆,最後一題沒仔細的推算,只能搞個26分。從網咖出來...
2017 CCPC 哈爾濱站 銀牌題彙總
a palindrome hdu 6230 題目大意 乙個字串找出有多少 乙個半回文串 乙個半回文串的定義為,兩個回文串恰好a的右邊界是b的回文中心,而b的左邊界恰好是a的回文中心。題目思路 有兩種做法,主席樹和樹狀陣列,主席樹慢些但是題目並不想卡主席樹。分析題目可以知道,只要求出有多少對回文串相互...