《省賽模擬賽補》

2022-06-19 19:57:11 字數 1785 閱讀 1566

c題:

比賽的時候已經想到了統計最底層的每個序列的出現次數,但是一開始想的是建圖之後dfs處理,但是發現很難處理出來。

其實正確的思路是拓撲排序去處理次數。

我們在最後建圖完成之後,倒著從n回去拓撲即可。

但是這裡有個坑點,就是一開始統計入度可能是不正確的。

例如:3(1 , 2), 4 (1 ,2),3是1,2的父節點,4是1,2的父節點,這樣的話,我們拓撲的時候1,2的入度就不可能減到2了,因為我們最終的序列是s4,所以我們只去考慮和4相關。

所以對於入度的統計,我們需要從終點bfs去重新計算入度,然後再拓撲即可。

這裡cnt忘開longlong被卡了一會。。

最後就是複雜度的證明:

可以發現,拓撲和bfs的複雜度顯然也就1e6左右,主要是可能會覺得最後map統計那裡會t,但是實際上,map統計那裡,我們只是進行了乙個對輸入的重新遍歷(加了個log的複雜度,還是很快的),如果輸入不會t,顯然這裡也不會。

(輸入怎麼可能會t~~)

#includeusing

namespace

std;

typedef

long

long

ll;typedef pair

pii;

const

int n = 1e6+5

;const

int m = 1e6+5

;const ll mod = 1e9+7

;#define rg register

#define pi acos(-1)

#define inf 1e18

#define ct0 cin.tie(0),cout.tie(0)

#define io ios::sync_with_stdio(false)

#define dbg(ax) cout << "now this num is " << ax << endl;

namespace

fastio

while(c >= '

0' && c <= '9')

return x*f;

}void print(int

x)

if(x > 9) print(x/10

); putchar(x%10+'0'

); }

}using

namespace

fastio;

vector

a[n],g[n];

intvis[n],id[n];

ll cnt[n],

in[n];

void bfs(int

n) }

}void solve(int

n) }

unordered_map

mp;ll mx = -1,sum = 0

;

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

}ll ma = sum -mx;

printf(

"%lld\n

",mx <= ma ? sum : ma * 2);}

intmain()

}else

}bfs(n);

solve(n);

}

system(

"pause");

return0;

}/*44

1 2 2 2

1 2 2 4

2 1 2

2 1 2

*/

view code

2015 8 13 省賽模擬總結

今天的比賽反應了我的許多問題。首先是策略不太對 我看完第一題後,感覺這道題很難實現。還有第三題,看完後感覺暴力也很難打 後來才知道這是個很水的題 於是把時間都花在第 二 四題上。接著是時間分配不對 我把前半部分的時間花在想第四題的正解上。雖然正解算出來了,但是我檢查時遺漏了一點。後半部分時間則花在了...

2015 8 19省賽模擬總結

首先,我必須orz一下某個在提高組ak,然後來省賽組虐場的犇。這場比賽難度實在較大,三道題一共拿10分也不算失常吧。但是題目描述也誤導了我們,我也有一些不足的地方 1.被冒進的想法所困擾。我看完第二題,開始的時候以為是水題,就花了很多時間去想正解,但是越想越發現這題的困難。2.時間分配不均。把太多時...

2015 12 19省賽模擬總結

這次做的是heoi2013的原題,只拿了20分,比賽中我出了一些問題。首先是第一題,沒有理解錯題意。很快就想到了正解 主席樹,其實可以打可持續化trie 但是在找最大值的時候,少考慮了一點,也沒有打對拍,就去想第二題了。於是沒有得分。第二題我被方向的問題困擾 有方向就比較難統計最後的答案 於是最後交...