題目傳送門
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...