답안 #654274

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
654274 2022-10-30T20:16:57 Z fabijan_cikac Traffic (CEOI11_tra) C++17
100 / 100
949 ms 88800 KB
#include <bits/stdc++.h>

using namespace std;

#define pb push_back
#define pp pair<int, int>
#define F first
#define S second

struct point{
	int x, y, ix;
};

const int N = 3 * 1e5 + 100;

int n, m, A, B; vector<point> pt;
vector<int> g[N], tg[N], graph[N], order;
int new_idx[N], root[N], used[N], l[N], r[N];
int w[N], pref[N];

bool cmp(point x, point y){
	if (x.x != y.x)
		return (x.x < y.x);
	return (x.y > y.y);
}

void dfs1(int x){
	used[x] = 1;
	for (int y: g[x]){
		if (!used[y]) dfs1(y);
	}
	order.pb(x);
}

int cnt = 0;
void dfs2(int x){
	used[x] = 1;
	for (int y: tg[x]){
		if (!used[y]) dfs2(y);
	}
	root[x] = cnt;
	if (pt[x].x == A){
		l[cnt] = min(l[cnt], x);
		r[cnt] = max(r[cnt], x);
	}
}

void dfs3(int x){
	used[x] = 1;
	for (int y: graph[x]){
		if (!used[y]) dfs3(y);
		l[x] = min(l[x], l[y]);
		r[x] = max(r[x], r[y]);
	}
	//cout << ": " << x << ' ' << l[x] << ' ' << r[x] << endl;
}

int main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	
	cin >> n >> m >> A >> B;
	pt.resize(n); int k = 1;
	for (int i = 0; i < n; ++i){
		cin >> pt[i].x >> pt[i].y;
		pt[i].ix = i;
	}
	sort(pt.begin(), pt.end(), cmp);
	for (auto i = 0; i < n; ++i){
		new_idx[pt[i].ix] = i;
		l[i] = N; r[i] = -1;
		if (pt[i].x == A) ++w[i];
	}
	for (int i = 0; i < m; ++i){
		int u, v, t; cin >> u >> v >> t;
		--u; --v; u = new_idx[u]; v = new_idx[v];
		g[u].pb(v); tg[v].pb(u);
		if (t == 2){
			g[v].pb(u); tg[u].pb(v);
		}
	}
	while (k < n && pt[k].x == 0) ++k;
	for (int i = 0; i < k; ++i){
		if (!used[i]) dfs1(i);
	}
	for (int i = 0; i < n; ++i){
		if (pt[i].x == A && !used[i]) --w[i];
	}
	memset(used, 0, sizeof(used));
	/*cout << "-----------------------------" << endl;
	for (auto x: pt) cout << x.x << ' ' << x.y << ' ' << x.ix << endl;
	for (int x: order) cout << x << ' ';
	cout << endl;*/
	reverse(order.begin(), order.end());
	for (int x: order){
		if (!used[x]){
			dfs2(x); ++cnt;
		}
	}
	/*for (int i = 0; i < n; ++i)
		cout << root[i] << ' ';
	cout << endl;*/
	for (int i = 0; i < n; ++i){
		for (int x: g[i]) graph[root[i]].pb(root[x]);
	}
	memset(used, 0, sizeof(used));
	for (int i = 0; i < cnt; ++i){
		if (!used[i]) dfs3(i);
	}
	/*for (int i = 0; i < n; ++i)
		cout << l[i] << ' ' << r[i] << endl;*/
	pref[0] = w[0];
	for (int i = 1; i < n; ++i)
		pref[i] = w[i] + pref[i - 1];
	for (int i = 0; i < k; ++i){
		int x = root[i];
		cout << (pref[r[x]] - pref[l[x] - 1]) << '\n';
	}
	
	
	return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 12 ms 22612 KB Output is correct
2 Correct 11 ms 22612 KB Output is correct
3 Correct 11 ms 22612 KB Output is correct
4 Correct 12 ms 22612 KB Output is correct
5 Correct 14 ms 22612 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 13 ms 22612 KB Output is correct
2 Correct 12 ms 22648 KB Output is correct
3 Correct 12 ms 22612 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 13 ms 22612 KB Output is correct
2 Correct 12 ms 22768 KB Output is correct
3 Correct 13 ms 22720 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 13 ms 22868 KB Output is correct
2 Correct 15 ms 23380 KB Output is correct
3 Correct 16 ms 23224 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 30 ms 24700 KB Output is correct
2 Correct 67 ms 29920 KB Output is correct
3 Correct 42 ms 26436 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 56 ms 27044 KB Output is correct
2 Correct 87 ms 32324 KB Output is correct
3 Correct 63 ms 30084 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 96 ms 31268 KB Output is correct
2 Correct 155 ms 39312 KB Output is correct
3 Correct 187 ms 39136 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 145 ms 33308 KB Output is correct
2 Correct 152 ms 38956 KB Output is correct
3 Correct 247 ms 39904 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 261 ms 39384 KB Output is correct
2 Correct 243 ms 50276 KB Output is correct
3 Correct 475 ms 54804 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 378 ms 49532 KB Output is correct
2 Correct 422 ms 67204 KB Output is correct
3 Correct 440 ms 57808 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 888 ms 63072 KB Output is correct
2 Correct 419 ms 69648 KB Output is correct
3 Correct 858 ms 76024 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 214 ms 41068 KB Output is correct
2 Correct 545 ms 74596 KB Output is correct
3 Correct 667 ms 72020 KB Output is correct
4 Correct 949 ms 88800 KB Output is correct