國王飲水記 題解

2021-10-10 01:44:10 字數 1618 閱讀 8096

題目傳送門

step1:暴力

對於每次詢問,都進行一次krusal計算。

#include

#include

#define maxn 5039

using

namespace std;

inline

intread()

if(flag)

return

-sum;

return sum;

}struct jtz

}e[maxn]

;int f[maxn]

;int n,m;

intgetfa

(int x)

void

getans

(int x)

}int tmp=

getfa(1

),ans=0;

for(

int i=

1;i<=n;i++)if

(getfa

(i)==tmp)

ans++

;printf

("%d %d\n"

,sum,ans);}

intmain()

return0;

}

step 2:優化

將排序改為 o(l

ogn+

n)

o\left(log_n+n\right)

o(logn

​+n)

的二分查詢,但是分數怎麼變少了啊

#include

#include

#define maxn 5039

using

namespace std;

inline

intread()

if(flag)

return

-sum;

return sum;

}struct jtze[maxn]

;int f[maxn]

;int n,m;

intgetfa

(int x)

void

getans

(int x)

}int tmp=

getfa(1

),ans=0;

for(

int i=

1;i<=n;i++)if

(getfa

(i)==tmp)

ans++

;printf

("%d %d\n"

,sum,ans);}

intmain()

jtz tmp=e[i]

;for

(int j=i-

1;j>=l+

1;j--

) e[j+1]

=e[j]

; e[l+1]

=tmp;

getans

(i);

}return0;

}

step3:未完成

將輸入的一條邊進行判斷:

如果兩點不連通,那麼就連起來。

如果兩條邊連起來能減小生成樹的邊權值,那就連起來,否則就不連。

**略。

NOI2016 國王飲水記

首先,我們一定可以捨去那些高度比 h 1 還小的城市,並且將剩餘的高度比 h 1 大的城市排序,使得 h 1 到 h n 遞增。我們不妨從三座城市想起。假如可以合併兩次,應該怎麼合併?先合併 1,2 再合併 2,3 因為這樣更多的水被貢獻給了 1 對吧?由此我們得出了第乙個obeservation ...

小C飲水記

小c雖然沒有參加noi2016,但當他看到 國王飲水記 這題時還是迅速秒掉了.小c認為這題太水了,於是他決定對這題進行加強.現在小c桌上有n杯水排成一行,第i杯水中有wi 單位體積的水.他會選擇乙個區間 l,r 並拿乙個初始為空的杯子 杯子的容積無限大 他可以重複無限次以下操作 選定任意一杯水i,i...

國王的魔鏡 題解

1.判斷是否是回文字串 當然,如果這個數的長度是基數,那麼無法擷取,退出迴圈 不是就退出迴圈 2.那麼擷取它的一半,重複第1條 注 判斷回文時可以用reverse,具體用法請看此 reverse詳細用法 本題洛谷 希望蒟蒻的題解能對看官有幫助 別忘記點讚 關注,謝謝!code c 1 include...