제출 #413670

#제출 시각아이디문제언어결과실행 시간메모리
413670_fractalSeats (IOI18_seats)C++14
11 / 100
4088 ms71916 KiB
#include "seats.h"
#include <climits>
using namespace std;

#define pb push_back
#define S second
#define F first

typedef pair<short int, short int> pii;

const int N = 1e6 + 200;
const int inf = (1 << 30);

int S, ans = 0;
int H, W;

pair<int, int> pos[N];
int rx[N], lx[N], ry[N], ly[N];

struct tree {

	pii t[N << 2];

	void merge(pii &a, pii b, pii c) {
		a.F = max(b.F, c.F);
		a.S = min(b.S, c.S);
	}

	void upd(int pos, int val, int v = 1, int tl = 1, int tr = S) {
		if (tl == tr) {
			t[v] = {val, val};
			return;
		}
		int tm = tl + tr >> 1;
		if (pos <= tm)
			upd(pos, val, v * 2, tl, tm);
		else
			upd(pos, val, v * 2 + 1, tm + 1, tr);
		merge(t[v], t[v * 2], t[v * 2 + 1]);
	};

	pii get(int l, int r, int v = 1, int tl = 1, int tr = S) {
		if (l <= tl && tr <= r)
			return t[v];
		if (r < tl || tr < l)
			return {SHRT_MIN, SHRT_MAX};
		int tm = tl + tr >> 1;
		pii ret;
		merge(ret, get(l, r, v * 2, tl, tm), get(l, r, v * 2 + 1, tm + 1, tr));
		return ret;
	}
} tx, ty;

void give_initial_chart(int _H, int _W, vector<int> R, vector<int> C) {
	H = _H, W = _W;
	S = H * W;
	swap(R, C);
	for (int i = 0; i < H * W; ++i)
		pos[i + 1] = {R[i], C[i]};
	rx[0] = -inf, lx[0] = +inf;
	ry[0] = -inf, ly[0] = +inf;
	for (int i = 1; i <= S; ++i) {
		rx[i] = max(rx[i - 1], pos[i].F);
		lx[i] = min(lx[i - 1], pos[i].F);
		ry[i] = max(ry[i - 1], pos[i].S);
		ly[i] = min(ly[i - 1], pos[i].S);
		if (H + W <= 3000) {
			tx.upd(i, pos[i].F);
			ty.upd(i, pos[i].S);
		}
		if ((rx[i] - lx[i] + 1) * (ry[i] - ly[i] + 1) == i)
			ans++;
	}
}

int get(int pos) {
	pair<int, int> a = tx.get(1, pos);
	pair<int, int> b = ty.get(1, pos);
	return (a.F - a.S + 1) * (b.F - b.S + 1);
}

int swap_seats(int a, int b) {
	++a, ++b;
	if (a > b) swap(a, b);
	swap(pos[a], pos[b]);
	if (H + W <= 3000) {
		tx.upd(a, pos[a].F);
		tx.upd(b, pos[b].F);
		ty.upd(a, pos[a].S);
		ty.upd(b, pos[b].S);
		int pos = 1, cnt = 0;
		while (true) {
			int npos = get(pos);
			if (npos == pos)
				cnt++;
			pos = npos + (pos == npos);
			if (pos > S) break;
		}
		return cnt;
	}
	for (int i = a; i <= b; ++i) {
		if ((rx[i] - lx[i] + 1) * (ry[i] - ly[i] + 1) == i)
			ans--;
		rx[i] = max(rx[i - 1], pos[i].F);
		lx[i] = min(lx[i - 1], pos[i].F);
		ry[i] = max(ry[i - 1], pos[i].S);
		ly[i] = min(ly[i - 1], pos[i].S);
		if ((rx[i] - lx[i] + 1) * (ry[i] - ly[i] + 1) == i)
			ans++;
	}
	return ans;
}

컴파일 시 표준 에러 (stderr) 메시지

seats.cpp: In member function 'void tree::upd(int, int, int, int, int)':
seats.cpp:34:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   34 |   int tm = tl + tr >> 1;
      |            ~~~^~~~
seats.cpp: In member function 'pii tree::get(int, int, int, int, int)':
seats.cpp:47:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   47 |   int tm = tl + tr >> 1;
      |            ~~~^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...