Submission #1173699

#TimeUsernameProblemLanguageResultExecution timeMemory
1173699fabijan_cikacWall (IOI14_wall)C++20
100 / 100
344 ms152132 KiB
#include <bits/stdc++.h>
#include "wall.h"

using namespace std;

#define pb push_back
#define pp pair<int, int>
#define F first
#define S second
#define MP make_pair

const int BIT = 19;
const int N = 2 * 1e6 + 100;
const int K = (1 << BIT);
const int INF = 2 * 1e9;

vector<int> sweep[2][N];
pp t[2 * K];

pp merge(pp a, pp b){
	a.F = min(a.F, b.F);
	a.F = max(a.F, b.S);
	a.S = min(a.S, b.F);
	a.S = max(a.S, b.S);
	return a;
}

void upd(int x, pp p){
	x += K; t[x] = p;
	while (x > 1){
		x /= 2; t[x] = merge(t[2 * x], t[2 * x + 1]);
	}
}

//void buildWall(int n, int k, vector<int> op, vector<int> left, vector<int> right, vector<int> height, vector<int> finalHeight){
void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){

	for (int i = 1; i < 2 * K; ++i)
		t[i] = MP(INF, -INF);

	for (int i = 0; i < k; ++i){
		sweep[0][left[i]].pb(i);
		sweep[1][right[i]].pb(i);
	}
	
	for (int i = 0; i < n; ++i){
		for (int x: sweep[0][i])
			upd(x, op[x] == 1 ? MP(INF, height[x]) : MP(height[x], -INF));
			
		finalHeight[i] = merge(MP(0, 0), t[1]).F;
			
		for (int x: sweep[1][i]) upd(x, MP(INF, -INF));
	}
	
	/*for (int i = 0; i < n; ++i)
		cout << finalHeight[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...