結果

問題 No.307 最近色塗る問題多くない?
ユーザー nanophoto12nanophoto12
提出日時 2016-01-01 22:09:55
言語 C++11
(gcc 11.4.0)
結果
AC  
実行時間 880 ms / 4,000 ms
コード長 3,245 bytes
コンパイル時間 940 ms
コンパイル使用メモリ 87,260 KB
実行使用メモリ 204,672 KB
最終ジャッジ日時 2024-11-21 22:15:14
合計ジャッジ時間 5,108 ms
ジャッジサーバーID
(参考情報)
judge4 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 36 ms
43,392 KB
testcase_01 AC 35 ms
43,392 KB
testcase_02 AC 36 ms
43,520 KB
testcase_03 AC 36 ms
43,392 KB
testcase_04 AC 36 ms
43,520 KB
testcase_05 AC 36 ms
43,392 KB
testcase_06 AC 37 ms
43,392 KB
testcase_07 AC 41 ms
43,648 KB
testcase_08 AC 67 ms
45,056 KB
testcase_09 AC 48 ms
44,160 KB
testcase_10 AC 41 ms
43,776 KB
testcase_11 AC 52 ms
44,800 KB
testcase_12 AC 36 ms
43,392 KB
testcase_13 AC 57 ms
43,264 KB
testcase_14 AC 37 ms
43,520 KB
testcase_15 AC 38 ms
43,520 KB
testcase_16 AC 36 ms
43,520 KB
testcase_17 AC 45 ms
44,032 KB
testcase_18 AC 53 ms
44,544 KB
testcase_19 AC 55 ms
44,800 KB
testcase_20 AC 37 ms
43,392 KB
testcase_21 AC 54 ms
44,800 KB
testcase_22 AC 56 ms
44,928 KB
testcase_23 AC 53 ms
45,056 KB
testcase_24 AC 54 ms
44,800 KB
testcase_25 AC 80 ms
44,800 KB
testcase_26 AC 80 ms
44,800 KB
testcase_27 AC 121 ms
60,288 KB
testcase_28 AC 880 ms
204,672 KB
testcase_29 AC 51 ms
43,392 KB
testcase_30 AC 83 ms
44,928 KB
testcase_31 AC 166 ms
67,328 KB
testcase_32 AC 79 ms
44,928 KB
testcase_33 AC 56 ms
45,312 KB
testcase_34 AC 84 ms
45,184 KB
testcase_35 AC 83 ms
45,440 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <vector>
#include <list>
#include <deque>
#include <queue>
#include <stack>
#include <map>
#include <algorithm>
#include <cmath>

using namespace std;

#define FOR(x,y) for(int x = 0;x < y;x++)
#define LLI long long int
#define FORR(x,arr) for(auto& x:arr)
#define ALL(a) (a.begin()),(a.end())

template<int um> class UF {
public:
    vector<int> _parent,_rank;
    UF()
    {
        _parent=_rank=vector<int>(um,0);
        for(int i=0;i<um;i++)
        {
            _parent[i]=i;
        }
    }
    
    int Find(int x)
    {
        if(_parent[x] == x)
        {
            return x;
        }
        _parent[x] = Find(_parent[x]);
        return _parent[x];
    }
    
    int Union(int x,int y)
    {
        int xRoot = Find(x);
        int yRoot = Find(y);
        if(_rank[xRoot]>_rank[yRoot])
        {
            _parent[xRoot] = yRoot;
           return yRoot;
        }
        if(_rank[xRoot]<_rank[yRoot])
        {
            _parent[yRoot] = xRoot;
            return xRoot;
        }
        if(xRoot != yRoot)
        {
            _parent[yRoot] = xRoot;
            _rank[xRoot]++;
            return xRoot;
        }
        return xRoot;
    }
};

int H,W,Q;
int Board[201*201];
vector<int> S[201*201];
int GetIndex(int y,int x)
{
    return y*W+x;
}

UF<5000000> uf;

int main() {
    cin >> H >> W;
    FOR(y, H)
    {
        FOR(x, W)
        {
            cin >> Board[GetIndex(y, x)];
        }
    }
    
    
    FOR(y,H) FOR(x,W) {
        if(y) {
            if(Board[GetIndex(y,x)]==Board[GetIndex(y-1,x)]) uf.Union(GetIndex(y,x),GetIndex(y-1,x));
            else S[GetIndex(y,x)].push_back(GetIndex(y-1,x));
        }
        if(y<H-1) {
            if(Board[GetIndex(y,x)]==Board[GetIndex(y+1,x)]) uf.Union(GetIndex(y,x),GetIndex(y+1,x));
            else S[GetIndex(y,x)].push_back(GetIndex(y+1,x));
        }
        if(x) {
            if(Board[GetIndex(y,x)]==Board[GetIndex(y,x-1)]) uf.Union(GetIndex(y,x),GetIndex(y,x-1));
            else S[GetIndex(y,x)].push_back(GetIndex(y,x-1));
        }
        if(x<W-1) {
            if(Board[GetIndex(y,x)]==Board[GetIndex(y,x+1)]) uf.Union(GetIndex(y,x),GetIndex(y,x+1));
            else S[GetIndex(y,x)].push_back(GetIndex(y,x+1));
        }
    }
    
    FOR(x,H*W)
    {
      if(uf.Find(x)!=x)
      {
        FORR(r,S[x]) S[uf.Find(x)].push_back(r);
      }
    }
    FOR(x,H*W)
    {
        if(uf.Find(x)==x)
        {
            sort(ALL(S[x]));
            S[x].erase(unique(ALL(S[x])),S[x].end());
        }
    }
    cin>>Q;
    FOR(i,Q) {
        int y, x, k;
        cin>>y>>x>>k;
        int parent =uf.Find(GetIndex(y-1,x-1));
        if(Board[parent]==k) continue;
        
        vector<int> NEW;
        FORR(r,S[parent])
        {
          if(uf.Find(parent)!=uf.Find(r))
          {
              FORR(r2,S[uf.Find(r)]) if(uf.Find(r2)!=uf.Find(parent)) NEW.push_back(uf.Find(r2));
              uf.Union(parent,r);
          }
        }
        sort(ALL(NEW));
        NEW.erase(unique(ALL(NEW)),NEW.end());
        
        S[uf.Find(parent)]=NEW;
        Board[uf.Find(parent)]=k;
    }
    
    FOR(y,H) FOR(x,W) printf("%d%c",Board[uf.Find(GetIndex(y,x))],(x==W-1)?'\n':' ');
    return 0;
}
0