Submission #1003298

#TimeUsernameProblemLanguageResultExecution timeMemory
1003298vjudge1Subtree (INOI20_subtree)C++17
50 / 100
2062 ms30976 KiB
#include <bits/stdc++.h> using namespace std; const int N=1e5+10; vector<int> g[N]; vector<int> bridges[N]; vector<int> notBridges[N]; int add[N], depth[N]; bool vis[N]; vector<vector<int>> cycles; int getCycle[N]; void dfsAdd(int at, int p) { vis[at]=1; for(int to:g[at]) { if(to==p)continue; if(vis[to] == 1) { if(depth[at] > depth[to]) { add[at]++; add[to]--; notBridges[to].push_back(at); notBridges[at].push_back(to); } continue; } depth[to]=depth[at]+1; dfsAdd(to, at); } } void dfsGetBridges(int at, int p) { vis[at]=1; for(int to:g[at]) { if(vis[to])continue; dfsGetBridges(to, at); add[at]+=add[to]; } if(p==0)return; if(add[at] == 0) { bridges[at].push_back(p); bridges[p].push_back(at); } else { notBridges[at].push_back(p); notBridges[p].push_back(at); } } vector<int> tempcycle; void dfsGetCycles(int at) { tempcycle.push_back(at); vis[at]=1; for(int to:notBridges[at]) { if(vis[to])continue; dfsGetCycles(to); } } long long dp[N], tmpdp[N]; const long long mod = 1e9+7; long long ans=0; void dfsCalc(int c, int cc) { vis[c]=1; for(int at:cycles[c]) { dp[at]=1; for(int to:g[at]) { if(!vis[getCycle[to]]) { dfsCalc(getCycle[to], to); dp[at] = (dp[at]*(dp[to]+1))%mod; assert(dp[to]!=0); } } } if(cycles[c].size()==1){ ans+=dp[cycles[c][0]]; ans%=mod; return; } for(int i = 0;i<cycles[c].size();i++) { long long prod = 1; int k =i; int idx=-1, cnt=0; int sz=0; while(1) { sz++; if(sz == cycles[c].size())break; if(cycles[c][k] == cc) { idx=cnt; } prod = (prod*dp[cycles[c][k]])%mod; ans=(ans+prod)%mod; if(idx != -1) { tmpdp[cc]=(tmpdp[cc]+prod)%mod; } k=(k+1)%cycles[c].size(); } } for(int i:cycles[c]) { dp[i]=tmpdp[i]; } } int main () { cin.tie(0)->sync_with_stdio(0); int n, m; cin >> n >> m; for(int i = 0;i<m;i++) { int u, v; cin >> u >> v; g[u].push_back(v); g[v].push_back(u); } dfsAdd(1, 0); memset(vis, 0, sizeof vis); dfsGetBridges(1, 0); memset(vis, 0, sizeof vis); for(int i = 1;i<=n;i++) { if(vis[i] == 0) { dfsGetCycles(i); for(int c:tempcycle) { getCycle[c] = cycles.size(); } cycles.push_back(tempcycle); tempcycle.clear(); } } memset(vis, 0, sizeof vis); dfsCalc(0, -1); cout << ans%mod << "\n"; }

Compilation message (stderr)

Main.cpp: In function 'void dfsCalc(int, int)':
Main.cpp:76:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   76 |   for(int i = 0;i<cycles[c].size();i++) {
      |                 ~^~~~~~~~~~~~~~~~~
Main.cpp:83:13: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   83 |       if(sz == cycles[c].size())break;
      |          ~~~^~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...