傳送門
solution:
這題乍一看毫無思路,但是仔細思考(指思考了兩天),找到了突破口。
手玩一下樣例,設最大值為a
ia_i
ai(在第i
ii個結點),那麼在旅行若干次i
ii後,其相鄰結點中會有乙個aj=
ai
a_j = a_i
aj=ai
(在第j個結點)。此時若i
ii< j
jj,則繼續旅行i
ii,使得aj=
ai+1
a_j = a_i + 1
aj=ai
+1。接下來應該旅行j
jj,而旅行一次j
jj後,因為j
jj的相鄰結點中i
ii的a
aa值最大,且此時a
ia_i
ai又會大於(或等於,取決於i
ii和j
jj的大小關係)又應該旅行iii。
所以應該先旅遊幾天,若旅行完m
mm天a
i>aj
a_i > a_j
ai>aj
(由a
aa陣列中元素的範圍可知,使ai=
aj
a_i = a_j
ai=aj
的天數 < 2
312^
231),則直接輸出i
ii,否則接下來判斷m−(
ai−a
j)
m - (a_i - a_j)
m−(ai
−aj
)的奇偶性。
可以配合**理解。
code:
#include
#include
#include
using
namespace std;
typedef
long
long ll;
const
int maxn =
4000007
;const
int inf =
99999999
;int t, n;
ll m;
int a[maxn]
;struct edge
}e[maxn]
;int fir[maxn]
, tote;
struct node
// 過載小於運算子,當x != h.x時比較x,當x == h.x時比較其id值。
node (
int id =0,
int x =0)
:id(id),x
(x)}mxi, mxj;
void
clear()
void
addedge
(int x,
int y)
intmain()
if(n ==1)
int x, y;
for(
int i =
1; i < n; i++
)for
(int i = fir[mxi.id]
; i; i = e[i]
.nxt)
mxj =
max(mxj,
node
(e[i]
.v, a[e[i]
.v]));
//mxi代表a值最大的節點,mxj代表mxi相鄰的節點中a值最大的那個點。
int h = mxi.x - mxj.x;
if(m < h)
// m不滿足二者的差值。
m -= h;
mxj.x = mxi.x;
if(mxi < mxj)
swap
(mxi, mxj);if
(m &
1) cout << mxj.id << endl;
// m&1 即 m%2==1
else cout << mxi.id << endl;
}return0;
}
洛谷P1536 村村通
有t組測試資料 t 是的你沒有看錯,就是無窮大!其實是因為我不知道有多少 每組測試資料給出n個村莊,m條道路,問還需幾條道路,使這張圖聯通。用並查集連線,再統計這張圖還需幾條路聯通。include define r i,a,b for int i a i b i using namespace st...
洛谷P1536 村村通
題目提供者johnkram 標籤雲端 難度普及 提高 時空限制1s 128mb 提交 討論 題解 某市調查城鎮交通狀況,得到現有城鎮道路統計表。表中列出了每條道路直接連通的城鎮。市 村村通工程 的目標是使全市任何兩個城鎮間都可以實現交通 但不一定有直接的道路相連,只要相互之間可達即可 請你計算出最少...
洛谷 P1503 鬼子進村
描述 縣城裡有n個用地道相連的房子,第i個只與第i 1和第i 1個相連。這是有m個訊息依次傳來 1 訊息為d x 鬼子將x號房子摧毀了,地道被堵上。3 訊息為q x 有一名士兵被圍堵在x號房子中。李雲龍收到資訊很緊張,他想知道每乙個被圍堵的士兵能夠到達的房子有幾個。輸入格式 第一行2個整數n,m n...