제출 #1213692

#제출 시각아이디문제언어결과실행 시간메모리
1213692hengliao식물 비교 (IOI20_plants)C++20
14 / 100
89 ms3468 KiB
#include "plants.h"
#include<bits/stdc++.h>
using namespace std;

#define F first
#define S second
#define pb push_back
#define vll vector<ll>
#define pll pair<ll, ll>

typedef int ll;

namespace{
    const ll mxN=5005; // warning

    ll n, k;
    ll val[mxN];
    bool done[mxN];
}

void init(int K, vector<int> a) {
	memset(done, 0, sizeof(done));
    n=a.size();
    k=K;
    if(2*k>n){
        auto update=[&](ll lef, ll rig, ll val){
            for(ll i=lef;i<=rig;i++){
                a[i]+=val;
            }
        };
        for(ll i=n-1;i>=0;i--){
            vll tep;
            for(ll j=0;j<n;j++){
                if(!done[j] && a[j]==0){
                    tep.pb(j);
                }
            }
            ll dumb=0;
            if((ll) tep.size()==1){
                dumb=tep[0];
            }
            else{
                for(ll j=0;j<(ll) tep.size();j++){
                    ll pre=(j-1+(ll) tep.size())%((ll) tep.size());
                    if(((tep[j]-tep[pre]+n)%n)>=k){
                        dumb=tep[j];
                        break;
                    }
                }
            }
            
            val[dumb]=i;
            done[dumb]=1;
            ll lef=(dumb-k+1+n)%n;
            ll rig=(dumb-1+n)%n;
            if(lef>rig){
                update(lef, n-1, -1);
                update(0, rig, -1); 
            }    
            else{
                update(lef, rig, -1);
            }
        }
        // for(ll i=0;i<n;i++){
        //     cout<<val[i]<<' ';
        // }
        // cout<<'\n';
    }
    // auto check=[&](ll tar){
    //     if(a[tar]>0) return false;
    //     ll cur=tar;
    //     for(ll i=0;i<k-1;i++){
    //         cur--;
    //         if(cur<0) cur+=n;
    //         if(a[tar]==0) return false;
    //     }
    //     return true;
    // };
    // for(ll rep=0;rep<n;rep++){
    //     ll cur=-1;
    //     for(ll tar=0;tar<n;tar++){
    //         if(check(tar)){
    //             cur=tar;
    //             break;
    //         }
    //     }
    //     for(ll i=1;i<k;i++){
    //         ll cur2=(cur+i)%n;
    //         if(done[cur2]) continue;
    //         adj[cur].pb(cur2);
    //     }
    //     for(ll i=1;i<k;i++){
    //         ll cur2=(cur-i+n)%n;
    //         if(done[cur2]) continue;
    //         adj[cur].pb(cur2);
    //     }
    // }
}

int compare_plants(int x, int y) {
	if(val[x]>val[y]) return 1;
    return -1;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...