제출 #979885

#제출 시각아이디문제언어결과실행 시간메모리
979885IUA_HasinJJOOII 2 (JOI20_ho_t2)C++17
100 / 100
96 ms21276 KiB
#include <bits/stdc++.h>

#define ll                                  long long
#define ld                                  long double
#define endl                                "\n"

using namespace std;


int main(){
    #if __has_include("LOCAL.hh")
        #include "LOCAL.hh"
    #endif

    #ifdef LOCAL
        freopen("input.txt", "r", stdin);
        freopen("output.txt", "w", stdout);
        using namespace std::chrono;
        cout << fixed << setprecision(9);
        auto begin = steady_clock::now();
    #else
        std::ios_base::sync_with_stdio(false);
        cin.tie(NULL);
        cout.tie(NULL);
    #endif



    ll n, k;
    cin>>n>>k;
    string s;
    cin>>s;

    vector<ll> vj, vo, vi;
    for(int i=0; i<n; i++){
        if(s[i]=='J'){
            vj.push_back(i);
        } else if(s[i]=='O'){
            vo.push_back(i);
        } else if(s[i]=='I'){
            vi.push_back(i);
        }
    }

    map<ll, ll> mj, mo, mi;
    for(int i=0; i<vj.size(); i++){
        ll a = vj[i];
        if(i<=(vj.size()-k)){
            ll b = vj[i+k-1];
            mj[a] = b; 
        } else {
            mj[a] = -1;
        }
    }

    set<ll> so;
    for(int i=0; i<vo.size(); i++){
        ll a = vo[i];
        if(i<=(vo.size()-k)){
            ll b = vo[i+k-1];
            mo[a] = b;
        } else {
            mo[a] = -1;
        }
        so.insert(a);
    }

    set<ll> si;
    for(int i=0; i<vi.size(); i++){
        ll a = vi[i];
        if(i<=(vi.size()-k)){
            ll b = vi[i+k-1];
            mi[a] = b;
        } else {
            mi[a] = -1;
        }
        si.insert(a);
    }


    // for(int i=0; i<vj.size(); i++){
    //     cout << mj[vj[i]] << " ";
    // }
    // cout<<endl;
    // for(int i=0; i<vo.size(); i++){
    //     cout << mo[vo[i]] << " ";
    // }
    // cout<<endl;
    // for(int i=0; i<vi.size(); i++){
    //     cout << mi[vi[i]] << " ";
    // }
    // cout<<endl;
    // cout<<endl;

    // for(auto u : so){
    //     cout << u << " ";
    // }
    // cout<<endl;
    // for(auto u : si){
    //     cout << u << " ";
    // }
    // cout<<endl;
    // cout<<endl;

    ll status = -1;
    ll possible = 1;
    ll ans = 1e9;

    for(int i=0; i<=vj.size()-k; i++){
        if(possible==-1){
            break;
        } else {
            ll a = vj[i];
            ll b = mj[a];
            //cout << a << " " << b << endl;
            auto it = so.upper_bound(b);
            ll temp1;
            if(it==so.end()){
                possible=-1;
                break;
            } else {
                temp1 = *it;
            }
            ll c = mo[temp1];
            //cout << c << " " << temp1 << endl;
            if(c==-1){
                possible = -1;
                break;
            } else {
                auto it2 = si.upper_bound(c);
                ll temp2;
                if(it2==si.end()){
                    possible = -1;
                    break;
                } else {
                    temp2 = *it2;
                }
                ll d = mi[temp2];
                //cout << d << " " << temp2 << endl;
                if(d==-1){
                    possible = -1;
                    break;
                } else {
                    status = 1;
                    ll e = d-a+1;
                    ll tempans = e-3*k;
                    ans = min(ans, tempans);
                    //cout << e << " " << tempans << endl;
                }
            }
        }
    }

    //cout << status << endl;
    if(status==1){
        cout << ans << endl;
    } else {
        cout << -1 << endl;
    }
    






    #ifdef LOCAL
        auto end = steady_clock::now();
        cout << "\nTime : " 
             << (ld)duration_cast<nanoseconds>
                (end - begin).count()/1000000000 
             << "s" << endl;
    #endif


    return 0;
}

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

ho_t2.cpp: In function 'int main()':
ho_t2.cpp:46:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   46 |     for(int i=0; i<vj.size(); i++){
      |                  ~^~~~~~~~~~
ho_t2.cpp:48:13: warning: comparison of integer expressions of different signedness: 'int' and 'long long unsigned int' [-Wsign-compare]
   48 |         if(i<=(vj.size()-k)){
      |            ~^~~~~~~~~~~~~~~
ho_t2.cpp:57:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   57 |     for(int i=0; i<vo.size(); i++){
      |                  ~^~~~~~~~~~
ho_t2.cpp:59:13: warning: comparison of integer expressions of different signedness: 'int' and 'long long unsigned int' [-Wsign-compare]
   59 |         if(i<=(vo.size()-k)){
      |            ~^~~~~~~~~~~~~~~
ho_t2.cpp:69:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   69 |     for(int i=0; i<vi.size(); i++){
      |                  ~^~~~~~~~~~
ho_t2.cpp:71:13: warning: comparison of integer expressions of different signedness: 'int' and 'long long unsigned int' [-Wsign-compare]
   71 |         if(i<=(vi.size()-k)){
      |            ~^~~~~~~~~~~~~~~
ho_t2.cpp:109:19: warning: comparison of integer expressions of different signedness: 'int' and 'long long unsigned int' [-Wsign-compare]
  109 |     for(int i=0; i<=vj.size()-k; i++){
      |                  ~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...