Submission #920157

#TimeUsernameProblemLanguageResultExecution timeMemory
920157vjudge1Growing Vegetable is Fun 3 (JOI19_ho_t3)C++17
100 / 100
355 ms1010156 KiB
    #include "bits/stdc++.h"
    #pragma optimize ("Bismillahirrahmanirrahim")
    using namespace std;
    #define pb push_back
    #define ff first
    #define ss second
    #define endl "\n" 
    //#define int long long
    #define double long double
    #define sz(x) ((int)(x).size())
    #define all(x) (x).begin(), (x).end()
    #define rall(x) (x).rbegin(), (x).rend()
    #define what_is(x) cerr << #x << " is " << x << endl;
    //#define m (l+r)/2
    constexpr int N=200005;
    constexpr int MOD=1000000007;
    //constexpr int  INF2 = LLONG_MAX;
    constexpr int INF=(int)1e9;
    constexpr int LOG=30;
    typedef pair<int,int> pii;
    typedef tuple<int,int,int> tp;
    typedef priority_queue<pii,vector<pii>,greater<pii>> min_pq;
    typedef priority_queue<pii> max_pq;
    typedef long long ll;
    //to think//
    /*
     * graph approach
     * dp
     * dividing the problem to smaller statements
     * finding the real constraint
     * sqrt decomposition
     * greedy approach
     * pigeonhole principle
     * rewriting the problem/equality 
     * bitwise approaches
     * binary search if monotonic
     * divide and conquer
     * combinatorics
     * inclusion - exclusion
     * think like bfs
    */
     
     
     
    inline int in()
    {
      int x;cin >> x;
      return x;
    }
     
    inline string in2()
    {
      string x;cin >> x;
      return x;
    }
     
    string s;
    int n;
    vector<int> poz[3];
     
    int dp[401][401][401][4];
    int pre[404][3];
     
    inline int cost(int a,int b,int c,int r)
    {
      int res=0;
      if(r==0)
      {
        res+=max(0,pre[poz[0][a]][1]-(b==0 ? 0 : pre[poz[1][b-1]][1]));
        res+=max(0,pre[poz[0][a]][2]-(c==0 ? 0 : pre[poz[2][c-1]][2]));
      }
      else if(r==1)
      {
        res+=max(0,pre[poz[1][b]][0]-(a==0 ? 0 : pre[poz[0][a-1]][0]));
        res+=max(0,pre[poz[1][b]][2]-(c==0 ? 0 : pre[poz[2][c-1]][2]));
      }
      else
      {
        res+=max(0,pre[poz[2][c]][0]-(a==0 ? 0 : pre[poz[0][a-1]][0]));
        res+=max(0,pre[poz[2][c]][1]-(b==0 ? 0 : pre[poz[1][b-1]][1]));
      }
      return max(0,res);
    }
     
    inline int f(int a,int b,int c,int fl)
    {
      if(a+b+c>n) return INF;
      if(a+b+c==n) return 0;
      if(dp[a][b][c][fl]!=-1) return dp[a][b][c][fl];
      if(fl==0)
      {
        if(b==sz(poz[1]) && c==sz(poz[2])) return dp[a][b][c][fl]=INF;
        int cev1=INF;
        if(b<sz(poz[1])) cev1=min(cev1,f(a,b+1,c,1)+cost(a,b,c,1));
        if(c<sz(poz[2])) cev1=min(cev1,f(a,b,c+1,2)+cost(a,b,c,2));
        return dp[a][b][c][fl]=cev1;
      }
      else if(fl==1)
      {
        if(a==sz(poz[0]) && c==sz(poz[2])) return dp[a][b][c][fl]=INF;
        int cev1=INF;
        if(a<sz(poz[0])) cev1=min(cev1,f(a+1,b,c,0)+cost(a,b,c,0));
        if(c<sz(poz[2])) cev1=min(cev1,f(a,b,c+1,2)+cost(a,b,c,2));
        return dp[a][b][c][fl]=cev1;
      }
      else if(fl==2)
      {
        if(a==sz(poz[0]) && b==sz(poz[1])) return dp[a][b][c][fl]=INF;
        int cev1=INF;
        if(a<sz(poz[0])) cev1=min(cev1,f(a+1,b,c,0)+cost(a,b,c,0));
        if(b<sz(poz[1])) cev1=min(cev1,f(a,b+1,c,1)+cost(a,b,c,1));
        return dp[a][b][c][fl]=cev1;
      }
      
      if(a==sz(poz[0]) && b==sz(poz[1]) && c==sz(poz[2])) return dp[a][b][c][fl]=INF;
      int cev1=INF;
      if(a<sz(poz[0])) cev1=min(cev1,f(a+1,b,c,0)+cost(a,b,c,0));
      if(b<sz(poz[1])) cev1=min(cev1,f(a,b+1,c,1)+cost(a,b,c,1));
      if(c<sz(poz[2])) cev1=min(cev1,f(a,b,c+1,2)+cost(a,b,c,2));
      return dp[a][b][c][fl]=cev1;
    }
     
    void solve()
    {
      memset(dp,-1,sizeof(dp));
      n=in();s=in2();
      s="$"+ s;
      for(int i=1;i<=n;i++)
      {
        pre[i][0]=pre[i-1][0];
        pre[i][1]=pre[i-1][1];
        pre[i][2]=pre[i-1][2];
        if(s[i]=='R') {poz[0].pb(i);pre[i][0]++;}
        else if(s[i]=='G') {poz[1].pb(i);pre[i][1]++;}
        else {poz[2].pb(i);pre[i][2]++;} 
      }
      int ans=f(0,0,0,3);
      if(ans==INF) cout << -1 << endl;
      else cout << ans << endl;
    }
     
    int32_t main(){
       
     
         cin.tie(0); ios::sync_with_stdio(0);
         cout << fixed <<  setprecision(15);
       
       int t=1;//cin>> t;
     
     for(int i=1;i<=t;i++)
     {
      //  cout << "Case #" << i << ": ";
        solve();
     }
     
     return 0;
    }

Compilation message (stderr)

joi2019_ho_t3.cpp:2: warning: ignoring '#pragma optimize ' [-Wunknown-pragmas]
    2 |     #pragma optimize ("Bismillahirrahmanirrahim")
      |
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...