제출 #1170536

#제출 시각아이디문제언어결과실행 시간메모리
1170536irmuun식물 비교 (IOI20_plants)C++20
30 / 100
1765 ms5868 KiB
#include "plants.h"
#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define pb push_back
#define ff first
#define ss second
#define all(s) s.begin(),s.end()
#define rall(s) s.rbegin(),s.rend()

int n,k;
vector<int>r,pre,h;

int get(int x,int y){
    if(x>y) return 0;
    return pre[y]-(x>0?pre[x-1]:0);
}

const int maxn=300;

vector<int>g[maxn];
int ans[maxn][maxn];

void init(int K,vector<int>R){
    k=K;
    r=R;
    n=r.size();
    pre.resize(n);
    pre[0]=r[0];
    for(int i=1;i<n;i++){
        pre[i]=pre[i-1]+r[i];
    }
    if(2*k>n||n<=300){
        h.resize(n);
        for(int t=n;t>=1;t--){
            vector<int>v;
            for(int i=0;i<n;i++){
                if(h[i]==0&&r[i]==0) v.pb(i);
            }
            if(!v.empty()){
                int x=v[0];
                for(int i=1;i<v.size();i++){
                    if(v[i]-v[i-1]>=k){
                        x=v[i];
                        break;
                    }
                }
                h[x]=t;
                for(int j=1;j<k;j++){
                    r[(x-j+n)%n]--;
                }
            }
        }
        if(n<=300){
            for(int i=0;i<n;i++){
                for(int t=1;t<k;t++){
                    if(h[i]>h[(i+t)%n]){
                        g[i].pb((i+t)%n);
                    }
                    else{
                        g[(i+t)%n].pb(i);
                    }
                }
            }
            for(int i=0;i<n;i++){
                for(int j=0;j<n;j++){
                    ans[i][j]=0;
                }
            }
            for(int i=0;i<n;i++){
                queue<int>q;
                q.push(i);
                ans[i][i]=1;
                while(!q.empty()){
                    int x=q.front();
                    q.pop();
                    for(int y:g[x]){
                        if(ans[i][y]==0){
                            ans[i][y]=1;
                            q.push(y);
                        }
                    }
                }
            }
        }
    }
}

int compare_plants(int x,int y){
    if(k==2){
        if(get(x,y-1)==0) return 1;
        if(get(y,n-1)==n-y&&get(0,x-1)==x) return 1;
        if(get(x,y-1)==y-x) return -1;
        if(get(y,n-1)==0&&get(0,x-1)==0) return -1;
        return 0;
    }
    if(2*k>n&&n<=5000){
        if(h[x]>h[y]) return 1;
        if(h[x]<h[y]) return -1;
        return 0;
    }
    if(n<=300){
        if(ans[x][y]==1) return 1;
        if(ans[y][x]==1) return -1;
        return 0;
    }
    return 0;
}
#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...