Submission #972247

#TimeUsernameProblemLanguageResultExecution timeMemory
972247pccSeats (IOI18_seats)C++17
100 / 100
1986 ms119368 KiB
#include "seats.h"
#include <bits/stdc++.h>
using namespace std;

#define pii pair<int,int>
#define fs first
#define sc second

const int big = 1010;
const int mxn = 1e6+10;

struct SEG{
#define ls now*2+1
#define rs now*2+2
#define mid ((l+r)>>1)
	struct node{
		int mn,tag,cnt;
		node(){}
	};
	node seg[mxn*4];
	void build(int now,int l,int r){
		if(l == r){
			seg[now].cnt = 1;
			return;
		}
		build(ls,l,mid);build(rs,mid+1,r);
		seg[now].cnt = seg[ls].cnt+seg[rs].cnt;
	}
	void modify(int now,int l,int r,int s,int e,int v){
		if(s>e)return;
		if(l>=s&&e>=r){
			seg[now].tag += v;
			return;
		}
		if(mid>=s)modify(ls,l,mid,s,e,v);
		if(mid<e)modify(rs,mid+1,r,s,e,v);
		seg[now].mn = min(seg[ls].tag+seg[ls].mn,seg[rs].tag+seg[rs].mn);
		seg[now].cnt = 0;
		if(seg[ls].tag+seg[ls].mn == seg[now].mn)seg[now].cnt += seg[ls].cnt;
		if(seg[rs].tag+seg[rs].mn == seg[now].mn)seg[now].cnt += seg[rs].cnt;
		return;
	}
#undef ls
#undef rs
#undef mid
};

SEG seg;
vector<vector<int>> grid;
pii pos[mxn];
int N,M;

void add(int r,int c,int coef = 1){
	vector<int> v = {grid[r][c],grid[r][c+1],grid[r+1][c],grid[r+1][c+1]};
	sort(v.begin(),v.end());
	seg.modify(0,0,N*M-1,v[0],v[1]-1,coef);
	seg.modify(0,0,N*M-1,v[2],v[3]-1,big*coef);
	return;
}

int getans(){
	int cnt = seg.seg[0].cnt,val = seg.seg[0].mn+seg.seg[0].tag;
	if(val != 4)return 0;
	else return cnt;
}

void give_initial_chart(int H, int W, std::vector<int> R, std::vector<int> C) {
	N = H,M = W;
	grid = vector<vector<int>>(N+2,vector<int>(M+2,N*M));
	seg.build(0,0,N*M-1);
	for(int i = 0;i<N*M;i++){
		pos[i] = pii(R[i],C[i]);
		pos[i].fs++;
		pos[i].sc++;
		grid[pos[i].fs][pos[i].sc] = i;
	}
	for(int i = 0;i<=N;i++){
		for(int j = 0;j<=M;j++){
			add(i,j,1);
		}
	}
	return;
}

int swap_seats(int a, int b) {
	pii pa = pos[a],pb = pos[b];
	for(int i = -1;i<1;i++){
		for(int j = -1;j<1;j++){
			add(pa.fs+i,pa.sc+j,-1);
			add(pb.fs+i,pb.sc+j,-1);
		}
	}
	swap(pos[a],pos[b]);
	swap(grid[pa.fs][pa.sc],grid[pb.fs][pb.sc]);
	for(int i = -1;i<1;i++){
		for(int j = -1;j<1;j++){
			add(pa.fs+i,pa.sc+j,1);
			add(pb.fs+i,pb.sc+j,1);
		}
	}
	return getans();
}
#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...