제출 #419094

#제출 시각아이디문제언어결과실행 시간메모리
41909479brue식물 비교 (IOI20_plants)C++14
27 / 100
567 ms16788 KiB
#include <bits/stdc++.h>
#include "plants.h"

using namespace std;

typedef long long ll;

struct segTree{
    pair<int, int> tree[800002];
    int lazy[800002];

    void init(int i, int l, int r, int *A){
        lazy[i] = 0;
        if(l==r){
            tree[i] = make_pair(A[l], l);
            return;
        }
        int m = (l+r)>>1;
        init(i*2, l, m, A);
        init(i*2+1, m+1, r, A);
        tree[i] = min(tree[i*2], tree[i*2+1]);
    }

    void propagate(int i, int l, int r){
        tree[i].first += lazy[i];
        if(l!=r){
            lazy[i*2] += lazy[i];
            lazy[i*2+1] += lazy[i];
        }
        lazy[i] = 0;
    }

    void add(int i, int l, int r, int s, int e, int val){
        propagate(i, l, r);
        if(r<s || e<l) return;
        if(s<=l && r<=e){
            lazy[i] += val;
            propagate(i, l, r);
            return;
        }
        int m = (l+r)>>1;
        add(i*2, l, m, s, e, val);
        add(i*2+1, m+1, r, s, e, val);
        tree[i] = min(tree[i*2], tree[i*2+1]);
    }

    pair<int, int> findMin(int i, int l, int r, int s, int e){
        propagate(i, l, r);
        if(r<s || e<l) return make_pair(INT_MAX, INT_MAX);
        if(s<=l && r<=e) return tree[i];
        int m = (l+r)>>1;
        return min(findMin(i*2, l, m, s, e), findMin(i*2+1, m+1, r, s, e));
    }
} tree;

int n, k;
int arr[200002];
int sum[200002];
int ans[200002];

void init(int _k, vector<int> r) {
	n = (int)r.size();
	k = _k;
	for(int i=1; i<=n; i++) arr[i] = r[i-1];

    tree.init(1, 1, n, arr);

    for(int turn=n; turn>=1; turn--){
        int minLoc = tree.findMin(1, 1, n, 1, n).second;
        if(minLoc < k){
            auto tmp = tree.findMin(1, 1, n, n-(k-minLoc)+1, n);
            if(tmp.first == 0) minLoc = tmp.second;
        }

        ans[minLoc] = turn;
        tree.add(1, 1, n, minLoc, minLoc, 1000000000);
        if(minLoc >= k) tree.add(1, 1, n, minLoc-k+1, minLoc, -1);
        else{
            tree.add(1, 1, n, 1, minLoc, -1);
            tree.add(1, 1, n, n-(k-minLoc)+1, n, -1);
        }
    }
}

int compare_plants(int x, int y) {
	x++, y++;

	if(ans[x] > ans[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...