jzoj5840 Miner 題解 尤拉路

2022-03-16 16:46:48 字數 1267 閱讀 8968

首先考慮第一問。每個聯通塊的情況是相對獨立的,所以可以分別求每個聯通塊的答案。無向圖中存在尤拉路的條件是奇點數為0或2,那麼合法方案肯定是tp到乙個奇點,通過一條尤拉路到另乙個奇點,再tp到另乙個奇點……

設共k個聯通塊,第$i$個裡奇點個數為$c_i$,那麼答案即為$\sum_^k max(1,\frac c2)-1$,最後-1是因為選起點不用浪費傳送次數。

關於構造方案,我們先對於每個聯通塊求它內部的奇點。如果沒有的話直接跑尤拉路即可。

如果有奇點,那麼必有偶數個,因為每個聯通塊的點的度數之和必為偶數。可以新建乙個源點,向所有奇點連邊,再跑尤拉路。

最後的方案輸出:

如果從源點到某個點,那這個點一定是奇點,操作為1 x。

從某個點跑到源點,顯然不用管。

從點x跑到點y,操作為0 y。

另外,寫暴力圈套圈的尤拉路演算法還是要用非遞迴版的,直接dfs有可能爆棧也可能直接t掉(遞迴很慢)。

#include#include#include#define pa pairusing namespace std;

int read()

while(isdigit(ch))

return x*f;

}const int n=1e5+5;

int n,m;

int to[n*10],nxt[n*10],head[n],tot=1,deg[n];

int st[n*10],top,vis[n],v[n*10];

int ans=0,cnt;

pa res[n*10];

void add(int x,int y)

void dfs(int x)

int syst[n*10],systop;

void euler()

else systop--,st[++top]=x;

}}int main()

int ans=0;

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

;euler();

int now;

while(top>1)}}

printf("%d\n%d\n",ans-1,res[1].second);

for(int i=2;i<=cnt;i++)

printf("%d %d\n",res[i].first,res[i].second);

return 0;

}

JZOJ 8 15比賽 題解

第一題 icow 剛看這題的時候覺得要用快排,但其實不用。我們只須將每次經過題目要求改變的r陣列中的最大值輸出即可,並按照題目要求改變r陣列。第二題 化妝晚會 我們可以用頭尾指標來做這道題。首先將大於s的l i 賦值為0,再將l陣列中沒有為0的值按照從小到大快排一下,再用while迴圈列舉頭尾指標,...

題解 JZOJ 1355 珍珠分對

作為生日禮物,bessie得到了n 2 n 100,000 n 2 0 顆 假?珍珠,每顆珍珠的顏色為c種顏色之一 1 c n bessie發現n是乙個偶數,她想把所有珍珠分成n 2對,使得每對的兩顆珍珠的顏色都不同.bessie知道這樣乙個分配在給定資料裡都是可能的,請幫助她找到這樣乙個分配.如果...

題解 JZOJ 1352 遊蕩的奶牛

奶牛們在被劃分成n行m列 2 n 100 2 m 100 的草地上游走,試圖找到整塊草地中最美味的牧草。farmer john在某個時刻看見貝茜在位置 r1,c1 恰好t 0 t 15 秒後,fj又在位置 r2,c2 與貝茜撞了正著。fj並不知道在這t秒內貝茜是否曾經到過 r2,c2 他能確定的只是...