제출 #1363323

#제출 시각아이디문제언어결과실행 시간메모리
1363323Andrey식물 비교 (IOI20_plants)C++17
0 / 100
28 ms14252 KiB
#include "plants.h"
#include<bits/stdc++.h>
using namespace std;

const int MAXN = 200010;
vector<pair<int,int>> seg(4*MAXN);
vector<int> wow(4*MAXN);
vector<int> haha(MAXN);
vector<int> pos(MAXN);
int N;

void build(int l, int r, int x) {
    if(l == r) {
        seg[x] = {haha[l],l};
        return;
    }
    int mid = (l+r)/2;
    build(l,mid,x*2);
    build(mid+1,r,x*2+1);
    seg[x] = min(seg[x*2],seg[x*2+1]);
}

void upd(int l, int r, int ql, int qr, int x, int c) {
    if(r < ql || l > qr) {
        return;
    }
    if(l >= ql && r <= qr) {
        seg[x] = {seg[x].first+c,seg[x].second};
        wow[x]+=c;
        return;
    }
    int mid = (l+r)/2;
    upd(l,mid,ql,qr,x*2,c);
    upd(mid+1,r,ql,qr,x*2+1,c);
    seg[x] = min(seg[x*2],seg[x*2+1]);
    seg[x] = {seg[x].first+wow[x],seg[x].second};
}

void init(int k, std::vector<int> r) {
    N = r.size();
    int n = N;
    for(int i = 0; i < n; i++) {
        haha[i] = r[i];
    }
    build(0,N-1,1);
    set<int> idk;
    queue<int> banana;
    int br = 0;
    for(int i = 0; i < n; i++) {
        if(r[i] == 0) {
            idk.insert(i-n);
            idk.insert(i);
            idk.insert(i+n);
            banana.push(i);
            upd(0,n-1,i,i,1,1e9);
        }
    }
    while(!banana.empty()) {
        int p = banana.front();
        banana.pop();
        if(idk.find(p) == idk.end()) {
            continue;
        }
        if(*(--idk.upper_bound(p-1)) > p-k) {
            continue;
        }
        pos[p] = br;
        br++;
        int x = *(idk.lower_bound(p));
        if(x >= n) {
            x-=n;
        }
        banana.push(x);
        if(p >= k-1) {
            upd(0,n-1,p-k+1,p-1,1,-1);
        }
        else {
            upd(0,n-1,0,p-1,1,-1);
            upd(0,n-1,n-(k-p-1),n-1,1,-1);
        }
        while(seg[1].first == 0) {
            int q = seg[1].second;
            idk.insert(q);
            idk.insert(q-n);
            idk.insert(q+n);
            upd(0,n-1,q,q,1,1e9);
            banana.push(q);
        }
        idk.erase(p);
        idk.erase(p-n);
        idk.erase(p+n);
    }
	return;
}

int compare_plants(int x, int y) {
    if(pos[x] < pos[y]) {
        return 1;
    }
    else {
        return -1;
    }
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…