제출 #1261630

#제출 시각아이디문제언어결과실행 시간메모리
1261630Bui_Quoc_CuongCollapse (JOI18_collapse)C++20
5 / 100
15090 ms6640 KiB
#include <bits/stdc++.h>
// #include "collapse.h"
using namespace std;
#define FOR(i, a, b) for(int i = a; i <= (int)b; i++)
#define FORD(i, a, b) for(int i = a; i >= (int)b; i--)
#define all(a) a.begin(), a.end()
#define pb push_back
#define fi first
#define se second
const int maxN = 1e5 + 5;

int n, m, q;
array <int, 3> edges[maxN];
array <int, 2> Q[maxN];

void init() {
	cin >> n >> m >> q;
	FOR(i, 1, m) {
		cin >> edges[i][0] >> edges[i][1] >> edges[i][2];
		edges[i][1]++; edges[i][2]++;
		if (edges[i][1] > edges[i][2]) swap(edges[i][1], edges[i][2]);
	}
	FOR(i, 1, q) {
		cin >> Q[i][0] >> Q[i][1];
		Q[i][0]++; Q[i][1]++;
	}
}

namespace sub1 {
	bool checksub() {
		return max(n, q) <= 5000;
	}	

	set <int> G[5005];
	bool vis[5005];

	void dfs(int u, int p) {
		if (vis[u]) return;
		vis[u] = 1;
		for(auto v : G[u]) if (v != p && vis[v] == 0) {
			dfs(v, u);
		}
	}

	vector <int> solve() {
		vector <int> res;
		FOR(_q, 1, q) {
			FOR(i, 1, n) G[i].clear();
			int ssc = 0;

			FOR(i, 1, Q[_q][0]) {
				if (edges[i][0] == 1) {
					int u = edges[i][1], v = edges[i][2];
					if (u <= Q[_q][1] && v >= Q[_q][1] + 1) continue;
					G[u].erase(v);
					G[v].erase(u);	 
				} else {
					int u = edges[i][1], v = edges[i][2];
					if (u <= Q[_q][1] && v >= Q[_q][1] + 1) continue;
					G[u].insert(v);
					G[v].insert(u);
				}
			}

			FOR(i, 1, n) vis[i] = 0;
			FOR(i, 1, n) if (!vis[i]) {
				ssc++;
				dfs(i, i);
			}

			res.push_back(ssc);
		}
		return res;
	}	
}

vector <int> simulateCollapse(int N, vector<int> T, vector<int> X, vector<int> Y, vector<int> W, vector<int> P) {
	n = N;
	m = X.size();
	q = W.size();
	FOR(i, 0, m - 1) {
		edges[i + 1][0] = T[i];
		edges[i + 1][1] = X[i] + 1;
		edges[i + 1][2] = Y[i] + 1;
		if (edges[i + 1][1] > edges[i + 1][2]) swap(edges[i + 1][1], edges[i + 1][2]);
	}
	for (int i = 0; i < q; i++) {
		Q[i + 1][0] = W[i] + 1;
		Q[i + 1][1] = P[i] + 1;
	}	
	vector <int> res = sub1::solve();
	return res;
}

void process() {
	vector <int> res;
	if(sub1::checksub()) res = sub1::solve();
	for (int &val : res) cout << val << " ";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...