제출 #159009

#제출 시각아이디문제언어결과실행 시간메모리
159009arnold518철인 이종 경기 (APIO18_duathlon)C++14
10 / 100
162 ms38796 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int, int> pii; typedef pair<ll, ll> pll; const int MAXN = 1e5; int N, M; vector<int> adj[MAXN+10]; int idx[MAXN+10], low[MAXN+10], cnt; ll ans; void dfs(int now, int bef) { idx[now]=low[now]=++cnt; for(auto nxt : adj[now]) { if(nxt==bef) continue; if(!idx[nxt]) { dfs(nxt, now); low[now]=min(low[now], low[nxt]); } else { low[now]=min(low[now], idx[nxt]); } } } bool vis[MAXN+10]; int sz[2*MAXN+10]; vector<int> bcc[MAXN+10], adj2[MAXN+10]; int ccnt; void color(int now, int col) { if(col) { bcc[now].push_back(col); sz[col]++; } vis[now]=true; for(int nxt : adj[now]) { if(vis[nxt]) continue; if(idx[now]<=low[nxt]) { ccnt++; bcc[now].push_back(ccnt); sz[ccnt]++; color(nxt, ccnt); } else { color(nxt, col); } } } bool vis2[2*MAXN+10]; void dfs2(int now) { vis2[now]=true; for(auto nxt : adj2[now]) { if(vis2[nxt]) continue; dfs2(nxt); sz[now]+=sz[nxt]; } //printf("!%d %d\n", now, sz[now]); } void dfs3(int now, int bef) { ll sum=0, val=0; for(int nxt : adj2[now]) { if(nxt==bef) continue; sz[now]-=sz[nxt]; sz[nxt]+=sz[now]; dfs3(nxt, now); sz[nxt]-=sz[now]; sz[now]+=sz[nxt]; } for(int nxt : adj2[now]) { val-=(ll)sz[nxt]*sz[nxt]; sum+=sz[nxt]; //printf("!!!!%d / %d %d\n", now, nxt, sz[nxt]); } val+=sum*sum; //printf("%d %lld %lld\n", now, val, sum); if(now>N) ans+=val; else ans+=(sz[now]-sum)*val+2*(sz[now]-sum)*((sum-adj2[now].size())*(sz[now]-sum-1)+(sum-adj2[now].size())*(adj2[now].size()-1));//, printf("WOW %d %lld %lld\n", now, (sz[now]-sum)*val, 2*(sz[now]-sum)*((sum-adj2[now].size())*(sz[now]-sum-1)+(sum-adj2[now].size())*(adj2[now].size()-1))); } int main() { int i, j; scanf("%d%d", &N, &M); for(i=1; i<=M; i++) { int u, v; scanf("%d%d", &u, &v); adj[u].push_back(v); adj[v].push_back(u); } for(i=1; i<=N; i++) { if(vis[i]) continue; dfs(i, i); color(i, 0); } for(i=1; i<=N; i++) { if(bcc[i].size()>1) { for(auto j : bcc[i]) adj2[i+N].push_back(j), adj2[j].push_back(i+N); sz[i+N]=1; } } for(i=1; i<=ccnt; i++) ans+=(ll)(sz[i])*(sz[i]-1)*(sz[i]-2); //printf("ANS %lld\n", ans); for(i=1; i<=ccnt; i++) sz[i]-=adj2[i].size(); /* for(i=1; i<=2*N; i++) { printf("%d : (%d)", i, sz[i]); for(auto j : adj2[i]) printf("%d ", j); printf("\n"); } */ for(i=1; i<=ccnt; i++) { if(vis2[i]) continue; dfs2(i); dfs3(i, i); } printf("%lld", ans); }

컴파일 시 표준 에러 (stderr) 메시지

count_triplets.cpp: In function 'int main()':
count_triplets.cpp:104:12: warning: unused variable 'j' [-Wunused-variable]
     int i, j;
            ^
count_triplets.cpp:106:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d", &N, &M);
     ~~~~~^~~~~~~~~~~~~~~~
count_triplets.cpp:110:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d", &u, &v);
         ~~~~~^~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...