洛谷P7043 村國

2021-10-10 05:59:07 字數 2026 閱讀 3848

傳送門

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