題目
吉老師的題時過一年還是不會做
從\(1\)號點出發經過每條邊至少一次並且還要回到\(1\)號點,這跟尤拉迴路的條件非常像,但是尤拉迴路的實際上是"經過每一條邊恰好一次並且回到出發點"
所以可以理解為將每一條邊拆成多條邊,使得總邊權和最小,並且圖中存在一條尤拉迴路
而一張圖存在尤拉迴路的條件是不存在度數為奇數的點
換句話說,給每條邊定乙個經過次數\(cnt_i\),最小化\(\sum_^mcnt_i2^i\),並且使得每個點的所連邊的\(cnt\)的和為偶數
看起來不是很可做,但是這裡的邊都是\(2\)的次冪,這啟示我們貪心
我們考慮對原圖求出一棵最小生成樹,這樣對於每一條非樹邊,我們都能使得其被經過次數為\(1\)。這只需要去最小生成樹上把這條非樹邊連線的兩個點的路徑都走一遍即可,因為這條路徑上最大的二進位制位都要小於這條非樹邊,所以形成的和也要小於這條邊。
之後在最小生成樹上做一些調整使得所有點度數都是偶數即可。
先預設所有的邊的\(cnt=1\),統計出每個點的度數,之後dfs最小生成樹,發現有乙個點度數為奇數就讓它和它父親連線的那條邊的\(cnt\)加一。可以證明,所有點的度數最後一定都會變成偶數。
**
#include#define re register
inline int read()
const int maxn=5e5+5;
const int mod=998244353;
struct ee[maxn<<1];
int n,m,num,ans,d[maxn],fa[maxn],head[maxn];
int find(int x)
inline int qm(int x)
inline void add(int x,int y,int w)
void dfs(int x,int fa,int p)
int main()
dfs(1,0,0);printf("%d\n",ans);
return 0;
}
牛客提高訓練營2B 分糖果
題目 發現自己一年之前非常垃圾 題目大意是給你乙個 n 個點的環,給每個點乙個 1,a i 的取值,並且滿足環上任意相連兩點權值不能相等,求方案數 考慮斷環為鏈,發現不大會 不妨考慮所有 a i 均相等的情況,設 m a i 對於第乙個點,有 m 種選擇,其後每乙個點的取值都不能和上乙個相等,即 m...
牛客提高訓練營5A 同餘方程
題目 吉老師的題做不動啊 首先 l 1,r 1 l 2,r 2 並不是非常好做,我們考慮將其拆成字首資訊 設 solve n,m sum n sum m m i bigoplus j 於是我們的答案就變成了 solve r 1,r 2 solve l 1 1,r 2 solve r 1,l 2 1 ...
牛客寒假訓練營5 F
題目傳送門 又到了開心的2小時過6題三小時卡一題的環節 太菜了 qwq 這一切一切的原因是什麼呢?ta這個小 zhi 機 zhang 靈 er 鬼 tong 把這句話看丟了 首 du 見 cuo 這道題的ta就很興奮的認為這不就是乙個組合數嘛 然後就寫了半天組合數 對dp的敏銳程度還不夠 寫組合數就...