답안 #675021

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
675021 2022-12-26T19:28:51 Z QwertyPi I want to be the very best too! (NOI17_pokemonmaster) C++14
47 / 100
5000 ms 11708 KB
#include <bits/stdc++.h>
#define fi first
#define se second
using namespace std;

const int MAXN = 5e4 + 11, MAXQ = 1e5 + 11;
const int SQ = 1000;
int l[MAXN], p[MAXN], tp[MAXN];
int ans[MAXQ];

struct DSU{
	int dsu[MAXN], ans[MAXN];
	map<int, int> info[MAXN];
	void init(int n){
		for(int i = 0; i < n; i++) dsu[i] = i;
		for(int i = 0; i < n; i++) info[i].clear(), info[i][p[i]]++, ans[i] = 1;
	}
	int f(int x){
		return dsu[x] == x ? x : dsu[x] = f(dsu[x]);
	}
	void g(int x, int y){
		x = f(x), y = f(y);
		if(x == y) return;
		if(info[x].size() < info[y].size()) swap(x, y);
		for(auto i : info[y]) info[x][i.fi] += i.se;
		dsu[y] = x; ans[x] = info[x].size();
	}
} dsu;

struct qry{
	int t, x, y, v, i; 
};

struct edge{
	int u, v, w;
	bool operator< (const edge& o) const {
		return w < o.w;
	}
};
int n, m, q;
pair<int, int> change[MAXQ];
vector<edge> E; int eid = 0;
void solve(vector<qry> Q){
	eid = 0;
	int _l = Q[0].i;
	dsu.init(n * m);
	for(int i = 0; i < n * m; i++) tp[i] = p[i];
	for(auto q : Q){
		if(q.t == 1){
			change[q.i] = {tp[q.x * m + q.y], q.v};
			tp[q.x * m + q.y] = q.v;
		}
	}
	vector<pair<int, int>> Q2;
	for(auto q : Q){
		if(q.t == 2){
			Q2.push_back({q.v, q.i});
		}
	}
	sort(Q2.begin(), Q2.end());
	for(int j = 0; j < Q2.size(); j++){
		while(eid < E.size() && E[eid].w <= Q2[j].fi) dsu.g(E[eid].u, E[eid].v), eid++;
		int i = Q2[j].se, ri = i - _l;
		int pos = dsu.f(Q[ri].x * m + Q[ri].y);
		for(int k = 0; k < ri; k++){
			if(Q[k].t == 1){
				if(dsu.f(Q[k].x * m + Q[k].y) != pos) continue;
				dsu.info[pos][change[_l + k].fi]--;
				if(dsu.info[pos][change[_l + k].fi] == 0) ans[pos]--;
				dsu.info[pos][change[_l + k].se]++;
				if(dsu.info[pos][change[_l + k].se] == 1) ans[pos]++;
			}
		}
		if(l[Q[ri].x * m + Q[ri].y] <= Q[ri].v){
			// ans[i] = dsu.info[pos].size();
			for(auto j : dsu.info[pos]){
				ans[i] += (j.se > 0);
			}
		}
		for(int k = 0; k < ri; k++){
			if(Q[k].t == 1){
				if(dsu.f(Q[k].x * m + Q[k].y) != pos) continue;
				dsu.info[pos][change[_l + k].se]--;
				if(dsu.info[pos][change[_l + k].se] == 0) ans[pos]--;
				dsu.info[pos][change[_l + k].fi]++;
				if(dsu.info[pos][change[_l + k].fi] == 1) ans[pos]++;
			}
		}
	}
}

int32_t main(){
	cin >> n >> m >> q;
	for(int i = 0; i < n; i++){
		for(int j = 0; j < m; j++){
			cin >> l[i * m + j];
		}
	}
	for(int i = 0; i < n; i++){
		for(int j = 0; j < m - 1; j++){
			int u = i * m + j, v = i * m + j + 1;
			E.push_back({u, v, max(l[u], l[v])});
		}
	}
	for(int i = 0; i < n - 1; i++){
		for(int j = 0; j < m; j++){
			int u = i * m + j, v = (i + 1) * m + j;
			E.push_back({u, v, max(l[u], l[v])});
		}
	}
	sort(E.begin(), E.end());
	
	for(int i = 0; i < n; i++){
		for(int j = 0; j < m; j++){
			cin >> p[i * m + j];
		}
	}
	for(int i = 0; i < q; i += SQ){
		vector<qry> Q;
		for(int j = i; j < min(i + SQ, q); j++){
			int t, x, y, v;
			cin >> t >> y >> x >> v;
			x--; y--;
			Q.push_back({t, x, y, v, j});
		}
		solve(Q);
		for(auto q : Q){
			if(q.t == 1) p[q.x * m + q.y] = q.v;
		}
		for(int j = i; j < min(i + SQ, q); j++){
			if(Q[j - i].t == 2){
				cout << ans[j] << endl;
			}
		}
	}
}

Compilation message

