답안 #61415

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
61415 2018-07-25T21:37:22 Z kingpig9 철인 이종 경기 (APIO18_duathlon) C++11
66 / 100
338 ms 52700 KB
#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 + 10;
 
//#define debug(...) fprintf(stderr, __VA_ARGS__)
#define debug(...)
#define fi first
#define se second
#define all(v) (v).begin(), (v).end()
#define fillchar(a, s) memset((a), (s), sizeof(a))
 
ll sqr (ll x) {
	return x * x;
}
 
struct union_find {
	int par[MAXN];
	int sz[MAXN];
	union_find() {
		for (int i = 0; i < MAXN; i++) {
			par[i] = i;
			sz[i] = 1;
		}
	}
 
	int find (int x) {
		return x == par[x] ? x : par[x] = find(par[x]);
	}
 
	void merge (int x, int y) {
		x = find(x);
		y = find(y);
		if (x == y) {
			return;
		}
		par[x] = y;
		sz[y] += sz[x];
	}
};
 
int N, M;
vector<int> adj[MAXN];
vector<int> verts;
int par[MAXN], depth[MAXN];
bool vis[MAXN];
union_find uf = union_find();
union_find cy = union_find();	//cycle components
 
void dfs (int x, int p) {
	debug("x = %d\n", x);
	verts.push_back(x);
	vis[x] = true;
	par[x] = p;
 
	for (int y : adj[x]) {
		if (y != p) {
			if (vis[y]) {
				if (depth[y] < depth[x]) {
					//then it's a component
					for (int i = x; ; i = par[i]) {
						cy.merge(x, i);
						debug("merge(%d, %d)\n", x, i);
						if (i == y) {
							break;
						}
					}
				}
			} else {
				depth[y] = depth[x] + 1;
				dfs(y, x);
			}
		}
	}
}
 
vector<int> cadj[MAXN];	//comp adjacent
int cpar[MAXN];
int sub[MAXN];
vector<int> cverts;
vector<int> cyv[MAXN];
 
void dfsc (int x) {
	cverts.push_back(x);
	sub[x] = cy.sz[x];
	for (int y : cadj[x]) {
		cpar[y] = x;
		cadj[y].erase(find(all(cadj[y]), x));
		dfsc(y);
		sub[x] += sub[y];
	}
}
 
ll go (int root) {
	dfs(root, 0);
	for (int x : verts) {
		int fx = cy.find(x);
		cyv[fx].push_back(x);
		for (int y : adj[x]) {
			int fy = cy.find(y);
			if (fx != fy) {
				cadj[fx].push_back(fy);
				debug("CADJ %d %d\n", fx, fy);
			}
		}
	}
 
	int szroot = uf.sz[root];
	int froot = cy.find(root);
	dfsc(froot);
 
	//ok let's consider when the stuff is good!
	ll ans = 0;
 
	debug("WE HAVE szroot = %d\n", szroot);
	for (int c : cverts) {
		debug("--------COMPONENT OF %d----------------\n", c);
		//all 3 are in the same component
		ll s = cy.sz[c];
		ans += s * (s - 1) * (s - 2);
		debug("s = %lld\n", s);
 
		//all 3 are in different component. c is the transition.
		//also have to count individual ones
		ll pans = ans;
		ll totsb = 0;
		ll ncho2 = 0;
 		for (int x : cyv[c]) {
			ll sumsb = 0;
			for (int y : adj[x]) {
				int fy = cy.find(y);
				if (c != fy) {
					ll sb;
					if (fy == cpar[c]) {
						sb = szroot - sub[c];
					} else {
						sb = sub[fy];
					}
					ans -= sqr(sb);
					sumsb += sb;
				}
			}
			ans += sqr(sumsb);
			ncho2 -= sqr(sumsb);
			totsb += sumsb;
		}

		assert(totsb == szroot - s);
		ncho2 += sqr(totsb);
		ans += ncho2 * s;
		debug("all3indiff = %lld\n", ans - pans);
 
		//the stuff right below this comment is actually wrong.
		/*
		//two of them are in this component. one of them is in different component
		debug("s = %lld. szroot = %d. So we add %lld\n", s, szroot, 2 * s * (s - 1) * (szroot - s));
		ans += 2 * s * (s - 1) * (szroot - s);	//ans += 4 * C(s, 2) * (szroot - s)
		*/
 
		//ok now this may be correct...
		ans += 2 * s * (s - 1) * (szroot - s);	//ans += 4 * C(s, 2) * (szroot - s)
		ans -= 2 * (s - 1) * (szroot - s);
	}
 
#warning RESET AT THE END!
	verts.clear();
	cverts.clear();
	return ans;
}
 
