結果
| 問題 |
No.307 最近色塗る問題多くない?
|
| コンテスト | |
| ユーザー |
IL_msta
|
| 提出日時 | 2015-11-28 17:41:56 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 3,710 bytes |
| コンパイル時間 | 1,135 ms |
| コンパイル使用メモリ | 110,920 KB |
| 実行使用メモリ | 14,016 KB |
| 最終ジャッジ日時 | 2024-09-14 04:56:18 |
| 合計ジャッジ時間 | 10,051 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 28 TLE * 1 -- * 7 |
ソースコード
#define _USE_MATH_DEFINES
#include <iostream>
#include <iomanip>
#include <sstream>
#include <algorithm>
#include <cmath>
#include <string>
#include <queue>
#include <vector>
#include <complex>
#include <set>
#include <map>
#include <stack>
#include <list>
#include <valarray>
#include<cassert>//assert();
//#include <random>//xAOJ
/////////
#define REP(i, x, n) for(int i = x; i < n; i++)
#define rep(i,n) REP(i,0,n)
#define P(p) cout<<(p)<<endl;
#define PII pair<int,int>
/////////
typedef long long LL;
typedef long double LD;
typedef unsigned long long ULL;
/////////
using namespace::std;
/////////
/////////
class UnionFind{
public:
int cNum;//要素数
int cSize;//
vector<int> parent;
vector<int> rank;
vector<bool> color;
vector< vector< int > > tonari;
UnionFind(int n){
cNum = n;
cSize = n;
parent = vector<int>(n);
rank = vector<int>(n,0);
color = vector<bool>(n);
tonari = vector< vector<int> >(n);
for(int i=0;i<n;++i){parent[i] = i;}
}
int find(int x){
if( parent[x] == x ){return x;}
return parent[x] = find( parent[x] );
}
bool same(int x,int y){return find(x) == find(y);}
void add(int x,int y){//union yの方に結びつけ
--cSize;
x = find(x);
y = find(y);
if( x==y )return;
if( rank[x] == rank[y] ){
parent[x] = y;
++rank[y];
}
if( rank[x] < rank[y] ){
parent[x] = y;
}else{
parent[y] = x;
swap(x,y);
}
//////
vector<int> temp;
vector<int>::iterator it,endit;
it = tonari[x].begin();
endit = tonari[x].end();
for(;it != endit;++it){
if( !same(y,*it) ){
temp.push_back(*it);
}
}
tonari[x].clear();
it = tonari[y].begin();
endit = tonari[y].end();
for(;it != endit;++it){
if( !same(y,*it) ){
temp.push_back(*it);
}
}
sort( temp.begin(), temp.end() );
temp.erase( unique( temp.begin(), temp.end() ), temp.end() );
tonari[y].swap( temp );
}
void tonariAdd(int atti,int kotti){
tonari[ find(atti) ].push_back(kotti);
tonari[ find(kotti) ].push_back(atti);
}
};
void solve(){
int H,W;
cin >> H >> W;
UnionFind UF(H*W);
int incolor;
for(int h=0;h<H;++h){
for(int w=0;w<W;++w){
cin >> incolor;
if( incolor == 1 ){
UF.color[h*W + w] = true;
}else{
UF.color[h*W + w] = false;
}
}
}
////////////////
if( 1<H && UF.color[0] == UF.color[1] ){
UF.add(0,1);
}else{
UF.tonariAdd(0,1);
}
if( 1<W && UF.color[0] == UF.color[W] ){
UF.add(0,W);
}else{
UF.tonariAdd(0,W);
}
for(int h=0;h<H;++h){
for(int w=0;w<W;++w){
if( h> 0 ){
if( UF.color[h*W+w] == UF.color[(h-1)*W + w] ){
UF.add(h*W+w,(h-1)*W+w );
}else{
UF.tonariAdd(h*W+w,(h-1)*W+w);
}
}
if( w> 0 ){
if( UF.color[h*W+w] == UF.color[h*W+(w-1)] ){
UF.add( h*W+w,h*W+(w-1) );
}else{
UF.tonariAdd(h*W+w,h*W+(w-1) );
}
}
}
}
////////////////
int Q;
cin >> Q;
int R,C,Xnum;
bool X;
vector<int >::iterator it,endit;
int ter;
vector<int> tempVec;
while(Q--){
cin >> R >> C >> Xnum;
--R;--C;
if( Xnum == 1 ){
X = true;
}else{
X = false;
}
ter = UF.find(R*W+C);
if( UF.color[ ter ] == X ) continue;
UF.color[ter] = X;
if( UF.cSize == 1 ){ continue;}
tempVec.clear();
tempVec.swap( UF.tonari[ ter ] );
it = tempVec.begin();
endit = tempVec.end();
for(;it != endit;++it){
UF.add( ter, *it);
}
}
for(int h=0;h<H;++h){
for(int w = 0;w<W;++w){
if( w != 0 ){
cout << ' ';
}
if( UF.color[ UF.find(h*W+w) ] ){
cout << 1;
}else{
cout << 0;
}
}
cout << endl;
}
}
int main(void){
std::cin.tie(0);
std::ios::sync_with_stdio(false);
std::cout << std::fixed;//
//cout << setprecision(16);//
//cpp
solve();
return 0;
}
IL_msta