Submission #635429

#TimeUsernameProblemLanguageResultExecution timeMemory
635429NothingXDSubtree (INOI20_subtree)C++17
100 / 100
98 ms25012 KiB
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef long double ld; typedef pair<int,int> pii; typedef pair<ll,ll> pll; void debug_out() { cerr << endl; } template <typename Head, typename... Tail> void debug_out(Head H, Tail... T) { cerr << " " << H; debug_out(T...); } #define debug(...) cerr << "(" << #__VA_ARGS__ << "):", debug_out(__VA_ARGS__) #define all(x) x.begin(), x.end() #define MP(x, y) make_pair(x, y) #define F first #define S second const int maxn = 1e5 + 10; const int mod = 1e9 + 7; int n, m, dp[maxn][4], h[maxn], par[maxn]; vector<int> g[maxn], ver[maxn]; bool vis[maxn]; int getpar(int v){ return (par[v] < 0? v: par[v] = getpar(par[v])); } void merge(int u, int v){ if ((u = getpar(u)) == (v = getpar(v))) return; if (par[u] > par[v]) swap(u, v); par[u] += par[v]; par[v] = u; } int dfs(int v, int p = -1){ vis[v] = true; int mn = h[v]; for (auto u: g[v]){ if (!vis[u]){ h[u] = h[v] + 1; mn = min(mn, dfs(u, v)); } if (u != p){ mn = min(mn, h[u]); } } if (mn < h[v]){ merge(v, p); } return mn; } int add(int x, int y){ int res = x + y; if (res >= mod) return res - mod; if (res < 0) return res + mod; return res; } int mul(int x, int y){ return 1ll * x * y % mod; } bool cmp(int x, int y){ return h[x] < h[y]; } // dp[v][0] = ans // dp[v][1] = bedone dost // dp[v][2] = fagat dost khodet nisti // dp[v][3] = dost hast khodet hasti bagie ham mitunan bashan void solve(int v, int p = -1){ vis[v] = true; dp[v][0] = dp[v][1] = dp[v][3] = 1; bool flg = false; for (auto u: g[v]){ if (!vis[u]){ solve(u, v); if (getpar(u) == getpar(v)){ dp[v][0] = mul(dp[v][0], dp[u][0] + 1); dp[v][3] = mul(dp[v][3], dp[u][3]); dp[v][2] = add(dp[u][2], dp[u][3]); } else{ dp[v][0] = mul(dp[v][0], dp[u][0] + 1); dp[v][1] = mul(dp[v][1], dp[u][0] + 1); dp[v][3] = mul(dp[v][3], dp[u][0] + 1); } } else if (u != p && h[u] > h[v]){ flg = true; } } if (flg){ int tmp = getpar(v); sort(all(ver[tmp]), cmp); int k = dp[v][1]; for (int i = 1; i < ver[tmp].size(); i++){ dp[v][0] = add(dp[v][0], mul(k, dp[ver[tmp][i]][2])); k = mul(k, dp[ver[tmp][i]][1]); } dp[v][0] = add(dp[v][0], -k); } } int main(){ ios_base::sync_with_stdio(false); cin.tie(0); memset(par, -1, sizeof par); cin >> n >> m; for (int i = 1; i <= m; i++){ int u, v; cin >> u >> v; g[u].push_back(v); g[v].push_back(u); } dfs(1); for (int i = 1; i <= n; i++){ int tmp = getpar(i); ver[tmp].push_back(i); } memset(vis, false, sizeof vis); solve(1); int ans = 0; for (int i = 1; i <= n; i++) ans = add(ans, dp[i][0]); cout << ans << '\n'; return 0; }

Compilation message (stderr)

Main.cpp: In function 'void solve(int, int)':
Main.cpp:106:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  106 |   for (int i = 1; i < ver[tmp].size(); i++){
      |                   ~~^~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...