Submission #428616

# Submission time Handle Problem Language Result Execution time Memory
428616 2021-06-15T13:14:35 Z MarcoMeijer Comparing Plants (IOI20_plants) C++14
27 / 100
1961 ms 57228 KB
#include "plants.h"
#include <bits/stdc++.h>
using namespace std;

// macros
typedef long long ll;
typedef long double ld;
typedef pair<int, int> ii;
typedef pair<ll, ll> lll;
typedef tuple<int, int, int> iii;
typedef vector<int> vi;
typedef vector<ii> vii;
typedef vector<iii> viii;
typedef vector<ll> vll;
typedef vector<lll> vlll;
#define REP(a,b,c) for(int a=int(b); a<int(c); a++)
#define RE(a,c) REP(a,0,c)
#define RE1(a,c) REP(a,1,c+1)
#define REI(a,b,c) REP(a,b,c+1)
#define REV(a,b,c) for(int a=int(c-1); a>=int(b); a--)
#define FOR(a,b) for(auto& a : b)
#define all(a) a.begin(), a.end()
#define INF 1e9
#define EPS 1e-9
#define pb push_back
#define popb pop_back
#define fi first
#define se second
#define sz size()
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());

const int N = (1<<20);

int n, k;
vi r;

struct Seg {
    ii mn[N*2]; int laz[N*2];
    void build(int p=1, int l=0, int r=N-1) {
        laz[p] = 0;
        if(l == r) {
            mn[p] = {0,l};
            return;
        }
        int m=(l+r)/2;
        build(p*2  ,l  ,m);
        build(p*2+1,m+1,r);
        mn[p] = min(mn[p*2],mn[p*2+1]);
    }
    void add(int p, int v) {
        laz[p] += v;
        mn[p] = {mn[p].fi+v, mn[p].se};
    }
    void pushDown(int p) {
        add(p*2  ,laz[p]);
        add(p*2+1,laz[p]);
        laz[p] = 0;
    }
    void add(int i, int j, int v, int p=1, int l=0, int r=N-1) {
        if(j < l || i > r) return;
        if(i <= l && j >= r) {
            add(p,v);
            return;
        }
        pushDown(p);
        int m=(l+r)/2;
        add(i,j,v,p*2,l,m);
        add(i,j,v,p*2+1,m+1,r);
        mn[p] = min(mn[p*2],mn[p*2+1]);
    }
    ii get(int i, int j, int p=1, int l=0, int r=N-1) {
        if(j < l || i > r) return {INF,INF};
        if(i <= l && j >= r) return mn[p];
        pushDown(p);
        int m=(l+r)/2;
        ii a = get(i,j,p*2,l,m);
        ii b = get(i,j,p*2+1,m+1,r);
        return min(a,b);
    }
    void addCircle(int i, int l, int v) {
        int j = i + l - 1;
        add(i,min(n-1,j),v);
        if(j > n-1)
            add(0,j-n,v);
    }
};

Seg seg1, seg2;

vi val;
vi group;

void init(int k_, vi r_) {
    k = k_; r = r_;
    n = r.size();
    seg1.build(); seg2.build();
    RE(i,n) seg1.add(i,i,r[i]);
    RE(i,n) seg2.add(i,i,1);

    val.assign(n,0);
    group.assign(n,0);
    REV(i,0,n) {
        while(true) {
            ii res = seg1.get(0,n-1);
            if(res.fi != 0)
                break;
            int j = res.se;
            seg1.add(j,j,INF);
            seg2.add(j,j,-1);
            seg2.addCircle((j+1)%n, k-1, 1);
        }

        if(i == n-1) {
            vi dif;
            RE(i,n) if(seg2.get(i,i).fi == 0) dif.pb(i);
            int curGroup = dif.size()-1;
            vi atx(n,0);
            FOR(i,dif) atx[i] = 1;
            RE(i,n) {
                if(atx[i])
                    curGroup = (curGroup+1)%dif.size();
                group[i] = curGroup;
            }
        }

        ii res = seg2.get(0,n-1);
        int j = res.se;
        val[j] = i;
        seg2.add(j,j,INF);
        seg2.addCircle((j+1)%n, k-1, -1);
        seg1.addCircle((j-k+n+1)%n, k-1, -1);
    }
}

int compare_plants(int x, int y) {
    if(group[x] != group[y]) return 0;
	return val[x] > val[y] ? 1 : -1;
}
# Verdict Execution time Memory Grader output
1 Correct 37 ms 49440 KB Output is correct
2 Correct 37 ms 49432 KB Output is correct
3 Correct 39 ms 49476 KB Output is correct
4 Incorrect 37 ms 49476 KB Output isn't correct
5 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 37 ms 49480 KB Output is correct
2 Correct 37 ms 49476 KB Output is correct
3 Correct 40 ms 49476 KB Output is correct
4 Correct 39 ms 49472 KB Output is correct
5 Correct 38 ms 49440 KB Output is correct
6 Correct 45 ms 49644 KB Output is correct
7 Correct 131 ms 52812 KB Output is correct
8 Correct 47 ms 49624 KB Output is correct
9 Correct 46 ms 49660 KB Output is correct
10 Correct 131 ms 52876 KB Output is correct
11 Correct 128 ms 52804 KB Output is correct
12 Correct 154 ms 52932 KB Output is correct
13 Correct 132 ms 52980 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 37 ms 49480 KB Output is correct
2 Correct 37 ms 49476 KB Output is correct
3 Correct 40 ms 49476 KB Output is correct
4 Correct 39 ms 49472 KB Output is correct
5 Correct 38 ms 49440 KB Output is correct
6 Correct 45 ms 49644 KB Output is correct
7 Correct 131 ms 52812 KB Output is correct
8 Correct 47 ms 49624 KB Output is correct
9 Correct 46 ms 49660 KB Output is correct
10 Correct 131 ms 52876 KB Output is correct
11 Correct 128 ms 52804 KB Output is correct
12 Correct 154 ms 52932 KB Output is correct
13 Correct 132 ms 52980 KB Output is correct
14 Correct 230 ms 53188 KB Output is correct
15 Correct 1665 ms 57228 KB Output is correct
16 Correct 227 ms 53168 KB Output is correct
17 Correct 1712 ms 56984 KB Output is correct
18 Correct 1254 ms 57024 KB Output is correct
19 Correct 1344 ms 57036 KB Output is correct
20 Correct 1961 ms 56984 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 48 ms 49412 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 47 ms 49456 KB Output is correct
2 Correct 39 ms 49492 KB Output is correct
3 Incorrect 45 ms 49444 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 49 ms 49488 KB Output is correct
2 Correct 40 ms 49468 KB Output is correct
3 Incorrect 41 ms 49432 KB Output isn't correct
4 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 37 ms 49440 KB Output is correct
2 Correct 37 ms 49432 KB Output is correct
3 Correct 39 ms 49476 KB Output is correct
4 Incorrect 37 ms 49476 KB Output isn't correct
5 Halted 0 ms 0 KB -