pokemonmaster.cpp: In function 'void solve(std::vector<qry>)':
pokemonmaster.cpp:61:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   61 |  for(int j = 0; j < Q2.size(); j++){
      |                 ~~^~~~~~~~~~~
pokemonmaster.cpp:62:13: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<edge>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   62 |   while(eid < E.size() && E[eid].w <= Q2[j].fi) dsu.g(E[eid].u, E[eid].v), eid++;
      |         ~~~~^~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 36 ms 6580 KB Output is correct
2 Correct 54 ms 6540 KB Output is correct
3 Correct 67 ms 6792 KB Output is correct
4 Correct 37 ms 6568 KB Output is correct
5 Correct 51 ms 6552 KB Output is correct
6 Correct 101 ms 6860 KB Output is correct
7 Correct 42 ms 6632 KB Output is correct
8 Correct 47 ms 6576 KB Output is correct
9 Correct 38 ms 6596 KB Output is correct
10 Correct 101 ms 6884 KB Output is correct
11 Correct 56 ms 6552 KB Output is correct
12 Correct 193 ms 7572 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 38 ms 6724 KB Output is correct
2 Correct 40 ms 6800 KB Output is correct
3 Correct 43 ms 7036 KB Output is correct
4 Correct 47 ms 6824 KB Output is correct
5 Correct 43 ms 6960 KB Output is correct
6 Correct 45 ms 7104 KB Output is correct
7 Correct 48 ms 7168 KB Output is correct
8 Correct 55 ms 8544 KB Output is correct
9 Correct 49 ms 7280 KB Output is correct
10 Correct 68 ms 10496 KB Output is correct
11 Correct 56 ms 9224 KB Output is correct
12 Correct 70 ms 11708 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 730 ms 8128 KB Output is correct
2 Correct 876 ms 8036 KB Output is correct
3 Correct 700 ms 7876 KB Output is correct
4 Correct 682 ms 8192 KB Output is correct
5 Correct 940 ms 8156 KB Output is correct
6 Correct 779 ms 8424 KB Output is correct
7 Correct 1401 ms 8860 KB Output is correct
8 Correct 1434 ms 8700 KB Output is correct
9 Correct 1467 ms 8660 KB Output is correct
10 Correct 1367 ms 8680 KB Output is correct
11 Correct 1432 ms 8584 KB Output is correct
12 Correct 1401 ms 8672 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 36 ms 6580 KB Output is correct
2 Correct 54 ms 6540 KB Output is correct
3 Correct 67 ms 6792 KB Output is correct
4 Correct 37 ms 6568 KB Output is correct
5 Correct 51 ms 6552 KB Output is correct
6 Correct 101 ms 6860 KB Output is correct
7 Correct 42 ms 6632 KB Output is correct
8 Correct 47 ms 6576 KB Output is correct
9 Correct 38 ms 6596 KB Output is correct
10 Correct 101 ms 6884 KB Output is correct
11 Correct 56 ms 6552 KB Output is correct
12 Correct 193 ms 7572 KB Output is correct
13 Correct 762 ms 7980 KB Output is correct
14 Correct 2542 ms 7928 KB Output is correct
15 Correct 4135 ms 8128 KB Output is correct
16 Correct 828 ms 7860 KB Output is correct
17 Correct 2528 ms 8072 KB Output is correct
18 Execution timed out 5047 ms 8248 KB Time limit exceeded
19 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 36 ms 6580 KB Output is correct
2 Correct 54 ms 6540 KB Output is correct
3 Correct 67 ms 6792 KB Output is correct
4 Correct 37 ms 6568 KB Output is correct
5 Correct 51 ms 6552 KB Output is correct
6 Correct 101 ms 6860 KB Output is correct
7 Correct 42 ms 6632 KB Output is correct
8 Correct 47 ms 6576 KB Output is correct
9 Correct 38 ms 6596 KB Output is correct
10 Correct 101 ms 6884 KB Output is correct
11 Correct 56 ms 6552 KB Output is correct
12 Correct 193 ms 7572 KB Output is correct
13 Correct 38 ms 6724 KB Output is correct
14 Correct 40 ms 6800 KB Output is correct
15 Correct 43 ms 7036 KB Output is correct
16 Correct 47 ms 6824 KB Output is correct
17 Correct 43 ms 6960 KB Output is correct
18 Correct 45 ms 7104 KB Output is correct
19 Correct 48 ms 7168 KB Output is correct
20 Correct 55 ms 8544 KB Output is correct
21 Correct 49 ms 7280 KB Output is correct
22 Correct 68 ms 10496 KB Output is correct
23 Correct 56 ms 9224 KB Output is correct
24 Correct 70 ms 11708 KB Output is correct
25 Correct 730 ms 8128 KB Output is correct
26 Correct 876 ms 8036 KB Output is correct
27 Correct 700 ms 7876 KB Output is correct
28 Correct 682 ms 8192 KB Output is correct
29 Correct 940 ms 8156 KB Output is correct
30 Correct 779 ms 8424 KB Output is correct
31 Correct 1401 ms 8860 KB Output is correct
32 Correct 1434 ms 8700 KB Output is correct
33 Correct 1467 ms 8660 KB Output is correct
34 Correct 1367 ms 8680 KB Output is correct
35 Correct 1432 ms 8584 KB Output is correct
36 Correct 1401 ms 8672 KB Output is correct
37 Correct 762 ms 7980 KB Output is correct
38 Correct 2542 ms 7928 KB Output is correct
39 Correct 4135 ms 8128 KB Output is correct
40 Correct 828 ms 7860 KB Output is correct
41 Correct 2528 ms 8072 KB Output is correct
42 Execution timed out 5047 ms 8248 KB Time limit exceeded
43 Halted 0 ms 0 KB -