제출 #209537

#제출 시각아이디문제언어결과실행 시간메모리
209537mieszko11b다리 (APIO19_bridges)C++14
100 / 100
1979 ms16756 KiB
#include <bits/stdc++.h>

using namespace std;

using ii = pair<int, int>;

#define X first
#define Y second

const int SQRT = 600;

int n, m;
int a[100007], b[100007], c[100007];
int q;
int t[100007], d[100007], e[100007], ans[100007];
bool changed[100007];
int lastw[100007];
int maxv;
vector<int> not_changed[200007];
vector<int> G[50007];

void readint(int &x) {
	x = 0;
	char c;
	do
		c = getchar_unlocked();
	while(c < '0' || c > '9');
	
	do {
		x = x * 10 + c - '0';
		c = getchar_unlocked();
	} while(c >= '0' && c <= '9');
}

int p[50007], ran[50007];
bool vis[50007];

int cnt;
vector<int> aff;

void init_DSU() {
	for(int i = 1 ; i <= n ; i++) {
		p[i] = i;
		ran[i] = 1;
	}
}

int Find(int i) {
	if(p[i] == i)
		return i;
	return p[i] = Find(p[i]);
}

void Union(int a, int b) {
	a = Find(a);
	b = Find(b);
	
	if(a == b)
		return ;
		
	if(ran[a] < ran[b]) {
		p[a] = b;
		ran[b] += ran[a];
	} else {
		p[b] = a;
		ran[a] += ran[b];
	}
}

void dfs(int w) {
	if(vis[w])
		return ;
	vis[w] = 1;
	aff.push_back(w);
	cnt += ran[w];
	for(int u : G[w])
		dfs(u);
}

int count(vector<ii> &E, int w) {
	for(ii e : E) {
		G[e.X].push_back(e.Y);
		G[e.Y].push_back(e.X);
	}
	cnt = 0;
	aff.reserve(100);
	dfs(Find(w));
	for(int x : aff)
		vis[x] = 0;
	aff.clear();
	for(ii e : E) {
		G[e.X].clear();
		G[e.Y].clear();
	}
	return cnt;
}


void process_queries(int x, int y) {
	vector<ii> Q;
	vector<int> chacha;
	chacha.reserve(y - x + 1);
	Q.reserve(y - x + 1);

	for(int i = x ; i <= y ; i++) {
		if(t[i] == 1)
			changed[d[i]] = 1;
		else
			Q.emplace_back(e[i], i);
	}
	for(int j = 0 ; j < maxv ; j++)
		not_changed[j].clear();
	for(int i = 1 ; i <= m ; i++) {
		if(!changed[i])
			not_changed[c[i]].push_back(i);
		else
			chacha.push_back(i);
	}
	sort(Q.begin(), Q.end(), greater<ii>());
	
	init_DSU();
	
	int v = maxv;
	for(int j = 0 ; j < Q.size() ; j++) {
		int q = Q[j].Y;
		
		for(int i = e[q] ; i < v ; i++)
			for(int e : not_changed[i])
				Union(a[e], b[e]);
		v = e[q];
				
		for(int e : chacha)
			lastw[e] = c[e];
		for(int k = x ; k < q ; k++)
			if(t[k] == 1)
				lastw[d[k]] = e[k];
		vector<ii> E;
		E.reserve(y - x + 1);
		for(int e : chacha)
			if(lastw[e] >= ::e[q])
				E.push_back({Find(a[e]), Find(b[e])});
		ans[q] = count(E, d[q]);
	}

	for(int k = x ; k <= y ; k++)
		if(t[k] == 1)
			c[d[k]] = e[k], changed[d[k]] = 0;
}

vector<int> hlp;
int renum(int x) {
	auto it = upper_bound(hlp.begin(), hlp.end(), x);
	return prev(it) - hlp.begin();
}	

int main() {
	//~ scanf("%d%d",&n, &m);
	readint(n);
	readint(m);
	
	for(int i = 1 ; i <= m ; i++) {
		//~ scanf("%d%d%d", &a[i], &b[i], &c[i]);
		readint(a[i]);
		readint(b[i]);
		readint(c[i]);
		//~ hlp.push_back(c[i]);
	}
	//~ scanf("%d", &q);
	readint(q);
	for(int i = 1 ; i <= q ; i++) {
		//~ scanf("%d%d%d", &t[i], &d[i], &e[i]);
		readint(t[i]);
		readint(d[i]);
		readint(e[i]);
		if(t[i] == 2)
			hlp.push_back(e[i]);
	}
	hlp.push_back(0);
	hlp.push_back(int(1e9) + 7);
		
	sort(hlp.begin(), hlp.end());
	hlp.resize(distance(hlp.begin(), unique(hlp.begin(), hlp.end())));
	maxv = hlp.size();
	for(int i = 1 ; i <= m ; i++)
		c[i] = renum(c[i]);
	//~ cout << endl;
	for(int i = 1 ; i <= q ; i++)
		e[i] = renum(e[i]);
	//~ cout << endl;
		
	for(int i = 1 ; i <= q ; i += SQRT)
		process_queries(i, min(i + SQRT - 1, q));
		
	for(int i = 1 ; i <= q ; i++)
		if(ans[i])
			printf("%d\n", ans[i]);
		
	return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

bridges.cpp: In function 'void process_queries(int, int)':
bridges.cpp:124:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int j = 0 ; j < Q.size() ; j++) {
                  ~~^~~~~~~~~~
#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...