답안 #596472

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
596472 2022-07-14T19:08:22 Z Elias 벽 (IOI14_wall) C++17
100 / 100
745 ms 130660 KB
#include <bits/stdc++.h>

using namespace std;

#ifndef _DEBUG
#include "wall.h"
#endif

template <class T>
istream &operator>>(istream &in, vector<T> &a)
{
	for (auto &x : a)
		in >> x;
	return in;
}

int minusMin(int a, int b)
{
	if (a == -1)
		return b;
	if (b == -1)
		return a;
	return min(a, b);
}

int minusMax(int a, int b)
{
	if (a == -1)
		return b;
	if (b == -1)
		return a;
	return max(a, b);
}

struct Node
{
	int low = -1;
	int high = -1;
	bool first = 0;

	void Apply(Node update)
	{

		if (this->low == -1 && this->high == -1)
		{
			*this = update;
			return;
		}
		if (update.low == -1 && update.high == -1)
			return;

		low = minusMax(low, update.low);
		high = minusMin(high, update.high);

		if (low > high && high != -1)
		{
			low = high = ((low == update.low) ? update.low : update.high);
		}

		bool a = low == update.low && low != -1;
		bool b = high == update.high && high != -1;

		if (a && b)
			first = update.low;
		else if (a)
			first = 0;
		else if (b)
			first = 1;
	}
};

Node emp = {-1, -1, 0};

vector<Node> b;

void updateRange(int l, int r, int i, int ul, int ur, Node up)
{
	if (l >= ur || r <= ul)
		return;
	if (l >= ul && r <= ur)
	{
		b[i].Apply(up);
		return;
	}

	b[i * 2 + 1].Apply(b[i]);
	b[i * 2 + 2].Apply(b[i]);

	b[i] = emp;

	int m = (l + r) / 2;
	updateRange(l, m, i * 2 + 1, ul, ur, up);
	updateRange(m, r, i * 2 + 2, ul, ur, up);
}

void extractValues(int l, int r, int i, int a[])
{
	if (l + 1 == r)
	{
		a[l] = max(b[i].low, 0);
		return;
	}

	b[i * 2 + 1].Apply(b[i]);
	b[i * 2 + 2].Apply(b[i]);

	b[i] = emp;

	int m = (l + r) / 2;
	extractValues(l, m, i * 2 + 1, a);
	extractValues(m, r, i * 2 + 2, a);
}

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

	b = vector<Node>(n * 4, emp);

	for (int i = 0; i < k; i++)
		updateRange(0, n, 0, left[i], right[i] + 1, ((op[i] == 1) ? Node{height[i], -1, 0} : Node{-1, height[i], 1}));

	extractValues(0, n, 0, finalHeight);
}

#ifdef _DEBUG

signed main()
{
	cin.tie(0);
	ios_base::sync_with_stdio(false);

	int n, k;
	cin >> n >> k;

	vector<int> op, left, right, height;
	op = left = right = height = vector<int>(k);
	cin >> op >> left >> right >> height;

	vector<int> finalHeight(n);

	buildWall(n, k, op, left, right, height, finalHeight);

	for (int &x : finalHeight)
		cout << x << " ";
	cout << "\n";
}

#endif
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 4 ms 340 KB Output is correct
3 Correct 3 ms 360 KB Output is correct
4 Correct 8 ms 980 KB Output is correct
5 Correct 5 ms 1012 KB Output is correct
6 Correct 5 ms 980 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 296 KB Output is correct
2 Correct 218 ms 13912 KB Output is correct
3 Correct 306 ms 8264 KB Output is correct
4 Correct 689 ms 22940 KB Output is correct
5 Correct 294 ms 24028 KB Output is correct
6 Correct 299 ms 22480 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 2 ms 340 KB Output is correct
3 Correct 2 ms 340 KB Output is correct
4 Correct 8 ms 948 KB Output is correct
5 Correct 5 ms 980 KB Output is correct
6 Correct 6 ms 1008 KB Output is correct
7 Correct 1 ms 212 KB Output is correct
8 Correct 177 ms 13904 KB Output is correct
9 Correct 229 ms 8240 KB Output is correct
10 Correct 718 ms 22960 KB Output is correct
11 Correct 330 ms 24004 KB Output is correct
12 Correct 317 ms 22432 KB Output is correct
13 Correct 1 ms 212 KB Output is correct
14 Correct 152 ms 14012 KB Output is correct
15 Correct 42 ms 2288 KB Output is correct
16 Correct 745 ms 23200 KB Output is correct
17 Correct 306 ms 22624 KB Output is correct
18 Correct 351 ms 22624 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 2 ms 340 KB Output is correct
3 Correct 2 ms 312 KB Output is correct
4 Correct 8 ms 980 KB Output is correct
5 Correct 5 ms 984 KB Output is correct
6 Correct 8 ms 980 KB Output is correct
7 Correct 1 ms 296 KB Output is correct
8 Correct 145 ms 13888 KB Output is correct
9 Correct 244 ms 8256 KB Output is correct
10 Correct 631 ms 22940 KB Output is correct
11 Correct 271 ms 24012 KB Output is correct
12 Correct 291 ms 22380 KB Output is correct
13 Correct 1 ms 212 KB Output is correct
14 Correct 134 ms 13928 KB Output is correct
15 Correct 43 ms 2192 KB Output is correct
16 Correct 668 ms 23204 KB Output is correct
17 Correct 290 ms 22588 KB Output is correct
18 Correct 273 ms 22628 KB Output is correct
19 Correct 693 ms 130548 KB Output is correct
20 Correct 671 ms 128032 KB Output is correct
21 Correct 677 ms 130660 KB Output is correct
22 Correct 693 ms 128092 KB Output is correct
23 Correct 690 ms 128116 KB Output is correct
24 Correct 675 ms 128052 KB Output is correct
25 Correct 662 ms 128052 KB Output is correct
26 Correct 665 ms 130548 KB Output is correct
27 Correct 674 ms 130604 KB Output is correct
28 Correct 672 ms 128076 KB Output is correct
29 Correct 680 ms 128116 KB Output is correct
30 Correct 663 ms 128084 KB Output is correct