제출 #209293

#제출 시각아이디문제언어결과실행 시간메모리
209293AryaKnightGrowing Vegetable is Fun 3 (JOI19_ho_t3)C++14
100 / 100
412 ms102264 KiB
#pragma GCC optimize("Ofast","unroll-loops","omit-frame-pointer","inline") //Optimization flags
    #pragma GCC option("arch=native","tune=native","no-zero-upper") //Enable AVX
    #pragma GCC target("avx2")  //Enable AVX
    #include<bits/stdc++.h>
    using namespace std;
     
    #define all(a) begin(a),end(a)
    #define F first
    #define S second
    #define pb push_back
    #define mp make_pair
    typedef long long ll;
    typedef vector<int> vi;
    typedef pair<int,int> pi;
     
    #ifdef LOCAL
    #include "debug.h"
    #else
    #define debug(...) 42
    #endif
     
    void clr(auto &a,int n){
      a.clear();
      a.resize(n);
    }
     
    template <typename A, typename B>
    istream& operator>>(istream& input,pair<A,B>& x) {
      input>>x.F>>x.S;
      return input;
    }
     
    template <typename A>
    istream& operator>>(istream& input,vector<A>& x) {
      for(auto& i:x)
        input>>i;
      return input;
    }
     
    template<typename A>
    ostream& operator<<(ostream& output,vector<A>& x) {
      for(auto& i:x)
        output<<i<<' ';
      return output;
    }
     
    template<typename T>
    vector<pair<T,int>> getvec(int n){
      vector<pair<T,int>>a(n);
      for(int i=0;i<a.size();i++){
        cin>>a[i].F;
        a[i].S=i;
      }
      return a;
    }
     
    const int mod=1e9+7;
     
    mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
     
    int mul(int a,int b){
      return ((a)*1ll*(b))%mod;
    }
     
    void add(int &a,int b){
      a+=b;
      if(a>=mod)a-=mod;
    }
     
    int sub(int a,int b){
      a-=b;
      if(a<0){
        a+=mod;
      }
      return a;
    }
     
    int powz(int a,int b){
      int res=1;
      while(b){
        if(b&1){
          res=mul(res,a);
        }
        b/=2;
        a=mul(a,a);
      }
      return res;
    }
     
    const int N=410;
     
    int dp[250][250][3],new_dp[250][250][3];
    vector<int>adj[3];
    struct ordered_set {
      int sz = 0, bit[N];
     
      int size() {
        return sz;
      }
     
      void update(int k, int x) {
        k++;
        while (k < N) {
          bit[k] += x;
          k += k & -k;
        }
        sz += x;
      }
     
      int find_by_order(int k) {
        int ans = 0, sum = 0;
        for (int j = 17; j >= 0; --j) {
          ans += 1 << j;
          if (ans < N && sum + bit[ans] < k) {
            sum += bit[ans];
          } else {
            ans -= 1 << j;
          }
        }
        return ans + 1;
      }
     
      int order_of_key(int k) {
        k++;
        int ans = 0;
        while (k >= 1) {
          ans += bit[k];
          k -= k & -k;
        }
        return ans - 1;
      }
    }st[250][250];
     
    vector<int>rv;
     
    void solve(){
      int n;
      cin>>n;
      string s;
      cin>>s;
      rv.resize(n);
      for(int i=0;i<s.length();i++){
        if(s[i]=='R'){
          adj[0].pb(i);
          rv[i]=adj[0].size()-1;
        }
        else if(s[i]=='G'){
          adj[1].pb(i);
          rv[i]=adj[1].size()-1;
        }
        else{
          adj[2].pb(i);
        }
      }
      int mx=max({(int)adj[0].size(),(int)adj[1].size(),(int)adj[2].size()});
      if(mx*2>(n+10)){
        cout<<-1;
        return;
      }
      for(int i=0;i<=adj[0].size();i++){
        for(int j=0;j<=adj[1].size();j++){
          for(int k=0;k<n;k++){
            if(s[k]=='R'){
              if(rv[k]>=i){
                st[i][j].update(k,1);
              }
            }
            else if(s[k]=='G'){
              if(rv[k]>=j){
                st[i][j].update(k,1);
              }
            }
            else{
              st[i][j].update(k,1);
            }
          }
        }
      }
      for(int j=0;j<=adj[0].size();j++){
        for(int k=0;k<=adj[1].size();k++){
          for(int l=0;l<3;l++){
            dp[j][k][l]=new_dp[j][k][l]=1e9;
          }
        }
      }
      dp[0][0][0]=0;
      dp[0][0][1]=0;
      dp[0][0][2]=0;
      for(int i=0;i<n;i++){
        for(int j=0;j<=min(i,(int)adj[0].size());j++){
          for(int k=0;k<=min(i,(int)adj[1].size());k++){
            if(i-(j+k)<0){
              break;
            }
            //for(int l=0;l<3;l++){
	    int l=0;
              if(dp[j][k][l]!=1e9){
                
               int put=0;
                if(put!=l){
                  if(j+1<=adj[0].size()){
                    
                  
	       
                  int fnd=st[j][k].order_of_key(adj[0][j]);
                  new_dp[j+1][k][0]=min(new_dp[j+1][k][0],dp[j][k][l]+fnd);}
                }
              put=1;
                if(put!=l){
                  if(k+1<=adj[1].size()){
                    
                  int fnd=st[j][k].order_of_key(adj[1][k]);
                  new_dp[j][k+1][1]=min(new_dp[j][k+1][1],dp[j][k][l]+fnd);}
                }
              put=2;
                if(put!=l){
                  if((i-(j+k)+1)<=adj[2].size()){
                   
                  int fnd=st[j][k].order_of_key(adj[2][i-(j+k)]);
                  new_dp[j][k][2]=min(new_dp[j][k][2],dp[j][k][l]+fnd);}
              }
	      }
	      l=1;
	      if(dp[j][k][l]!=1e9){
                
               int put=0;
                if(put!=l){
                  if(j+1<=adj[0].size()){
                    
                  
	       
                  int fnd=st[j][k].order_of_key(adj[0][j]);
                  new_dp[j+1][k][0]=min(new_dp[j+1][k][0],dp[j][k][l]+fnd);}
                }
              put=1;
                if(put!=l){
                  if(k+1<=adj[1].size()){
                    
                  int fnd=st[j][k].order_of_key(adj[1][k]);
                  new_dp[j][k+1][1]=min(new_dp[j][k+1][1],dp[j][k][l]+fnd);}
                }
              put=2;
                if(put!=l){
                  if((i-(j+k)+1)<=adj[2].size()){
                   
                  int fnd=st[j][k].order_of_key(adj[2][i-(j+k)]);
                  new_dp[j][k][2]=min(new_dp[j][k][2],dp[j][k][l]+fnd);}
              }
	      }
	      l=2;
	      if(dp[j][k][l]!=1e9){
                
               int put=0;
                if(put!=l){
                  if(j+1<=adj[0].size()){
                    
                  
	       
                  int fnd=st[j][k].order_of_key(adj[0][j]);
                  new_dp[j+1][k][0]=min(new_dp[j+1][k][0],dp[j][k][l]+fnd);}
                }
              put=1;
                if(put!=l){
                  if(k+1<=adj[1].size()){
                    
                  int fnd=st[j][k].order_of_key(adj[1][k]);
                  new_dp[j][k+1][1]=min(new_dp[j][k+1][1],dp[j][k][l]+fnd);}
                }
              put=2;
                if(put!=l){
                  if((i-(j+k)+1)<=adj[2].size()){
                   
                  int fnd=st[j][k].order_of_key(adj[2][i-(j+k)]);
                  new_dp[j][k][2]=min(new_dp[j][k][2],dp[j][k][l]+fnd);}
              }
	      }
            }
        }
        for(int j=0;j<=min(i+1,(int)adj[0].size());j++){
          for(int k=0;k<=min(i+1,(int)adj[1].size());k++){
            if(i-(j+k)<0){
              break;
            }
            if(i+1-(j+k)>adj[2].size()){
              continue;
            }
            st[j][k].update(adj[2][i-(j+k)],-1);
          }
        }
        for(int j=0;j<=(int)adj[0].size();j++){
          for(int k=0;k<=(int)adj[1].size();k++){
            for(int l=0;l<3;l++){
              dp[j][k][l]=new_dp[j][k][l];
              new_dp[j][k][l]=1e9;
            }
          }
        }
      }
      int ans=1e9;
      ans=min(ans,dp[adj[0].size()][adj[1].size()][0]);
      ans=min(ans,dp[adj[0].size()][adj[1].size()][1]);
      ans=min(ans,dp[adj[0].size()][adj[1].size()][2]);
      if(ans==1e9){
        ans=-1;
      }
      cout<<ans;  
    }
     
    signed main(){
      ios_base::sync_with_stdio(false);
      cin.tie(NULL);
      int tc=1;
      //cin>>tc;
      for(int _=0;_<tc;_++){
        // cout<<"Case #"<<_+1<<": ";
        solve();
        if(_!=tc-1){
          cout<<'\n';
        }
      }
    }

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

