Submission #1213748

#TimeUsernameProblemLanguageResultExecution timeMemory
1213748hengliaoComparing Plants (IOI20_plants)C++20
5 / 100
62 ms29508 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=2e5+5; // warning

    ll n, k;
    vll adj[mxN];
    bool visited[mxN];
    ll dp[mxN][2];

    void dfs(ll cur){
        if(visited[cur]) return;
        visited[cur]=1;
        dp[cur][0]=cur;
        dp[cur][1]=cur;
        for(auto &it:adj[cur]){
            dfs(it);
            if(it==(cur+1)%n){
                dp[cur][0]=dp[it][0];
            }
            else{
                dp[cur][1]=dp[it][1];
            }
        }
    }
}

void init(int K, vector<int> a) {
    // memset(done, 0, sizeof(done));
    // memset(ans, 0, sizeof(ans));
    n=a.size();
    k=K;
    for(ll i=0;i<n;i++){
        ll nxt=(i+1)%n;
        if(a[i]==0){
            adj[i].pb(nxt);
        }
        else{
            adj[nxt].pb(i);
        }
    }
    
    for(ll i=0;i<n;i++){
        // memset(visited, 0, sizeof(visited));
        dfs(i);
        // for(ll j=0;j<n;j++){
        //     if(visited[j]){
        //         ans[i][j]=1;
        //         ans[j][i]=-1;
        //     }
        // }
    }
}

int compare_plants(int x, int y) {
    // if(2*k>n){
    //     if(val[x]>val[y]) return 1;
    //     return -1;
    // }
    if(y>x){
        if(dp[x][0]>=x){
            if(dp[x][0]>=y) return 1;
        }
        else{
            return 1;
        }
        if(dp[x][1]>x && dp[x][1]<=y){
            return 1;
        }
    }
    else{
        if(dp[x][0]<x && dp[x][0]>=y){
            return 1;
        }
        if(dp[x][1]<=x){
            if(dp[x][1]<=y) return 1;
        }
        else{
            return 1;
        }
    }
    if(x>y){
        if(dp[y][0]>=y){
            if(dp[y][0]>=x) return -1;
        }
        else{
            return -1;
        }
        if(dp[y][1]>y && dp[y][1]<=x){
            return -1;
        }
    }
    else{
        if(dp[y][0]<y && dp[y][0]>=x){
            return -1;
        }
        if(dp[y][1]<=y){
            if(dp[y][1]<=x) return -1;
        }
        else{
            return -1;
        }
    }
    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...