답안 #675030

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
675030 2022-12-26T19:46:46 Z QwertyPi I want to be the very best too! (NOI17_pokemonmaster) C++14
47 / 100
5000 ms 8596 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 = 800;
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]) ans[x] += info[x][i.fi] == 0 && i.se != 0, info[x][i.fi] += i.se;
		info[y].clear();
		dsu[y] = x;
	}
} 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) dsu.ans[pos]--;
				dsu.info[pos][change[_l + k].se]++;
				if(dsu.info[pos][change[_l + k].se] == 1) dsu.ans[pos]++;
			}
		}
		if(l[Q[ri].x * m + Q[ri].y] <= Q[ri].v){
			ans[i] = dsu.ans[pos];
		}
		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) dsu.ans[pos]--;
				dsu.info[pos][change[_l + k].fi]++;
				if(dsu.info[pos][change[_l + k].fi] == 1) dsu.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:62: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]
   62 |  for(int j = 0; j < Q2.size(); j++){
      |                 ~~^~~~~~~~~~~
pokemonmaster.cpp:63:13: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<edge>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   63 |   while(eid < E.size() && E[eid].w <= Q2[j].fi) dsu.g(E[eid].u, E[eid].v), eid++;
      |         ~~~~^~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 39 ms 6596 KB Output is correct
2 Correct 60 ms 6624 KB Output is correct
3 Correct 70 ms 6608 KB Output is correct
4 Correct 41 ms 6624 KB Output is correct
5 Correct 53 ms 6596 KB Output is correct
6 Correct 61 ms 6628 KB Output is correct
7 Correct 39 ms 6596 KB Output is correct
8 Correct 51 ms 6596 KB Output is correct
9 Correct 41 ms 6576 KB Output is correct
10 Correct 88 ms 6592 KB Output is correct
11 Correct 60 ms 6552 KB Output is correct
12 Correct 95 ms 6564 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 39 ms 6536 KB Output is correct
2 Correct 46 ms 6604 KB Output is correct
3 Correct 48 ms 6560 KB Output is correct
4 Correct 42 ms 6764 KB Output is correct
5 Correct 45 ms 6744 KB Output is correct
6 Correct 49 ms 6728 KB Output is correct
7 Correct 50 ms 7024 KB Output is correct
8 Correct 57 ms 7048 KB Output is correct
9 Correct 48 ms 7120 KB Output is correct
10 Correct 68 ms 7128 KB Output is correct
11 Correct 60 ms 7160 KB Output is correct
12 Correct 87 ms 7036 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 924 ms 7932 KB Output is correct
2 Correct 1050 ms 7880 KB Output is correct
3 Correct 897 ms 7776 KB Output is correct
4 Correct 950 ms 8052 KB Output is correct
5 Correct 1149 ms 8236 KB Output is correct
6 Correct 953 ms 8100 KB Output is correct
7 Correct 1781 ms 8484 KB Output is correct
8 Correct 1764 ms 8528 KB Output is correct
9 Correct 1744 ms 8596 KB Output is correct
10 Correct 1744 ms 8472 KB Output is correct
11 Correct 1751 ms 8536 KB Output is correct
12 Correct 1713 ms 8380 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 39 ms 6596 KB Output is correct
2 Correct 60 ms 6624 KB Output is correct
3 Correct 70 ms 6608 KB Output is correct
4 Correct 41 ms 6624 KB Output is correct
5 Correct 53 ms 6596 KB Output is correct
6 Correct 61 ms 6628 KB Output is correct
7 Correct 39 ms 6596 KB Output is correct
8 Correct 51 ms 6596 KB Output is correct
9 Correct 41 ms 6576 KB Output is correct
10 Correct 88 ms 6592 KB Output is correct
11 Correct 60 ms 6552 KB Output is correct
12 Correct 95 ms 6564 KB Output is correct
13 Correct 959 ms 7928 KB Output is correct
14 Correct 2527 ms 7868 KB Output is correct
15 Correct 4024 ms 7920 KB Output is correct
16 Correct 960 ms 7916 KB Output is correct
17 Correct 2383 ms 7984 KB Output is correct
18 Correct 2611 ms 8188 KB Output is correct
19 Correct 961 ms 7940 KB Output is correct
20 Correct 1984 ms 7912 KB Output is correct
21 Correct 1058 ms 7856 KB Output is correct
22 Execution timed out 5062 ms 7992 KB Time limit exceeded
23 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 39 ms 6596 KB Output is correct
2 Correct 60 ms 6624 KB Output is correct
3 Correct 70 ms 6608 KB Output is correct
4 Correct 41 ms 6624 KB Output is correct
5 Correct 53 ms 6596 KB Output is correct
6 Correct 61 ms 6628 KB Output is correct
7 Correct 39 ms 6596 KB Output is correct
8 Correct 51 ms 6596 KB Output is correct
9 Correct 41 ms 6576 KB Output is correct
10 Correct 88 ms 6592 KB Output is correct
11 Correct 60 ms 6552 KB Output is correct
12 Correct 95 ms 6564 KB Output is correct
13 Correct 39 ms 6536 KB Output is correct
14 Correct 46 ms 6604 KB Output is correct
15 Correct 48 ms 6560 KB Output is correct
16 Correct 42 ms 6764 KB Output is correct
17 Correct 45 ms 6744 KB Output is correct
18 Correct 49 ms 6728 KB Output is correct
19 Correct 50 ms 7024 KB Output is correct
20 Correct 57 ms 7048 KB Output is correct
21 Correct 48 ms 7120 KB Output is correct
22 Correct 68 ms 7128 KB Output is correct
23 Correct 60 ms 7160 KB Output is correct
24 Correct 87 ms 7036 KB Output is correct
25 Correct 924 ms 7932 KB Output is correct
26 Correct 1050 ms 7880 KB Output is correct
27 Correct 897 ms 7776 KB Output is correct
28 Correct 950 ms 8052 KB Output is correct
29 Correct 1149 ms 8236 KB Output is correct
30 Correct 953 ms 8100 KB Output is correct
31 Correct 1781 ms 8484 KB Output is correct
32 Correct 1764 ms 8528 KB Output is correct
33 Correct 1744 ms 8596 KB Output is correct
34 Correct 1744 ms 8472 KB Output is correct
35 Correct 1751 ms 8536 KB Output is correct
36 Correct 1713 ms 8380 KB Output is correct
37 Correct 959 ms 7928 KB Output is correct
38 Correct 2527 ms 7868 KB Output is correct
39 Correct 4024 ms 7920 KB Output is correct
40 Correct 960 ms 7916 KB Output is correct
41 Correct 2383 ms 7984 KB Output is correct
42 Correct 2611 ms 8188 KB Output is correct
43 Correct 961 ms 7940 KB Output is correct
44 Correct 1984 ms 7912 KB Output is correct
45 Correct 1058 ms 7856 KB Output is correct
46 Execution timed out 5062 ms 7992 KB Time limit exceeded
47 Halted 0 ms 0 KB -