제출 #246441

#제출 시각아이디문제언어결과실행 시간메모리
246441groeneprofGrowing Vegetable is Fun 3 (JOI19_ho_t3)C++14
75 / 100
566 ms109692 KiB
#include <bits/stdc++.h> //#define int long long #define P(x) do {if(debug) cout << x << endl;} while(false) #define H(x) P(#x << ": " << x) #define FR(i, a, b) for(int i = (a); i < (b); ++i) #define F(i, n) FR(i, 0, n) #define DR(i, a, b) for(int i = (b); i --> (a);) #define D(i, n) DR(i, 0, n) #define S(s) (int)(s).size() #define ALL(x) (x).begin(), (x).end() #define MI(x, a) (x) = min(x, a) #define MA(x, a) (x) = max(x, a) #define V vector #define pb push_back #define mp make_pair using namespace std; const bool debug = 0; const int inf = 1e9; int n; vector<int> color; vector<int> pos[3]; int dp[400][400][400][3]; bool vis[400][400][400][3]; int ft[401]; void u(int i, int v){ for(int j = i; j<=n; j+=(j&-j)){ ft[j]+=v; } } void update(int i, int j, int v){ u(i+1, v); u(j+1, -v); } int query(int i){ int res = 0; for(int j = i+1; j>0; j-=(j&-j)){ res += ft[j]; } return res; } int solve(int a[3], int last){ int g = a[0], y = a[1], r = a[2]; H(g); H(y); H(r); H(last); int j = g + y + r; if(vis[g][y][r][last]){ P("visited, return: "<<dp[g][y][r][last]); return dp[g][y][r][last]; } if(g+y+r==n){ P("reached end"); return 0; } vis[g][y][r][last] = 1; dp[g][y][r][last] = inf; for(int i = 0; i<3; i++) if(i!=last && a[i] < pos[i].size()){ H(i); int extra = pos[i][a[i]] + query(pos[i][a[i]]) - j; update(0,pos[i][a[i]],1); a[i] ++; dp[g][y][r][last] = min(dp[g][y][r][last], solve(a,i)+extra); P("a"); a[i] --; P("b"); update(0,pos[i][a[i]],-1); P("c"); } P("d"); P(g<<" "<<y<<" "<<r<<" "<<last<<" returns "<< dp[g][y][r][last]); return dp[g][y][r][last]; } signed main() { ios_base::sync_with_stdio(false); cin.tie(0); cin>>n; map<char,int> mp; color.resize(n); mp['G'] = 0; mp['Y'] = 1; mp['R'] = 2; for(int i = 0; i<n; i++){ char c; cin>>c; color[i] = mp[c]; pos[mp[c]].push_back(i); } int a[] = {0,0,0}; int ans = min(solve(a,0),solve(a,1)); if(ans < 1e6){ cout<<ans<<endl; } else{ cout<<-1<<endl; } return 0; }

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

joi2019_ho_t3.cpp: In function 'int solve(int*, int)':
joi2019_ho_t3.cpp:62:46: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i = 0; i<3; i++) if(i!=last && a[i] < pos[i].size()){
                                         ~~~~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...