Submission #800365

#TimeUsernameProblemLanguageResultExecution timeMemory
800365I_Love_EliskaM_Comparing Plants (IOI20_plants)C++14
27 / 100
3268 ms12416 KiB
#include "plants.h"
#include <bits/stdc++.h>
using namespace std;
#define forn(i,_n) for(int i=0;i<_n;++i)
#define all(x) x.begin(),x.end()
#define pb push_back
#define pi pair<int,int>
#define f first
#define s second
using ll = long long;

const int N=2e5+55;
int p[N];
int n;
int k;

struct sgt {
	vector<int> t,lazy; int sz=1;
	sgt(int n) {
		while (sz<n) sz<<=1;
		t.assign(2*sz,0);
		lazy.assign(4*sz,0);
	}
	void push(int v) {
		t[v]+=lazy[v];
		lazy[2*v+1]+=lazy[v];
		lazy[2*v+2]+=lazy[v];
		lazy[v]=0;
	}
	void add(int v, int l, int r, int lx, int rx, int x) {
		if (lazy[v]) push(v);
		if (rx<=l || r<=lx) return;
		if (lx<=l && r<=rx) {
			lazy[v]+=x;
			push(v);
			return;
		}
		int m=(l+r)>>1;
		add(2*v+1,l,m,lx,rx,x);
		add(2*v+2,m,r,lx,rx,x);
		t[v]=max(t[2*v+1],t[2*v+2]);
	}
	void add(int l, int r, int x) {
		add(0,0,sz,l,r,x);
	}
	int query(int v, int l, int r, int lx, int rx) {
		if (lazy[v]) push(v);
		if (rx<=l || r<=lx) return -1e9-7;
		if (lx<=l && r<=rx) return t[v];
		int m=(l+r)>>1;
		int lq=query(2*v+1,l,m,lx,rx);
		int rq=query(2*v+2,m,r,lx,rx);
		t[v]=max(t[2*v+1],t[2*v+2]);
		return max(lq,rq);
	}
	int query(int l, int r) {
		return query(0,0,sz,l,r);
	}
};
sgt st(N);

void init(int _k, vector<int> r) {
	k=_k;
	n=r.size();
	if (2*k<=n) exit(0);
	vector<int> pos(k,-1);

	forn(i,n) st.add(i,i+1,r[i]);

	forn(i,n) {
		int l=0, r=n-1;
		while (l<r) {
			int mid=(l+r+1)>>1;
			int x=st.query(mid,n);
			if (x!=k-1) r=mid-1;
			else l=mid;
		}
		int z=r;

		l=0, r=k;
		while (l<r) {
			int mid=(l+r)>>1;
			int f=z-k+1;
			int x;
			if (f>=0) {
				x=st.query(f,f+mid+1);
			} else {
				if (f+mid+1>0) {
					x=max(st.query(f+n,n),st.query(0,f+mid+1));
				} else {
					x=st.query(f+n,f+mid+1+n);
				}
			}
			if (x==k-1) r=mid;
			else l=mid+1;
		}
		z=z-k+1+r;
		if (z<0) z+=n;
		p[z]=i;
		st.add(z,z+1,-k);

		int f=z-k+1;
		if (f>=0) {
			st.add(f,z,1);
		} else {
			st.add(0,z,1);
			st.add(n+f,n,1);
		}
	}
}

int compare_plants(int x, int y) {
	if (p[x]>p[y]) return 1;
	else 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...