답안 #1039209

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1039209 2024-07-30T14:33:04 Z mateuszwes 벽 (IOI14_wall) C++17
0 / 100
16 ms 33352 KB
#include "wall.h"

#include <bits/stdc++.h>
#define ll long long
#define ull unsigned long long
#define i128 __int128
#define F first
#define S second
#define pb push_back
#define pi pair<int,int>
#define pl pair<ll,ll>
#define pq priority_queue
 
using namespace std;
constexpr int debug = 1;
constexpr int N = 2e6+7;
constexpr int M = 1e5+7;
constexpr int base = 1<<21;

int l, r;
pi tree[2*base+7], tree2[2*base+7];		//min, maks

//if new min smaller then keep unchanged
//if new min > old min then adjust min
//if new min > max then max = min
//etc
//these changes are ok because they include the time

void mini(int git, int v){
	if(git == -1) return;
	if(git > tree[v].F){
		tree[v].F = tree2[v].F = git;
		if(git > tree[v].S){
			tree[v].S = tree2[v].S = git;
		}
	}
}

void maxi(int git, int v){
	if(git == -1) return;
	if(git < tree[v].S){
		tree[v].S = tree2[v].S = git;
		if(git < tree[v].F){
			tree[v].S = tree2[v].S = git;
		}
	}
}

void push(int v){
	mini(tree2[v].F, 2*v);
	maxi(tree2[v].F, 2*v);
	mini(tree2[v].S, 2*v+1);
	maxi(tree2[v].S, 2*v+1);
	tree2[v] = {-1, -1};
}

void change(int v, int operation, int val, int a, int b){
	if((b < l) || (a > r)) return;
	else if((a >= l) && (b <= r)){
		if(operation == 1){
			mini(val, v);
		}
		else{
			maxi(val, v);
		}
	}
	else{
		int mid = (a+b)/2;
		push(v);
		change(2*v, operation, val, a, mid);
		change(2*v+1, operation, val, mid+1, b);
		tree[v] = {min(tree[2*v].F, tree[2*v+1].F), max(tree[2*v].S, tree[2*v+1].S)};
	}
}

int read(int i, int v, int a, int b){
	if((b < i) || (a > i)) return -1;
	else if((a >= i) && (b <= i)){
		return tree[v].F;
	}
	else{
		int mid = (a+b)/2;
		push(v);
		int sc = read(i, 2*v, a, mid);
		if(sc == -1) return read(i, 2*v+1, mid+1, b);
		return sc;
	}
}

void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[]){
  	fill(finalHeight, finalHeight+n, 0);
  	for(int i = 0; i < 2*base+7; i++) tree2[i] = {-1, -1};
  	//1 is for adding
  	for(int i = 0; i < k; i++){
  		l = left[i];
  		r = right[i];
  		change(1, op[i], height[i], 0, base-1);
  	}

  	for(int i = 0; i < n; i++){
  		finalHeight[i] = read(i, 1, 0, base-1);
  		if(debug) cout << finalHeight[i] << '\n';
  	}
}

/*
int main(){
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	int ok[] = {1, 2, 2, 1, 1, 2};
	int lel[] = {1, 4, 3, 0, 2, 6};
	int rer[] = {8, 9, 6, 5, 2, 7};
	int heh[] = {4, 1 ,5, 3, 5 ,0};
	int fif[] = {0, 0, 0, 0, 0, 0};
	buildWall(10, 6, ok[], lel[], rer[], heh[], fif[]);
	
	return 0;
}
*/
# 결과 실행 시간 메모리 Grader output
1 Incorrect 16 ms 33112 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 13 ms 33116 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 13 ms 33352 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 13 ms 33116 KB Output isn't correct
2 Halted 0 ms 0 KB -