제출 #559226

#제출 시각아이디문제언어결과실행 시간메모리
559226keta_tsimakuridze자리 배치 (IOI18_seats)C++14
70 / 100
4025 ms190564 KiB
#include "seats.h"
#include<bits/stdc++.h>
using namespace std;
const int N = 1e6 + 2;
#define f first
#define s second
#define pii pair<int,int> 
#define Pii pair<pair<int,int>, int> 
#define mp make_pair
vector<vector<int> > a, f;
int n,h, w, T;
Pii tree[4 * N];
int dx[] = {0, 0, 0, -1, 1};
int dy[] = {0, -1, 1, 0, 0};
pair<int,int> lazy[4 * N], pos[N];
void add(pii &a, pii b) {
	a.f += b.f;
	a.s += b.s;
}
void push(int u,int l,int r) {
	add(tree[u].f, lazy[u]);
	if(l != r) {
		add(lazy[2 * u],lazy[u]);
		add(lazy[2 * u + 1], lazy[u]);
	}
	lazy[u] = {0, 0};
}
void upd(int u, int st, int en, int l,int r, pii v) {
	push(u, l, r);
	if(l > en || r < st) return;
	if(st <= l && r <= en) {
		lazy[u] = v;
		push(u, l, r);
		return;
	}
	int mid = (l + r) / 2;
	upd(2 * u, st, en, l, mid, v); upd(2 * u + 1, st, en, mid + 1, r, v);
	if(tree[2 * u].f != tree[2 * u + 1].f) tree[u] = min(tree[2 * u], tree[2 * u + 1]);
	else tree[u].f = tree[2 * u + 1].f, tree[u].s = tree[2 * u + 1].s + tree[2 * u].s;
}
void build(int u, int l,int r) {
	tree[u].s = r - l + 1;
	if(l == r) return;
	
	build(2 * u, l, (l + r) / 2); build(2 * u + 1, (l + r)/2 + 1, r);
}
void add(int i, int j, int t) {
	if(i > h || j > w || i <= 0 || j <= 0 || f[i][j] == T) return;
	f[i][j] = T;
	int m = max(max(a[i + 1][j], a[i - 1][j]), max(a[i][j + 1], a[i][j - 1]));
	m = max(a[i - 1][j], a[i][j +  1]); upd(1, m ,a[i][j] - 1, 1, n,  mp(0, t));
	m = max(a[i + 1][j], a[i][j + 1]); upd(1, m, a[i][j] - 1, 1, n, mp(0, t));
	m = max(a[i - 1][j], a[i][j - 1]); upd(1, m, a[i][j] - 1, 1, n, mp(0, t));
	m = max(a[i - 1][j], a[i][j + 1]); upd(1, m, a[i][j] - 1, 1, n, mp(0, t));
	
	
	m = min(a[i - 1][j], a[i][j +  1]); upd(1, a[i][j], m - 1, 1, n,  mp(t,0));
	m = min(a[i + 1][j], a[i][j + 1]); upd(1, a[i][j], m - 1, 1, n, mp(t,0));
	m = min(a[i - 1][j], a[i][j - 1]); upd(1, a[i][j], m - 1, 1, n, mp(t,0));
	m = min(a[i - 1][j], a[i][j + 1]); upd(1, a[i][j], m - 1, 1, n, mp(t,0));
 
}
void give_initial_chart(int H, int W, std::vector<int> R, std::vector<int> C) {
	n = H * W; h = H, w = W;
	a.resize(H + 2, vector<int> (W + 2)); f.resize(H + 2, vector<int> (W + 2));
	build(1, 1, n);
	for(int i = 0; i <= H; i++) {
		a[i][0] = a[i][W + 1] = n + 1;
	}
	for(int i = 0; i <= W; i++) {
		a[0][i] = a[H + 1][i] = n + 1;
	}	
	for(int i = 0; i < H * W; i++) {
		++R[i]; ++C[i];
		a[R[i]][C[i]] = i + 1;
		pos[i + 1] = {R[i], C[i]};
	}
	++T;
	for(int i = 1; i <= H; i++) {
		for(int j = 1; j <= W; j++) { 
			add(i, j, 1);
		} 
	} 
}
 
int swap_seats(int c, int b) {
	
	++c; ++b;
	++T; 
	for(int k = 0; k < 5; k++) {
		add(pos[c].f + dx[k], pos[c].s + dy[k], -1);
		add(pos[b].f + dx[k], pos[b].s + dy[k], -1);		
	}
 
	swap(a[pos[b].f][pos[b].s], a[pos[c].f][pos[c].s]);
	swap(pos[c], pos[b]); 
	pair<pair<int,int>, int> p = tree[1];
	++T;
	for(int k = 0; k < 5; k++) {
		add(pos[c].f + dx[k], pos[c].s + dy[k], 1);
		add(pos[b].f + dx[k], pos[b].s + dy[k], 1);		
	}
	p = tree[1];
	assert(p.f.f >= 4);
	if(p.f.s != 0 || p.f.f != 4) return 0;
	return p.s;
}
/*
namespace {
 
int read_int() {
  int x;
  if (scanf("%d", &x) != 1) {
    fprintf(stderr, "Error while reading input\n");
    exit(1);
  }
  return x;
}
 
}  // namespace
 
int main() {
  int H = read_int();
  int W = read_int();
  int Q = read_int();
  std::vector<int> R(H * W), C(H * W);
  for (int i = 0; i < H * W; ++i) {
    R[i] = read_int();
    C[i] = read_int();
  }
  std::vector<int> A(Q), B(Q);
  for (int j = 0; j < Q; ++j) {
    A[j] = read_int();
    B[j] = read_int();
  }
 
  give_initial_chart(H, W, R, C);
  for (int j = 0; j < Q; ++j) {
    int answer = swap_seats(A[j], B[j]);
    printf("%d\n", answer);
  }
  return 0;
}*/
#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...