Submission #432129

# Submission time Handle Problem Language Result Execution time Memory
432129 2021-06-17T21:30:43 Z alishahali1382 Comparing Plants (IOI20_plants) C++14
43 / 100
1834 ms 71980 KB
#include "plants.h"
#include <bits/stdc++.h>
#pragma GCC optimize("O2")
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;
#define debug(x) {cerr<<#x<<"="<<x<<"\n";}
#define debug2(x, y) {cerr<<"{"<<#x<<", "<<#y<<"}={"<<x<<", "<<y<<"}\n";}
#define debugp(p) {cerr<<#p<<"={"<<p.first<<", "<<p.second<<"}\n";}
#define debugv(abcd) {cerr<<#abcd<<": "; for (auto dcba:abcd) cerr<<dcba<<", ";cerr<<"\n";}
#define pb push_back
#define all(x) x.begin(), x.end()
#define SZ(x) ((int)x.size())

const int inf=1000000100; // 1e9
const ll INF=10000000001000000; // 1e16
const int mod=1000000007;
const int MAXN=200010, LOG=18;

int n, m, k, x, y, u, v, t, a, b, posmx;
int A[MAXN], B[MAXN];
int mark1[MAXN], mark2[MAXN];
int L[LOG][MAXN], R[LOG][MAXN];
vector<int> G[MAXN], GR[MAXN];

struct Segment{
	pii seg[MAXN<<2];
	int lazy[MAXN<<2];
	pii Build(int id, int tl, int tr, int *A){
		if (tr-tl==1) return seg[id]={A[tl], tl};
		int mid=(tl+tr)>>1;
		return seg[id]=min(Build(id<<1, tl, mid, A), Build(id<<1 | 1, mid, tr, A));
	}
	inline void add_lazy(int id, int val){
		seg[id].first+=val;
		lazy[id]+=val;
	}
	inline void shift(int id){
		if (lazy[id]){
			add_lazy(id<<1, lazy[id]);
			add_lazy(id<<1 | 1, lazy[id]);
			lazy[id]=0;
		}
	}
	void Add(int id, int tl, int tr, int l, int r, int val){
		if (r<=tl || tr<=l) return ;
		if (l<=tl && tr<=r){
			add_lazy(id, val);
			return ;
		}
		shift(id);
		int mid=(tl+tr)>>1;
		Add(id<<1, tl, mid, l, r, val);
		Add(id<<1 | 1, mid, tr, l, r, val);
		seg[id]=min(seg[id<<1], seg[id<<1 | 1]);
	}
	pii Get(int id, int tl, int tr, int l, int r){
		if (r<=tl || tr<=l) return {inf, 0};
		if (l<=tl && tr<=r) return seg[id];
		shift(id);
		int mid=(tl+tr)>>1;
		return min(Get(id<<1, tl, mid, l, r), Get(id<<1 | 1, mid, tr, l, r));
	}
} seg1, seg2, seg3;

void relax(){
	while (!seg1.seg[1].first){
		int mx=seg1.seg[1].second;
		// cerr<<mx<<" became 0\n";
		seg1.Add(1, 0, n, mx, mx+1, inf);
		seg2.Add(1, 0, n, mx, mx+1, -inf);
		seg2.Add(1, 0, n, mx+1, mx+k, +1);
		seg2.Add(1, 0, n, 0, mx+k-n, +1);
	}
}

inline void add_edge(int u, int v){
	G[u].pb(v);
	GR[v].pb(u);
}

void init(int _k, vi _A){
	n=SZ(_A);
	k=_k;
	for (int i=0; i<n; i++) A[i]=_A[i];
	seg1.Build(1, 0, n, A);
	seg2.Build(1, 0, n, B); // any empty array
	seg3.Build(1, 0, n, B);
	seg2.Add(1, 0, n, 0, n, inf);
	seg3.Add(1, 0, n, 0, n, inf);
	relax();
	for (int i=0; i<n; i++){
		int mx=seg2.seg[1].second;
		B[mx]=n-i;
		
		seg2.Add(1, 0, n, mx, mx+1, inf);
		seg2.Add(1, 0, n, mx+1, mx+k, -1);
		seg2.Add(1, 0, n, 0, mx+k-n, -1);
		
		seg1.Add(1, 0, n, mx-k+1, mx, -1);
		seg1.Add(1, 0, n, n+mx-k+1, n, -1);
		relax();



		seg3.Add(1, 0, n, mx, mx+1, -inf+B[mx]);
		pii l=min(seg3.Get(1, 0, n, mx-k+1, mx), seg3.Get(1, 0, n, mx-k+1+n, n));
		pii r=min(seg3.Get(1, 0, n, mx+1, mx+k), seg3.Get(1, 0, n, 0, mx+k-n));

		if (l.first<inf) L[0][mx]=(n+mx-l.second)%n; //add_edge(mx, l.second);
		if (r.first<inf) R[0][mx]=(r.second-mx+n)%n; //add_edge(mx, r.second);
	}
	// for (int i=0; i<n; i++) cerr<<B[i]-1<<" \n"[i==n-1];
	for (int j=1; j<LOG; j++) for (int i=0; i<n; i++){
		L[j][i]=min(L[j-1][i] + L[j-1][(i-L[j-1][i])%n], n);
		R[j][i]=min(R[j-1][i] + R[j-1][(i+R[j-1][i])%n], n);
	}

	return ;
}

int compare_plants(int x, int y){
	if (B[x]>B[y]) return -compare_plants(y, x);
	int l=x, dl=(x-y+n)%n;
	int r=x, dr=(y-x+n)%n;
	for (int i=LOG-1; ~i; i--){
		if (L[i][l]<=dl){
			dl-=L[i][l];
			l=(l-L[i][l]+n)%n;
		}
		if (R[i][r]<=dr){
			dr-=R[i][r];
			r=(r+R[i][r]+n)%n;
		}
	}
	if (B[l]<=B[y] && dl<k) return -1;
	if (B[r]<=B[y] && dr<k) return -1;
	return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 16 ms 28620 KB Output is correct
2 Correct 15 ms 28620 KB Output is correct
3 Correct 16 ms 28696 KB Output is correct
4 Correct 15 ms 28604 KB Output is correct
5 Correct 15 ms 28712 KB Output is correct
6 Correct 115 ms 31500 KB Output is correct
7 Correct 203 ms 35268 KB Output is correct
8 Correct 1075 ms 67840 KB Output is correct
9 Correct 1117 ms 67780 KB Output is correct
10 Correct 1036 ms 67540 KB Output is correct
11 Correct 1012 ms 67064 KB Output is correct
12 Correct 1012 ms 66980 KB Output is correct
13 Correct 1063 ms 66936 KB Output is correct
14 Correct 1061 ms 67036 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 15 ms 28620 KB Output is correct
2 Correct 15 ms 28608 KB Output is correct
3 Correct 15 ms 28620 KB Output is correct
4 Correct 15 ms 28620 KB Output is correct
5 Correct 19 ms 28692 KB Output is correct
6 Correct 21 ms 28872 KB Output is correct
7 Correct 116 ms 32416 KB Output is correct
8 Correct 18 ms 28748 KB Output is correct
9 Correct 20 ms 28848 KB Output is correct
10 Correct 112 ms 32496 KB Output is correct
11 Correct 146 ms 32404 KB Output is correct
12 Correct 142 ms 32580 KB Output is correct
13 Correct 133 ms 32460 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 15 ms 28620 KB Output is correct
2 Correct 15 ms 28608 KB Output is correct
3 Correct 15 ms 28620 KB Output is correct
4 Correct 15 ms 28620 KB Output is correct
5 Correct 19 ms 28692 KB Output is correct
6 Correct 21 ms 28872 KB Output is correct
7 Correct 116 ms 32416 KB Output is correct
8 Correct 18 ms 28748 KB Output is correct
9 Correct 20 ms 28848 KB Output is correct
10 Correct 112 ms 32496 KB Output is correct
11 Correct 146 ms 32404 KB Output is correct
12 Correct 142 ms 32580 KB Output is correct
13 Correct 133 ms 32460 KB Output is correct
14 Correct 206 ms 35368 KB Output is correct
15 Correct 1834 ms 68200 KB Output is correct
16 Correct 203 ms 37564 KB Output is correct
17 Correct 1804 ms 71916 KB Output is correct
18 Correct 1317 ms 71100 KB Output is correct
19 Correct 1340 ms 71684 KB Output is correct
20 Correct 1605 ms 71980 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 17 ms 28672 KB Output is correct
2 Correct 16 ms 28660 KB Output is correct
3 Correct 120 ms 31760 KB Output is correct
4 Correct 1046 ms 68208 KB Output is correct
5 Incorrect 1230 ms 68280 KB Output isn't correct
6 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 15 ms 28620 KB Output is correct
2 Correct 14 ms 28676 KB Output is correct
3 Correct 14 ms 28708 KB Output is correct
4 Correct 14 ms 28612 KB Output is correct
5 Correct 15 ms 28664 KB Output is correct
6 Correct 18 ms 28696 KB Output is correct
7 Correct 37 ms 29304 KB Output is correct
8 Correct 32 ms 29288 KB Output is correct
9 Correct 35 ms 29380 KB Output is correct
10 Correct 32 ms 29328 KB Output is correct
11 Correct 36 ms 29356 KB Output is correct
12 Correct 36 ms 29288 KB Output is correct
13 Correct 31 ms 29296 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 14 ms 28620 KB Output is correct
2 Correct 14 ms 28620 KB Output is correct
3 Correct 14 ms 28692 KB Output is correct
4 Correct 14 ms 28608 KB Output is correct
5 Correct 22 ms 28852 KB Output is correct
6 Incorrect 911 ms 68212 KB Output isn't correct
7 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 16 ms 28620 KB Output is correct
2 Correct 15 ms 28620 KB Output is correct
3 Correct 16 ms 28696 KB Output is correct
4 Correct 15 ms 28604 KB Output is correct
5 Correct 15 ms 28712 KB Output is correct
6 Correct 115 ms 31500 KB Output is correct
7 Correct 203 ms 35268 KB Output is correct
8 Correct 1075 ms 67840 KB Output is correct
9 Correct 1117 ms 67780 KB Output is correct
10 Correct 1036 ms 67540 KB Output is correct
11 Correct 1012 ms 67064 KB Output is correct
12 Correct 1012 ms 66980 KB Output is correct
13 Correct 1063 ms 66936 KB Output is correct
14 Correct 1061 ms 67036 KB Output is correct
15 Correct 15 ms 28620 KB Output is correct
16 Correct 15 ms 28608 KB Output is correct
17 Correct 15 ms 28620 KB Output is correct
18 Correct 15 ms 28620 KB Output is correct
19 Correct 19 ms 28692 KB Output is correct
20 Correct 21 ms 28872 KB Output is correct
21 Correct 116 ms 32416 KB Output is correct
22 Correct 18 ms 28748 KB Output is correct
23 Correct 20 ms 28848 KB Output is correct
24 Correct 112 ms 32496 KB Output is correct
25 Correct 146 ms 32404 KB Output is correct
26 Correct 142 ms 32580 KB Output is correct
27 Correct 133 ms 32460 KB Output is correct
28 Correct 206 ms 35368 KB Output is correct
29 Correct 1834 ms 68200 KB Output is correct
30 Correct 203 ms 37564 KB Output is correct
31 Correct 1804 ms 71916 KB Output is correct
32 Correct 1317 ms 71100 KB Output is correct
33 Correct 1340 ms 71684 KB Output is correct
34 Correct 1605 ms 71980 KB Output is correct
35 Correct 17 ms 28672 KB Output is correct
36 Correct 16 ms 28660 KB Output is correct
37 Correct 120 ms 31760 KB Output is correct
38 Correct 1046 ms 68208 KB Output is correct
39 Incorrect 1230 ms 68280 KB Output isn't correct
40 Halted 0 ms 0 KB -