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~~)
#includeusingview codenamespace
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
*/
2015 8 13 省賽模擬總結
今天的比賽反應了我的許多問題。首先是策略不太對 我看完第一題後,感覺這道題很難實現。還有第三題,看完後感覺暴力也很難打 後來才知道這是個很水的題 於是把時間都花在第 二 四題上。接著是時間分配不對 我把前半部分的時間花在想第四題的正解上。雖然正解算出來了,但是我檢查時遺漏了一點。後半部分時間則花在了...
2015 8 19省賽模擬總結
首先,我必須orz一下某個在提高組ak,然後來省賽組虐場的犇。這場比賽難度實在較大,三道題一共拿10分也不算失常吧。但是題目描述也誤導了我們,我也有一些不足的地方 1.被冒進的想法所困擾。我看完第二題,開始的時候以為是水題,就花了很多時間去想正解,但是越想越發現這題的困難。2.時間分配不均。把太多時...
2015 12 19省賽模擬總結
這次做的是heoi2013的原題,只拿了20分,比賽中我出了一些問題。首先是第一題,沒有理解錯題意。很快就想到了正解 主席樹,其實可以打可持續化trie 但是在找最大值的時候,少考慮了一點,也沒有打對拍,就去想第二題了。於是沒有得分。第二題我被方向的問題困擾 有方向就比較難統計最後的答案 於是最後交...