제출 #614027

#제출 시각아이디문제언어결과실행 시간메모리
614027MohamedAliSaidaneMonochrome Points (JOI20_monochrome)C++14
35 / 100
2087 ms12968 KiB
#include<bits/stdc++.h>

    using namespace std;

    typedef long long ll;

    typedef pair<int,int> pii;
    typedef pair<ll,ll> pll;

    typedef vector<int> vi;
    typedef vector<ll> vll;
    typedef vector<pii> vpi;
    typedef vector<pll> vpl;

    #define pb push_back
    #define popb pop_back
    #define all(x) (x).begin(), (x).end()


    #define ff first
    #define ss second

    const int nax = 4e5 + 4;
    int n;
    int col[nax], dp[nax];
    vi perm, ot;
    int k  = 1;
    vi st;
    void update(int i, int delt)
    {
        i += k;
        st[i] += delt;
        i /= 2;
        while(i)
        {
            st[i] = st[2 * i ] + st[2 * i + 1];
            i /= 2;
        }
    }
    int query(int p ,int l, int r, int i, int j)
    {
        if( i  > j )
            return 0;
        if(l >= i && r <= j)
            return st[p];
        int m = (l + r)/2;
        return query(2 * p, l, m ,i ,min(j, m))
             + query(2 * p + 1, m + 1, r, max(i,m + 1), j);

    }

    int compute(int x)
    {
        if(x >= n)
            return 0 ;
        if(dp[x] != -1)
            return dp[x];
        vpi inter;
        int rep = 0;
        for(int i=  0 ; i < n; i++)
        {
            int a = perm[(i + x)%n];
            int b = ot[i];
            inter.pb({min(a,b), max(a,b)});
        }
        sort(all(inter));
        reverse(all(inter));
        for(int i=  0 ; i < n; i++)
        {
            int a = inter[i].ff;
            int b=  inter[i].ss;
            rep += query(1, 0, k - 1, a, b);
            update(a, 1);
            update(b, -1);
        }
        for(int i = 0 ;  i < n; i++)
        {
            int a = inter[i].ff;
            int b  = inter[i].ss;
            update(a, -1);
            update(b, 1);
        }
        //cout << x << " " << rep <<"\n";
        return dp[x] = rep;

    }
    int32_t main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0); cout.tie(0);
        memset(dp, -1,sizeof(dp));
        cin >> n;
        k = 1;
        while(k < 2  * n)
            k = (k << 1);
        st.assign(2 * k + 1, 0 );
        for(int i  = 0 ; i < 2 * n ; i++)
        {
            char c; cin >> c;
            if(c == 'B')
                col[i] = 1;
            if(col[i])
                perm.pb(i);
            else
                ot.pb(i);
        }
        int ans = 0 ;
        int debut = 0;
        int fin = n - 1;
        int rep = debut;
        while(debut <= fin )
        {
            int mid = (debut + fin)/2;
            //cout << mid << ' ' << compute(mid) << ' ' << compute(mid + 1) << "\n";
            if(compute(mid + 1) > compute(mid))
            {
                rep = mid + 1;
                debut = mid + 1;
                ans = max(ans, compute(mid + 1));
            }
            else
            {
                rep = mid ;
                fin = mid - 1;
                ans = max(ans, compute(mid ));
            }
        }
        cout << ans;
    }

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

monochrome.cpp: In function 'int32_t main()':
monochrome.cpp:110:13: warning: variable 'rep' set but not used [-Wunused-but-set-variable]
  110 |         int rep = debut;
      |             ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...