Submission #1193642

#TimeUsernameProblemLanguageResultExecution timeMemory
1193642Bui_Quoc_Cuong다리 (APIO19_bridges)C++20
13 / 100
3092 ms4936 KiB
//#pragma GCC optimize("O2")
//#pragma GCC target("avx,avx2,fma")
#include <bits/stdc++.h>
using namespace std;
#define ALL(A) A.begin(), A.end()
#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 TIME (1.0 * clock() / CLOCKS_PER_SEC)
#define fi first
#define se second
const int oo = (int) 2e9;
const long long INF = (long long) 1e18;
const int MAXN = (int) 4e5 + 5;

int N, M, Q;
struct Edges {
	int u, v, w;
} E[MAXN];

struct Queries {
	int t;
	int id, val;
	int s, w;
	int id_qry;

	void input(void) {
		cin >> t;
		if (t == 1) cin >> id >> val;
		else cin >> s >> w;
	}
} Qry[MAXN];

namespace sub1 {
	int lab[MAXN];

	int find(int x) {
		return lab[x] < 0 ? x : lab[x] = find(lab[x]);
	}

	bool joint(int u, int v) {
		int x = find(u), y = find(v);
		if (x == y) return 0;
		if (lab[x] > lab[y]) swap(x, y);
		lab[x]+= lab[y];
		lab[y] = x;
		return 1;
	}

	void solve() {
		for (int q = 1; q <= Q; q++) {
			int t = Qry[q].t;
			if (t == 1) {
				int id = Qry[q].id, val = Qry[q].val;
				E[id].w = val;
				continue;
			}

			int W = Qry[q].w, S = Qry[q].s;

			for (int i = 1; i <= N; i++) lab[i] = - 1;

			for (int i = 1; i <= M; i++) {
				if (E[i].w >= W) {
					joint(E[i].u, E[i].v);
				}
			}

			cout << - lab[find(S)] << "\n";
		}	
	}
}

namespace sub4 {	
	bool checksub() {
		for (int i = 1; i <= Q; i++) if (Qry[i].t != 2) return 0;
		return 1;
	}

	int lab[MAXN];

	int find(int x) {
		return lab[x] < 0 ? x : lab[x] = find(lab[x]);
	}

	bool joint(int u, int v) {
		int x = find(u), y = find(v);
		if (x == y) return 0;
		if (lab[x] > lab[y]) swap(x, y);
		lab[x]+= lab[y];
		lab[y] = x;
		return 1;
	}

	int ans[MAXN];

	void solve() {	
		sort(Qry + 1, Qry + 1 + Q, [&](Queries u, Queries v) {
			return u.w < v.w;
		});

		sort(E + 1, E + 1 + M, [&](Edges u, Edges v) {
			return u.w < v.w;
		});

		for (int i = 1; i <= N; i++) lab[i] = - 1;

		int j = M;
		for (int i = Q; i >= 1; i--) {
			while (j >= 1 && E[j].w >= Qry[i].w) {
				joint(E[j].u, E[j].v);
				j--;
			}
			ans[Qry[i].id_qry] = - lab[find(Qry[i].s)];
		}

		for (int i = 1; i <= Q; i++) cout << ans[i] << "\n";
	}	
}

void process() {
	cin >> N >> M;
	for (int i = 1; i <= M; i++) {
		cin >> E[i].u >> E[i].v >> E[i].w;
	}	
	cin >> Q;		
	for (int i = 1; i <= Q; i++) {
		Qry[i].input();
		Qry[i].id_qry = i;
	}

	if (Q <= 10000 && N <= 1000) return sub1 :: solve();
	if (sub4 :: checksub()) return sub4 :: solve();
}

signed main(void) {
    ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);

    #define Hori ""
    if (fopen(Hori".inp", "r")) {
        freopen(Hori".inp", "r", stdin);
        freopen(Hori".out", "w", stdout);
    }

    process();

    return void(cerr << "KO :" << TIME << "s "), (0 ^ 0);
}

Compilation message (stderr)

bridges.cpp: In function 'int main()':
bridges.cpp:140:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  140 |         freopen(Hori".inp", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
bridges.cpp:141:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  141 |         freopen(Hori".out", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#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...