int main() {
	scanf("%d %d", &N, &M);
	for (int i = 1; i <= M; i++) {
		int x, y;
		scanf("%d %d", &x, &y);
		adj[x].push_back(y);
		adj[y].push_back(x);
		uf.merge(x, y);
	}
 
	ll ans = 0;
	for (int i = 1; i <= N; i++) {
		if (i == uf.find(i)) {
			ans += go(i);
		}
	}
	printf("%lld\n", ans);
}

Compilation message

count_triplets.cpp:168:2: warning: #warning RESET AT THE END! [-Wcpp]
 #warning RESET AT THE END!
  ^~~~~~~
count_triplets.cpp: In function 'll go(int)':
count_triplets.cpp:128:6: warning: unused variable 'pans' [-Wunused-variable]
   ll pans = ans;
      ^~~~
count_triplets.cpp: In function 'int main()':
count_triplets.cpp:175:7: 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:178:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d", &x, &y);
   ~~~~~^~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 8952 KB Output is correct
2 Correct 10 ms 8980 KB Output is correct
3 Correct 11 ms 9008 KB Output is correct
4 Correct 11 ms 9012 KB Output is correct
5 Correct 12 ms 9040 KB Output is correct
6 Correct 9 ms 9116 KB Output is correct
7 Correct 10 ms 9160 KB Output is correct
8 Incorrect 13 ms 9288 KB Output isn't correct
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 8952 KB Output is correct
2 Correct 10 ms 8980 KB Output is correct
3 Correct 11 ms 9008 KB Output is correct
4 Correct 11 ms 9012 KB Output is correct
5 Correct 12 ms 9040 KB Output is correct
6 Correct 9 ms 9116 KB Output is correct
7 Correct 10 ms 9160 KB Output is correct
8 Incorrect 13 ms 9288 KB Output isn't correct
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 231 ms 27160 KB Output is correct
2 Correct 208 ms 27160 KB Output is correct
3 Correct 292 ms 27160 KB Output is correct
4 Correct 217 ms 27160 KB Output is correct
5 Correct 214 ms 27160 KB Output is correct
6 Correct 273 ms 27160 KB Output is correct
7 Correct 213 ms 27160 KB Output is correct
8 Correct 244 ms 27160 KB Output is correct
9 Correct 222 ms 27160 KB Output is correct
10 Correct 191 ms 27160 KB Output is correct
11 Correct 183 ms 27160 KB Output is correct
12 Correct 241 ms 27160 KB Output is correct
13 Correct 216 ms 27160 KB Output is correct
14 Correct 167 ms 27160 KB Output is correct
15 Correct 159 ms 27160 KB Output is correct
16 Correct 207 ms 27160 KB Output is correct
17 Correct 28 ms 27160 KB Output is correct
18 Correct 26 ms 27160 KB Output is correct
19 Correct 20 ms 27160 KB Output is correct
20 Correct 27 ms 27160 KB Output is correct
21 Correct 21 ms 27160 KB Output is correct
22 Correct 24 ms 27160 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 11 ms 27160 KB Output is correct
2 Correct 13 ms 27160 KB Output is correct
3 Correct 12 ms 27160 KB Output is correct
4 Correct 12 ms 27160 KB Output is correct
5 Correct 14 ms 27160 KB Output is correct
6 Correct 11 ms 27160 KB Output is correct
7 Correct 14 ms 27160 KB Output is correct
8 Correct 14 ms 27160 KB Output is correct
9 Correct 14 ms 27160 KB Output is correct
10 Correct 12 ms 27160 KB Output is correct
11 Correct 11 ms 27160 KB Output is correct
12 Correct 11 ms 27160 KB Output is correct
13 Correct 13 ms 27160 KB Output is correct
14 Correct 13 ms 27160 KB Output is correct
15 Correct 10 ms 27160 KB Output is correct
16 Correct 10 ms 27160 KB Output is correct
17 Correct 11 ms 27160 KB Output is correct
18 Correct 11 ms 27160 KB Output is correct
19 Correct 12 ms 27160 KB Output is correct
20 Correct 12 ms 27160 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 286 ms 27160 KB Output is correct
2 Correct 326 ms 27160 KB Output is correct
3 Correct 298 ms 27160 KB Output is correct
4 Correct 310 ms 27160 KB Output is correct
5 Correct 228 ms 27160 KB Output is correct
6 Correct 299 ms 33616 KB Output is correct
7 Correct 248 ms 33616 KB Output is correct
8 Correct 255 ms 33616 KB Output is correct
9 Correct 309 ms 33616 KB Output is correct
10 Correct 303 ms 33616 KB Output is correct
11 Correct 221 ms 33616 KB Output is correct
12 Correct 300 ms 33616 KB Output is correct
13 Correct 204 ms 33616 KB Output is correct
14 Correct 197 ms 33616 KB Output is correct
15 Correct 220 ms 33616 KB Output is correct
16 Correct 147 ms 33616 KB Output is correct
17 Correct 221 ms 33616 KB Output is correct
18 Correct 241 ms 33616 KB Output is correct
19 Correct 236 ms 33616 KB Output is correct
20 Correct 225 ms 33616 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 33616 KB Output is correct
2 Correct 11 ms 33616 KB Output is correct
3 Correct 11 ms 33616 KB Output is correct
4 Correct 13 ms 33616 KB Output is correct
5 Correct 14 ms 33616 KB Output is correct
6 Correct 12 ms 33616 KB Output is correct
7 Correct 12 ms 33616 KB Output is correct
8 Correct 14 ms 33616 KB Output is correct
9 Correct 14 ms 33616 KB Output is correct
10 Correct 14 ms 33616 KB Output is correct
11 Correct 15 ms 33616 KB Output is correct
12 Correct 13 ms 33616 KB Output is correct
13 Correct 14 ms 33616 KB Output is correct
14 Correct 15 ms 33616 KB Output is correct
15 Correct 12 ms 33616 KB Output is correct
16 Correct 13 ms 33616 KB Output is correct
17 Correct 11 ms 33616 KB Output is correct
18 Correct 15 ms 33616 KB Output is correct
19 Correct 11 ms 33616 KB Output is correct
20 Correct 11 ms 33616 KB Output is correct
21 Correct 13 ms 33616 KB Output is correct
22 Correct 13 ms 33616 KB Output is correct
23 Correct 13 ms 33616 KB Output is correct
24 Correct 12 ms 33616 KB Output is correct
25 Correct 12 ms 33616 KB Output is correct
26 Correct 10 ms 33616 KB Output is correct
27 Correct 11 ms 33616 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 219 ms 33616 KB Output is correct
2 Correct 292 ms 33616 KB Output is correct
3 Correct 253 ms 33616 KB Output is correct
4 Correct 226 ms 33616 KB Output is correct
5 Correct 232 ms 33616 KB Output is correct
6 Correct 283 ms 33616 KB Output is correct
7 Correct 270 ms 33616 KB Output is correct
8 Correct 168 ms 33616 KB Output is correct
9 Correct 165 ms 33616 KB Output is correct
10 Correct 214 ms 33616 KB Output is correct
11 Correct 164 ms 33616 KB Output is correct
12 Correct 206 ms 33616 KB Output is correct
13 Correct 131 ms 33616 KB Output is correct
14 Correct 154 ms 33616 KB Output is correct
15 Correct 300 ms 45156 KB Output is correct
16 Correct 229 ms 45156 KB Output is correct
17 Correct 282 ms 46276 KB Output is correct
18 Correct 278 ms 46276 KB Output is correct
19 Correct 338 ms 46276 KB Output is correct
20 Correct 288 ms 46276 KB Output is correct
21 Correct 230 ms 46276 KB Output is correct
22 Correct 180 ms 46276 KB Output is correct
23 Correct 203 ms 46276 KB Output is correct
24 Correct 255 ms 49580 KB Output is correct
25 Correct 226 ms 51200 KB Output is correct
26 Correct 278 ms 51268 KB Output is correct
27 Correct 314 ms 52700 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 8952 KB Output is correct
2 Correct 10 ms 8980 KB Output is correct
3 Correct 11 ms 9008 KB Output is correct
4 Correct 11 ms 9012 KB Output is correct
5 Correct 12 ms 9040 KB Output is correct
6 Correct 9 ms 9116 KB Output is correct
7 Correct 10 ms 9160 KB Output is correct
8 Incorrect 13 ms 9288 KB Output isn't correct
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 8952 KB Output is correct
2 Correct 10 ms 8980 KB Output is correct
3 Correct 11 ms 9008 KB Output is correct
4 Correct 11 ms 9012 KB Output is correct
5 Correct 12 ms 9040 KB Output is correct
6 Correct 9 ms 9116 KB Output is correct
7 Correct 10 ms 9160 KB Output is correct
8 Incorrect 13 ms 9288 KB Output isn't correct
9 Halted 0 ms 0 KB -