Submission #1045034

#TimeUsernameProblemLanguageResultExecution timeMemory
1045034Kel_MahmutBridges (APIO19_bridges)C++14
27 / 100
226 ms12796 KiB
#include <bits/stdc++.h>
#define pb push_back
// #define endl ("\n")
#define all(aa) aa.begin(), aa.end()
typedef long long ll;
using namespace std;

struct DSU{
	int n;
	vector<int> par;
	vector<int> sz;
	DSU(int n) : n(n), par(n), sz(n, 1){
		for(int i = 0; i < n; i++) par[i] = i;
	}

	int find(int u){
		if(par[u] == u) return u;
		return par[u] = find(par[u]);
	}

	void merge(int u, int v){
		u = find(u);
		v = find(v);
		if(u == v) return;
		if(sz[v] > sz[u]) swap(u, v);
		par[v] = u;
		sz[u] += sz[v];
	}

	int cnt(int u){
		u = find(u);
		return sz[u];
	}
};

struct SegmentTree{
	int n;
	vector<int> t;
	SegmentTree(int n) : n(n), t(4*n) {}

	void upd(int u, int tl, int tr, int pos, int val){
		if(tl == tr){
			t[u] = val;
			return;
		}
		int tm = (tl + tr) / 2;
		if(pos <= tm)
			upd(u * 2, tl, tm, pos, val);
		else
			upd(u * 2 + 1, tm + 1, tr, pos, val);
		t[u] = min(t[u * 2], t[u * 2 + 1]);
	}

	void upd(int pos, int val){
		upd(1, 0, n - 1, pos, val);
	}

	int query(int u, int tl, int tr, int ql, int qr){
		if(ql <= tl && tr <= qr){
			return t[u];
		}
		int tm = (tl + tr) / 2;
		int ret = INT_MAX;
		if(ql <= tm)
			ret = query(u * 2, tl, tm, ql, qr);
		if(tm < qr)
			ret = min(ret, query(u * 2 + 1, tm + 1, tr, ql, qr));
		return ret;
	}

	int query(int ql, int qr){
		return query(1, 0, n - 1, ql, qr);
	}
};

int main(){
	int n, m;
	cin >> n >> m;
	vector<vector<pair<int, int>>> g(n);
	vector<pair<pair<int, int>, pair<int, int>>> bri(m);
	vector<array<int, 3>> edge;

	bool st2 = 1;
	vector<int> V;
	for(int i = 0; i < m; i++){
		int u, v, c;
		cin >> u >> v >> c;
		u--, v--;
		st2 &= ((u == i) && (v == i + 1));
		V.pb(c);
		g[u].pb(make_pair(v, c));
		g[v].pb(make_pair(u, c));
		bri[i] = make_pair(make_pair(u, g[u].size() - 1), make_pair(v, g[v].size() - 1));
		edge.pb({c, u, v});
	}
	int q; cin >> q;
	if(0 && st2){
		cout <<"CHAIN" << endl;
		SegmentTree st(n - 1);
		for(int i = 0; i < n - 1; i++){
			st.upd(i, V[i]);
		}

		for(int qq = 0; qq < q; qq++){
			int t; cin >> t;
			if(t == 1){
				int ind, val;
				cin >> ind >> val;
				ind--;
				st.upd(ind, val);
			}
			else{
				int u, d;
				cin >> u >> d;
				u--;
				int tl = u, tr = n - 1;
				while(tl < tr){
					int tm = (tl + tr + 1) / 2;
					if(st.query(u, tm - 1) >= d){
						tl = tm;
					}
					else
						tr = tm - 1;
				}
				int upp = tr;
				tl = 0, tr = u;
				while(tl < tr){
					int tm = (tl + tr) / 2;
					if(st.query(tm, u - 1) >= d){
						tr = tm;
					}
					else tl = tm + 1;
				}
				int low = tr;

				cout << upp - low + 1 << endl;
			}
		}
	}
	else if(n <= 1000 && m <= 1000 && q <= 10000){
		int ans = 0;
		vector<int> vis(n);
		function<void(int, int)> dfs = [&](int u, int d){
			vis[u] = 1;
			ans++;
			for(auto [v, c]: g[u]){
				if(d <= c){
					if(!vis[v])
						dfs(v, d);
				}
			}
		};
		for(int i = 0; i < q; i++){
			int t;
			cin >> t;
			if(t == 2){
				int u, d;
				cin >> u >> d;
				u--;
				dfs(u, d);
				cout << ans << endl;
				ans = 0;
				vis.assign(n, 0);
			}
			else{
				int ind, c;
				cin >> ind >> c;
				ind--;
				auto x = bri[ind].first;
				g[x.first][x.second].second = c;
				x = bri[ind].second;
				g[x.first][x.second].second = c;
			}
		}
		exit(0);
	}

	sort(all(edge));
	reverse(all(edge));
	vector<array<int, 3>> Q;
	for(int i = 0; i < q; i++){
		int t;
		cin >> t;
		if(t == 2){
			int u, c;
			cin >> u >> c;
			u--;
			Q.pb({c, u, i});
		}
		else{
			int a, b;
			cin >> a >> b;
		}
	}

	sort(all(Q));
	reverse(all(Q));
	vector<int> ans(Q.size(), -1);
	DSU dsu(n);
	for(int i = 0, j = 0; j < (int) Q.size(); j++){
		while(i < m && edge[i][0] >= Q[j][0]){
			dsu.merge(edge[i][1], edge[i][2]);
			i++;
		}
		ans[Q[j][2]] = dsu.cnt(Q[j][1]);
	}

	for(int i = 0; i < (int) Q.size(); i++){
		cout << ans[i] << endl;
	}
}

Compilation message (stderr)

bridges.cpp: In lambda function:
bridges.cpp:146:13: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  146 |    for(auto [v, c]: g[u]){
      |             ^
#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...