#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include <bits/stdc++.h>
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
typedef long double ldb;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef pair<ldb,ldb> pdd;
#define ff(i,a,b) for(int i = a; i <= b; i++)
#define fb(i,b,a) for(int i = b; i >= a; i--)
#define trav(a,x) for(auto& a : x)
#define sz(a) (int)(a).size()
#define fi first
#define se second
#define pb push_back
#define lb lower_bound
#define ub upper_bound
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
template<typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
// os.order_of_key(k) the number of elements in the os less than k
// *os.find_by_order(k) print the k-th smallest number in os(0-based)
const int mod = 1000000007;
const int inf = 1e9 + 5;
const int mxN = 200005;
const int dx[] = {1, 0, -1, 0};
const int dy[] = {0, 1, 0, -1};
int n, m, q;
int par[mxN];
int boja[mxN];
map<int,vector<int>> dt[mxN];
int findpar(int x){
return (x == par[x] ? x : par[x] = findpar(par[x]));
}
void unite(int x, int y){
x = findpar(x), y = findpar(y);
if(x == y)return;
if(sz(dt[x]) < sz(dt[y]))swap(x, y);
for(auto c : dt[y]){
for(auto f : c.se)dt[x][c.fi].pb(f);
}
par[y] = x;
}
void init(){
ff(i,1,n * m){
par[i] = i;
}
}
int main(){
cin.tie(0)->sync_with_stdio(0);
cin >> n >> m;
vector<vector<int>> mat(n + 1, vector<int>(m + 1));
ff(i,1,n)ff(j,1,m)cin >> mat[i][j];
init();
ff(i,1,n){
ff(j,1,m){
boja[j + (i - 1) * m] = mat[i][j];
ff(k,0,3){
int x = i + dx[k];
int y = j + dy[k];
if(x >= 1 && x <= n && y >= 1 && y <= m){
int u = j + (i - 1) * m;
int v = y + (x - 1) * m;
if(mat[i][j] != mat[x][y]){
dt[u][mat[x][y]].pb(v);
dt[v][mat[i][j]].pb(u);
}
}
}
}
}
ff(i,1,n){
ff(j,1,m){
ff(k,0,3){
int x = i + dx[k];
int y = j + dy[k];
if(x >= 1 && x <= n && y >= 1 && y <= m){
int u = j + (i - 1) * m;
int v = y + (x - 1) * m;
if(mat[i][j] == mat[x][y]){
unite(u, v);
}
}
}
}
}
cin >> q;
while(q--){
int x, y, z;
cin >> x >> y >> z;
int u = findpar(y + (x - 1) * m);
if(dt[u].count(z)){
vector<int> vec;
for(auto c : dt[u][z])if(boja[findpar(c)] == z)vec.pb(c);
for(auto c : vec)unite(u, c);
dt[findpar(u)][z].clear();
}
boja[findpar(u)] = z;
}
ff(i,1,n){
ff(j,1,m)cout << boja[findpar(j + (i - 1) * m)] << " ";
cout << '\n';
}
return 0;
}
/*
// probati bojenje sahovski
*/
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
4 ms |
10072 KB |
Output is correct |
2 |
Correct |
4 ms |
10072 KB |
Output is correct |
3 |
Incorrect |
11 ms |
14172 KB |
Output isn't correct |
4 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
49 ms |
22964 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Correct |
115 ms |
40732 KB |
Output is correct |
2 |
Correct |
134 ms |
41596 KB |
Output is correct |
3 |
Correct |
135 ms |
41088 KB |
Output is correct |
4 |
Correct |
140 ms |
44112 KB |
Output is correct |
5 |
Correct |
125 ms |
42068 KB |
Output is correct |
# |
결과 |
실행 시간 |
메모리 |
Grader output |
1 |
Incorrect |
208 ms |
71508 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |