Submission #108110

#TimeUsernameProblemLanguageResultExecution timeMemory
108110hugo_pmWall (IOI14_wall)C++17
100 / 100
1306 ms92208 KiB
#include "wall.h"
#include <bits/stdc++.h>
using namespace std;

#define form2(i, a, b) for (int i = (a); i < (b); ++i)
#define ford2(i, a, b) for (int i = (a-1); i >= (b); --i)
#define form(i, n) form2(i, 0, n)
#define ford(i, n) ford2(i, n, 0)

#define chmax(x, v) x = max(x, (v))
#define chmin(x, v) x = min(x, (v))
#define fi first
#define se second

const int BIG = (int)(1e9);

typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;

const int borne = 2*1000*1000 + 5;
int down[4*borne];
int up[4*borne];
int rep[borne];

void takeDown(int nod, int liv, int riv, int lop, int rop, int val);
void takeUp(int nod, int liv, int riv, int lop, int rop, int val);

void push(int nod, int liv, int riv)
{
	int mm =(liv+riv) / 2;
	takeDown(2*nod, liv, mm, liv, mm, down[nod]);
	takeUp(2*nod, liv, mm, liv, mm, up[nod]);

	takeDown(2*nod+1, mm+1, riv, mm+1, riv, down[nod]);
	takeUp(2*nod+1, mm+1, riv, mm+1, riv, up[nod]);

	down[nod] = BIG;
	up[nod] = 0;
}

void takeDown(int nod, int liv, int riv, int lop, int rop, int val)
{
	if (lop <= liv && riv <= rop) {
		chmin(down[nod], val);
		chmin(up[nod], down[nod]);
		return;
	}
	if (lop > riv || rop < liv) return;
	push(nod,liv,riv);
	int mm = (liv+riv) / 2;
	takeDown(2*nod, liv, mm, lop, rop, val);
	takeDown(2*nod + 1, mm+1, riv, lop, rop, val);
}

void takeUp(int nod, int liv, int riv, int lop, int rop, int val)
{
	if (lop <= liv && riv <= rop) {
		chmax(up[nod], val);
		chmax(down[nod], up[nod]);
		return;
	}
	if (lop > riv || rop < liv) return;
	push(nod,liv,riv);
	int mm = (liv+riv) / 2;
	takeUp(2*nod, liv, mm, lop, rop, val);
	takeUp(2*nod + 1, mm+1, riv, lop, rop, val);
}

void con(int nod, int liv, int riv)
{
	if (liv == riv) {
		rep[liv] = min(down[nod], up[nod]);
		return;
	}
	push(nod,liv,riv);
	int mm = (liv+riv) / 2;
	con(2*nod, liv, mm);
	con(2*nod+1, mm+1, riv);
}

void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){
	form(i, 4*borne) down[i] = BIG;
	form(i, k) {
		if (op[i] == 1) takeUp(1, 0, n-1, left[i], right[i], height[i]);
		else takeDown(1, 0, n-1, left[i], right[i], height[i]);
	}
	con(1, 0, n-1);
	form(i, n) finalHeight[i] = rep[i];
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...