답안 #623118

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
623118 2022-08-05T08:28:22 Z Mahdi Monochrome Points (JOI20_monochrome) C++17
0 / 100
1 ms 596 KB
#include<bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
#define all(v) v.begin(), v.end()
#define F first
#define S second
typedef long long ll;
typedef pair<int, int> pii;
const int N=2e5+5;
int n, cws[N], cbs[N], cwt[N], cbt[N];
bool g[N], h[N];

ll BW(const string &s, const string &t){
    int m=s.size();
    vector<int>ws, bs, wt, bt;
    for(int i=1;i<=m;++i){
        cws[i]=cws[i-1];
        cbs[i]=cbs[i-1];
        cwt[i]=cwt[i-1];
        cbt[i]=cbt[i-1];
        if(s[i-1]=='W'){
            ws.push_back(i);
            ++cws[i];
        }
        else{
            bs.push_back(i);
            ++cbs[i];
        }
        if(t[i-1]=='B'){
            bt.push_back(i);
            ++cbt[i];
        }
        else{
            wt.push_back(i);
            ++cwt[i];
        }
    }
    /*if(m==16){
        for(int i=0;i<=m;++i)
            cout<<cws[i]<<' '<<cbs[i]<<' '<<cwt[i]<<' '<<cbt[i]<<'\n';
    }*/
    ll ans=0;
    for(int i=0;i<ws.size();++i){
        int x=ws[i], y=bt[bt.size()-i-1];
        int xyz=ans;
        /*if(m==16){
            cout<<x<<' '<<y<<" : ";
        }*/
        ans+=min(cws[x-1], cbt[m]-cbt[y])+min(cbs[x-1], cwt[m]-cwt[y])+min(cws[m]-cws[x], cbt[y-1])+min(cbs[m]-cbs[x], cwt[y-1]);
    /*    if(m==16){
            cout<<ans-xyz<<'\n';
        }*/
    }
    for(int i=0;i<bs.size();++i){
        int x=bs[i], y=wt[wt.size()-i-1];
        int xyz=ans;
        /*if(m==16){
            cout<<x<<' '<<y<<" : ";
        }*/
        ans+=min(cws[x-1], cbt[m]-cbt[y])+min(cbs[x-1], cwt[m]-cwt[y])+min(cws[m]-cws[x], cbt[y-1])+min(cbs[m]-cbs[x], cwt[y-1]);
        /*if(m==16){
            cout<<ans-xyz<<"\n";
        }*/
    }
    return ans/2;
}

ll BW(const int &k, const string &s, const string &t){
    //cout<<"-------------------------------------\n";
    vector<int>ws, bs, wt, bt;
    memset(g, 1, sizeof(g));
    memset(h, 1, sizeof(h));
    for(int i=0;i<n;++i){
        //cout<<i<<'\n';
        if(ws.size()<k && s[i]=='W'){
            ws.push_back(i);
            g[i]=0;
        }
        if(bt.size()<k && t[i]=='B'){
            bt.push_back(i);
            h[i]=0;
        }
    }
    for(int i=n-1;i>=0;--i){
        if(bs.size()<k && s[i]=='B'){
            bs.push_back(i);
            g[i]=0;
        }
        if(wt.size()<k && t[i]=='W'){
            wt.push_back(i);
            h[i]=0;
        }
    }
    //cout<<"ok\n";
    reverse(all(bs));
    reverse(all(wt));
    //cout<<k<<'\n';
    if(ws.size()!=k || wt.size()!=k || (k>0 && (ws[k-1]>bs[0] || bt[k-1]>wt[0])))
        return 0;
    //cout<<"nok\n";
    ll ans=-1LL*k*(k-1);
    for(int i=0;i<k;++i){
        ans+=bs[0]-ws[0]-1;
        ans+=wt[0]-bt[0]-1;
    }
 /*   if(k==5){
        cout<<"how : \n";
        for(int z: ws)
            cout<<z<<' ';
        cout<<'\n';
        for(int z: bs)
            cout<<z<<' ';
        cout<<'\n';
        for(int z: wt)
            cout<<z<<' ';
        cout<<'\n';
        for(int z: bt)
            cout<<z<<' ';
        cout<<'\n';
    }*/
    string ss="", tt="";
    for(int i=0;i<n;++i){
        if(g[i])
            ss+=s[i];
        if(h[i])
            tt+=t[i];
    }
    //cout<<ans<<" : "<<ss<<" "<<tt<<'\n';
    ans+=BW(ss, tt);
    //cout<<ans<<'\n';
    return ans;
}

int main(){
    //ios_base::sync_with_stdio(0); cin.tie(0);
    string s, t;
    cin>>n>>s;
    if(n>3000)
        return 0;
    t="";
    for(int i=n;i<2*n;++i)
        t+=s[i];
    ll ans=0;
    for(int i=0;2*i<=n;++i){
        ans=max(ans, BW(i, s, t));
        ans=max(ans, BW(i, t, s));
    }
    cout<<ans<<'\n';
}

Compilation message

monochrome.cpp: In function 'll BW(const string&, const string&)':
monochrome.cpp:43:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   43 |     for(int i=0;i<ws.size();++i){
      |                 ~^~~~~~~~~~
monochrome.cpp:45:13: warning: unused variable 'xyz' [-Wunused-variable]
   45 |         int xyz=ans;
      |             ^~~
monochrome.cpp:54:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   54 |     for(int i=0;i<bs.size();++i){
      |                 ~^~~~~~~~~~
monochrome.cpp:56:13: warning: unused variable 'xyz' [-Wunused-variable]
   56 |         int xyz=ans;
      |             ^~~
monochrome.cpp: In function 'll BW(const int&, const string&, const string&)':
monochrome.cpp:75:21: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'const int' [-Wsign-compare]
   75 |         if(ws.size()<k && s[i]=='W'){
      |            ~~~~~~~~~^~
monochrome.cpp:79:21: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'const int' [-Wsign-compare]
   79 |         if(bt.size()<k && t[i]=='B'){
      |            ~~~~~~~~~^~
monochrome.cpp:85:21: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'const int' [-Wsign-compare]
   85 |         if(bs.size()<k && s[i]=='B'){
      |            ~~~~~~~~~^~
monochrome.cpp:89:21: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'const int' [-Wsign-compare]
   89 |         if(wt.size()<k && t[i]=='W'){
      |            ~~~~~~~~~^~
monochrome.cpp:98:17: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'const int' [-Wsign-compare]
   98 |     if(ws.size()!=k || wt.size()!=k || (k>0 && (ws[k-1]>bs[0] || bt[k-1]>wt[0])))
      |        ~~~~~~~~~^~~
monochrome.cpp:98:33: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'const int' [-Wsign-compare]
   98 |     if(ws.size()!=k || wt.size()!=k || (k>0 && (ws[k-1]>bs[0] || bt[k-1]>wt[0])))
      |                        ~~~~~~~~~^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 596 KB Output is correct
2 Incorrect 1 ms 596 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 596 KB Output is correct
2 Incorrect 1 ms 596 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 596 KB Output is correct
2 Incorrect 1 ms 596 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 596 KB Output is correct
2 Incorrect 1 ms 596 KB Output isn't correct
3 Halted 0 ms 0 KB -