답안 #732811

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
732811 2023-04-29T10:11:51 Z sentheta 철인 이종 경기 (APIO18_duathlon) C++17
0 / 100
160 ms 20668 KB
// author : sentheta aka vanwij
#include<iostream>
#include<iomanip>
#include<algorithm>
#include<cassert>
#include<random>
#include<chrono>
#include<cmath>
#include<string>
#include<vector>
#include<bitset>
#include<queue>
#include<stack>
#include<map>
#include<set>
using namespace std;

#define Int long long
#define V vector
#define pii pair<int,int>
#define ff first
#define ss second

mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());

#define pow2(x) (1LL<<(x))
#define msb(x) (63-__builtin_clzll(x))
#define bitcnt(x) (__builtin_popcountll(x))

#define nl '\n'
#define _ << ' ' <<
#define all(x) (x).begin(), (x).end()
#define rep(i,a,b) for(int i = (int)(a); i < (int)(b); i++)
#define dbg(x) if(0) cout << "?" << #x << " : " << (x) << endl << flush;

#define int long long
// const Int MOD = 1e9+7;
const Int MOD = 998244353;
Int bpow(Int a,Int b){
	Int ret = 1;
	for(;b; a=a*a%MOD,b/=2) if(b&1) ret = ret*a%MOD;
	return ret;
}
Int inv(Int a){return bpow(a,MOD-2);}

void solve(); int TC, ALLTC;
signed main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	srand(chrono::steady_clock::now().time_since_epoch().count());
	cout << fixed << setprecision(7);
	// cin >> ALLTC; for(TC=1; TC<=ALLTC; TC++) solve(); return 0;
	solve();
}





const int N = 1e5+5;
const int M = 2e5+5;

int n, m;
pii edg[M];
V<int> adj[N];

bool bg[M];
int t[N], up[N], tim=0;
void dfs_bridge(int x=1,int par=-1){
	up[x] = t[x] = ++tim;

	for(int e : adj[x]){
		int y = edg[e].ff^edg[e].ss^x;
		if(y==par) continue;

		if(t[y]==-1){
			dfs_bridge(y, x);
		}
		up[x] = min(up[x],up[y]);

		if(up[y] > t[x]){
			bg[e] = 1;
			// cout << x _ y << nl;
		}
	}
}

int sz[N];
struct Dsu{
	int p[N];
	Dsu(){
		reset();
	}
	void reset(){
		rep(i,0,N) p[i]=i, sz[i]=1;
	}
	int find(int x){
		return p[x]==x ? x : p[x]=find(p[x]);
	}
	void unite(int x,int y){
		if((x=find(x))==(y=find(y))) return;
		p[y] = x;
		sz[x] += sz[y];
	}
} dsu;

V<int> cadj[N];
int ans = 0;

bool vis[N];
void dfs_dp(int x,int par=-1){
	vis[x] = 1;
	int orisz = sz[x];
	for(int y : cadj[x]) if(y!=par){
		dfs_dp(y, x);
		sz[x] += sz[y];
	}

	dbg(x);
	dbg(orisz);
	dbg(sz[x]);

	// S,C,T in this component
	ans += orisz *(orisz-1) *(orisz-2);
	dbg(orisz *(orisz-1) *(orisz-2));

	// S,C in this component
	// C,T in this component
	// if C is entry point
	ans += 2 *(orisz-1) *1 *(n-orisz);
	// if C is not entry point
	ans += 2 *(orisz-2) *(orisz-1) *(n-orisz);
	// dbg(2 *(orisz-1) *(orisz-1) *(n-orisz));


	// C is LCA
	// C in this component, S from a child, T from other child
	for(int y : cadj[x]) if(y!=par){
		ans += orisz *sz[y] *(sz[x]-1-sz[y]);
		dbg(orisz *sz[y] *(sz[x]-1-sz[y]));
	}

	// C is not LCA
	// C in this component, S from a child, T from parent
	// C in this component, T from a child, C from parent
	ans += 2 *orisz *(sz[x]-orisz) *(n-sz[x]);
	dbg(2 *orisz *(sz[x]-orisz) *(n-sz[x]));

	dbg(ans);
	// cout << nl;
}

void solve(){
	
	cin >> n >> m;
	
	rep(e,1,m+1){
		int u, v;
		cin >> u >> v;

		edg[e] = {u,v};
		adj[u].push_back(e);
		adj[v].push_back(e);
	}
	

	rep(i,1,n+1) t[i] = -1;
	dfs_bridge();

	rep(e,1,m+1) if(!bg[e]){
		auto[x,y] = edg[e];
		dsu.unite(x,y);
	}
	rep(e,1,m+1) if(bg[e]){
		auto[x,y] = edg[e];
		x = dsu.find(x);
		y = dsu.find(y);

		cadj[x].push_back(y);
		cadj[y].push_back(x);
	}

	rep(i,1,n+1) if(i==dsu.find(i) && !vis[i]){
		dfs_dp(dsu.find(i));
	}
	cout << ans << nl;
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 4 ms 6484 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 4 ms 6484 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 116 ms 20668 KB Output is correct
2 Correct 109 ms 20556 KB Output is correct
3 Incorrect 91 ms 16752 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 6612 KB Output is correct
2 Correct 4 ms 6728 KB Output is correct
3 Correct 5 ms 6612 KB Output is correct
4 Correct 5 ms 6744 KB Output is correct
5 Correct 4 ms 6676 KB Output is correct
6 Correct 5 ms 6724 KB Output is correct
7 Correct 4 ms 6740 KB Output is correct
8 Correct 7 ms 6740 KB Output is correct
9 Correct 4 ms 6612 KB Output is correct
10 Incorrect 6 ms 6580 KB Output isn't correct
11 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 131 ms 17356 KB Output is correct
2 Correct 133 ms 17404 KB Output is correct
3 Correct 134 ms 17368 KB Output is correct
4 Correct 160 ms 17388 KB Output is correct
5 Correct 130 ms 17388 KB Output is correct
6 Correct 147 ms 20432 KB Output is correct
7 Correct 156 ms 19948 KB Output is correct
8 Correct 148 ms 19212 KB Output is correct
9 Correct 113 ms 18460 KB Output is correct
10 Incorrect 72 ms 15860 KB Output isn't correct
11 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 6612 KB Output is correct
2 Correct 6 ms 6700 KB Output is correct
3 Incorrect 6 ms 6704 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 131 ms 17392 KB Output is correct
2 Correct 126 ms 17152 KB Output is correct
3 Incorrect 125 ms 16448 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 4 ms 6484 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 4 ms 6484 KB Output isn't correct
2 Halted 0 ms 0 KB -