제출 #136411

#제출 시각아이디문제언어결과실행 시간메모리
136411KLPPDango Maker (JOI18_dango_maker)C++14
33 / 100
1141 ms262144 KiB
#include<bits/stdc++.h>

using namespace std;
typedef long long int lld;
typedef pair<lld,lld> pii;
#define rep(i,a,b) for(int i=a;i<b;i++)
#define trav(a,v) for(auto a:v)
int has[3000][3000][2];
int n,m;
bool valid(int x, int y){
  if(x>=0 && x<n && y>=0 && y<m)return true;
  return false;
}
bool visited[1000000];
int size;
bool visited2[3000];
int independent;
vector<int> graph[1000000];
vector<int> tree[3000];
short int DP[3000][2];
vector<int> cmp;
vector<int> graph2[3000];
void DFS(int node){
  visited[node]=true;
  cmp.push_back(node);
  trav(v,graph[node]){
    if(!visited[v]){
      //tree[node].push_back(v);
      DFS(v);
    }
  }
}
void DFS2(int node){
  visited2[node]=true;
  trav(v,graph2[node]){
    if(!visited2[v]){
      tree[node].push_back(v);
      DFS2(v);
    }
  }
}
int BS(int lo, int hi, int target){
  int mid=(hi+lo)/2;
  if(cmp[mid]==target)return mid;
  if(cmp[mid]<target)return BS(mid+1,hi,target);
  if(cmp[mid]>target)return BS(lo,mid-1,target);
}
int compute(int node, int x){
  //cout<<node<<"C"<<x<<endl;
  if(DP[node][x]!=-1)return DP[node][x];
  DP[node][x]=0;
  if(x==0){
    trav(v,tree[node]){
      DP[node][x]+=max(compute(v,0),compute(v,1));
    }
    return DP[node][x];
  }
  DP[node][x]++;
  trav(v,tree[node]){
    DP[node][x]+=compute(v,0);
  }
  return DP[node][x];
}
int main(){
  
  cin>>n>>m;
  string table[n];
  rep(i,0,n){
    cin>>table[i];
  }
  int V=0;
  int H=0;
  vector<pii> v;
  vector<pii> h;
  rep(i,0,n){
    rep(j,0,m){
      has[i][j][0]=-1;
      has[i][j][1]=-1;
      if(table[i][j]=='R'){
	if(i+2<n && table[i+1][j]=='G' && table[i+2][j]=='W'){
	  has[i][j][0]=V;
	  V++;
	  v.push_back(pii(i,j));
	}
	if(j+2<m && table[i][j+1]=='G' && table[i][j+2]=='W'){
	  has[i][j][1]=H;
	  H++;
	  h.push_back(pii(i,j));
	}
      }
    }
  }
  rep(i,0,n){
    rep(j,0,m){
      if(has[i][j][0]!=-1){
	if(has[i][j][1]!=-1){
	  graph[has[i][j][0]].push_back(has[i][j][1]+V);
	  graph[has[i][j][1]+V].push_back(has[i][j][0]);
	}
	if(valid(i+1,j-1) && has[i+1][j-1][1]!=-1){
	  graph[has[i][j][0]].push_back(has[i+1][j-1][1]+V);
	  graph[has[i+1][j-1][1]+V].push_back(has[i][j][0]);
	}
	if(valid(i+2,j-2) && has[i+2][j-2][1]!=-1){
	  graph[has[i][j][0]].push_back(has[i+2][j-2][1]+V);
	  graph[has[i+2][j-2][1]+V].push_back(has[i][j][0]);
	}
      }
    }
  }
  //cout<<V+H<<endl;
  
  rep(i,0,V+H){
    visited[i]=false;
  }
  int ans=0;
  rep(i,0,V+H){
    if(!visited[i]){
      
      DFS(i);
      sort(cmp.begin(),cmp.end());
      rep(i,0,cmp.size()){
	visited2[i]=false;
      }
      rep(i,0,cmp.size()){
	DP[i][0]=-1;
	DP[i][1]=-1;
    
      }
      //cout<<cmp.size()<<endl;
      /*trav(x,cmp)cout<<x<<endl;
      cout<<endl;*/
      trav(x,cmp){
	trav(y,graph[x]){
	  //cout<<BS(0,cmp.size()-1,x)<<"A "<<BS(0,cmp.size()-1,y)<<endl;
	  graph2[BS(0,cmp.size()-1,x)].push_back(BS(0,cmp.size()-1,y));
	  
	}
      }
      DFS2(0);
      /*while(!q.empty()){
	//if(q.front()<V)cout<<v[q.front()].first<<","<<v[q.front()].second<<" ";
	//if(q.front()>=V)cout<<h[q.front()-V].first<<","<<h[q.front()-V].second<<" ";
	visited[q.front()]=false;
	q.pop();
      }//cout<<endl;*/
      //cout<<compute(0,0)<<" "<<compute(0,1)<<endl;
      ans+=max(compute(0,0),compute(0,1));
      rep(i,0,cmp.size()){
	graph2[i].clear();
	tree[i].clear();
      }
      cmp.clear();
      //cout<<independent<<" "<<size-independent<<"A"<<endl;
    }
  }
  /*rep(i,0,V+H){
    cout<<compute(i,0)<<" "<<compute(i,1)<<endl;
  }*/
  cout<<ans<<endl;
  
  return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

dango_maker.cpp: In function 'int main()':
dango_maker.cpp:6:33: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define rep(i,a,b) for(int i=a;i<b;i++)
dango_maker.cpp:122:11:
       rep(i,0,cmp.size()){
           ~~~~~~~~~~~~~~         
dango_maker.cpp:122:7: note: in expansion of macro 'rep'
       rep(i,0,cmp.size()){
       ^~~
dango_maker.cpp:6:33: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define rep(i,a,b) for(int i=a;i<b;i++)
dango_maker.cpp:125:11:
       rep(i,0,cmp.size()){
           ~~~~~~~~~~~~~~         
dango_maker.cpp:125:7: note: in expansion of macro 'rep'
       rep(i,0,cmp.size()){
       ^~~
dango_maker.cpp:6:33: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define rep(i,a,b) for(int i=a;i<b;i++)
dango_maker.cpp:149:11:
       rep(i,0,cmp.size()){
           ~~~~~~~~~~~~~~         
dango_maker.cpp:149:7: note: in expansion of macro 'rep'
       rep(i,0,cmp.size()){
       ^~~
dango_maker.cpp: In function 'int BS(int, int, int)':
dango_maker.cpp:47:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...