제출 #240891

#제출 시각아이디문제언어결과실행 시간메모리
240891aggu_01000101Dango Maker (JOI18_dango_maker)C++14
33 / 100
819 ms262148 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #define INF 100000000000000000 //#define int long long #define lchild(i) (i*2 + 1) #define rchild(i) (i*2 + 2) #define mid(l, u) ((l+u)/2) #define x(p) p.first #define y(p) p.second #define MOD 998244353 #define ordered_set tree<pair<int, int>, null_type,less<pair<int, int>>, rb_tree_tag,tree_order_statistics_node_update> using namespace std; int n, m; const int N = 3000;//first->horizontal, second -> vertical vector<bool> vis; vector<vector<int>> adj; int currnode = 0; int solve(int i){ vector<int> lvls; queue<pair<int, int>> q; q.push({i, 0}); vis[i] = true; while(!q.empty()){ pair<int, int> curr = q.front(); q.pop(); if(lvls.size()<=curr.second) lvls.push_back(1); else lvls[curr.second]++; for(int j: adj[curr.first]){ if(vis[j]) continue; vis[j] = true; q.push({j, curr.second + 1}); } } if(lvls.size()==1) return lvls[0]; if(lvls.size()==2) return max(lvls[0], lvls[1]); pair<int, int> dp = {lvls[0], lvls[1]}; int tr = max(dp.first, dp.second); for(int i = 2;i<lvls.size();i++){ int temp = max(dp.first + lvls[i], dp.second); dp.first = dp.second; dp.second = temp; tr = max(tr, temp); } return tr; } signed main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin>>n>>m; char mat[n][m]; pair<int, int> nodenum[n][m]; for(int i = 0;i<n;i++){ string s; for(int j = 0;j<m;j++) cin>>mat[i][j]; } for(int i = 0;i<n;i++){ for(int j = 0;j<m;j++) nodenum[i][j] = {-1, -1}; } for(int i = 0;i<n;i++){ for(int j = 0;j<m;j++){ if(mat[i][j]!='R') continue; if(i+2<n){ if(mat[i+1][j]=='G' && mat[i+2][j]=='W'){ int cnode = currnode++; vis.push_back(false); adj.push_back({}); //cout<<cnode<<" is ("<<i<<", "<<j<<") vertical"<<endl; nodenum[i][j].second = cnode; /*if(nodenum[i][j].first != -1){ adj[nodenum[i][j].first].insert(cnode); adj[cnode].insert(nodenum[i][j].first); } if(j>0 && nodenum[i+1][j-1].first!=-1){ adj[nodenum[i+1][j-1].first].insert(cnode); adj[cnode].insert(nodenum[i+1][j-1].first); } if(j>1 && nodenum[i+2][j-2].first!=-1){ adj[nodenum[i+2][j-2].first].insert(cnode); adj[cnode].insert(nodenum[i+2][j-2].first); }*/ } } if(j+2<m){ if(mat[i][j+1]=='G' && mat[i][j+2]=='W'){ int cnode = currnode++; vis.push_back(false); adj.push_back({}); //cout<<cnode<<" is ("<<i<<", "<<j<<") horizontal"<<endl; nodenum[i][j].first = cnode; if(nodenum[i][j].second != -1){ adj[nodenum[i][j].second].push_back(cnode); adj[cnode].push_back(nodenum[i][j].second); } if(i>0 && nodenum[i-1][j+1].second!=-1){ adj[nodenum[i-1][j+1].second].push_back(cnode); adj[cnode].push_back(nodenum[i-1][j+1].second); } if(i>1 && nodenum[i-2][j+2].second!=-1){ adj[nodenum[i-2][j+2].second].push_back(cnode); adj[cnode].push_back(nodenum[i-2][j+2].second); } } } } } int ans = 0; for(int i = 0;i<currnode;i++){ /*cout<<i<<" is connected to: "; for(int j: adj[i]){ cout<<j<<" "; } cout<<endl; */ if(!vis[i]){ ans+=solve(i); } } cout<<ans<<endl; //create a node out of each skewer that you can make //connect nodes that intersect with each other //For each connected component, } /* 4 4 RGWR GRRG WGGW WWWR 5 5 RGRGW GRRGW WGGWR RWRGW RGWGW */

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

dango_maker.cpp: In function 'int solve(int)':
dango_maker.cpp:27:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         if(lvls.size()<=curr.second) lvls.push_back(1);
            ~~~~~~~~~~~^~~~~~~~~~~~~
dango_maker.cpp:39:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i = 2;i<lvls.size();i++){
                   ~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...