嵊州D6T2 城市 city

2022-05-31 15:39:08 字數 1592 閱讀 7246

眾所周知,why 是czyz 王國的國王。

czyz 王國一共有n 個城市,每個城市都有一條道路連向乙個城市(可能連向這個城市自己)。

同時,對於每乙個城市,也只有一條道路連向它。

如果乙個人可以通過道路可以從城市x 走向城市y,那麼我們稱(x,y) 這

個數對是滿足條件的。(x 可以等於y)

現在why 可以選擇2 個城市改變他們連向的道路,且改變完成之後也要滿足上述的條件。

why 想知道,經過這個操作後,最多能有多少滿足條件的數對。

第一行包括乙個整數n, 表示城市數。

第二行包括n 個整數a[i],表示i 有一條道路連向a[i]。

輸出一行乙個整數,表示最多能得到多少滿足條件的數對。

input1

input2

2 1 3

1 5 4 3 2

output1

output2 917

對於樣例1,不需要改變,每兩個城市之間可以相互到達,ans=3*3=9。

對於樣例2,change a[2] to 4, a[3] to 5。

對於20% 的資料滿足:n ≤ 10。

對於50% 的資料滿足:n ≤ 100。

對於70% 的資料滿足:n ≤ 1000。

對於100% 的資料滿足:n ≤ 10^6, 1 ≤ a[i] ≤ n。

這道題真沒想到會超時呢

#includeusing

namespace

std;

intn;

int a[1000000

];bool flag[1000000

];int xfindy(int x,int y,int depth)

int count(int

start)

intmain()

//特判:完美的環

if(count(n-2)==n)

//把兩個最大的環合併

//for(int i=1;i<=n;i++)

long

long ans=0,max1=-0x3f3f3f,max2=max1,city1=-1,city2=-1

;

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

} for(int i=1;i<=n;i++)

} memset(flag,

0,sizeof

(flag));

flag[

0]=1

;

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

ans+=pow(max1+max2,2

); cout

}

把互相連著的城市分開一條邊,而形成乙個環

連通性問題?

如果形成了乙個完整的環,那麼ans=n^2

如果沒有呢?

如果兩步之內,不能夠形成完美的環呢?

兩步,可以把兩個環合併!

優先把本身環大的city指向另乙個有大環的city,而不是指向少數city圍成的環

檢測有沒有指向自己的環

再檢測環city小的環 

牛客提高D6t2 破碎的序列

分析 我們不難發現對於偶數的情況只要相鄰兩個數不相等即可 而對於奇數的情況只要中間恰好隔乙個數的兩個數不相等即可 於是我們又dp i 0 1 表示考慮到第i位,這一位和它後面離它最近的乙個確定的數是否相等 每次從i 1轉移即可 注意對於奇數的情況最終答案要n 1和n的dp值相乘以保證合法 inclu...

嵊州D5T2 摺紙 folding

問題描述 在非常緊張的 noip 考試中,有人喜歡啃指甲,有人喜歡轉鉛筆,有人喜歡撕 紙條,而小 x 喜歡迷摺紙。現有乙個 w h 的矩形紙張,監考老師想知道,小 x 至少要折多少次才能使 矩形紙張變成 w h 的矩形紙張。注意,每次的摺痕都要平行於紙張的某一條邊。輸入格式 第一行包括兩個整數 w,...

嵊州普及Day2T2

題意 對於n個數的數列,進行排列,求第m個大於此數列的數列。思路 查詢後2個是否逆序,若是,將後3個遞迴。如此運算,找後面大於此數中最小數交換,然後將後面數列順序排列。相對簡單。見 include include include include include using namespace std...