joi2019_ho_t3.cpp:2:0: warning: ignoring #pragma GCC option [-Wunknown-pragmas]
     #pragma GCC option("arch=native","tune=native","no-zero-upper") //Enable AVX
 
joi2019_ho_t3.cpp: In function 'void solve()':
joi2019_ho_t3.cpp:142:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
       for(int i=0;i<s.length();i++){
                   ~^~~~~~~~~~~
joi2019_ho_t3.cpp:160:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
       for(int i=0;i<=adj[0].size();i++){
                   ~^~~~~~~~~~~~~~~
joi2019_ho_t3.cpp:161:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int j=0;j<=adj[1].size();j++){
                     ~^~~~~~~~~~~~~~~
joi2019_ho_t3.cpp:179:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
       for(int j=0;j<=adj[0].size();j++){
                   ~^~~~~~~~~~~~~~~
joi2019_ho_t3.cpp:180:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(int k=0;k<=adj[1].size();k++){
                     ~^~~~~~~~~~~~~~~
joi2019_ho_t3.cpp:201:25: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                   if(j+1<=adj[0].size()){
                      ~~~^~~~~~~~~~~~~~~
joi2019_ho_t3.cpp:210:25: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                   if(k+1<=adj[1].size()){
                      ~~~^~~~~~~~~~~~~~~
joi2019_ho_t3.cpp:217:33: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                   if((i-(j+k)+1)<=adj[2].size()){
                      ~~~~~~~~~~~^~~~~~~~~~~~~~~
joi2019_ho_t3.cpp:228:25: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                   if(j+1<=adj[0].size()){
                      ~~~^~~~~~~~~~~~~~~
joi2019_ho_t3.cpp:237:25: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                   if(k+1<=adj[1].size()){
                      ~~~^~~~~~~~~~~~~~~
joi2019_ho_t3.cpp:244:33: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                   if((i-(j+k)+1)<=adj[2].size()){
                      ~~~~~~~~~~~^~~~~~~~~~~~~~~
joi2019_ho_t3.cpp:255:25: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                   if(j+1<=adj[0].size()){
                      ~~~^~~~~~~~~~~~~~~
joi2019_ho_t3.cpp:264:25: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                   if(k+1<=adj[1].size()){
                      ~~~^~~~~~~~~~~~~~~
joi2019_ho_t3.cpp:271:33: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                   if((i-(j+k)+1)<=adj[2].size()){
                      ~~~~~~~~~~~^~~~~~~~~~~~~~~
joi2019_ho_t3.cpp:284:25: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             if(i+1-(j+k)>adj[2].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...