Submission #294019

#TimeUsernameProblemLanguageResultExecution timeMemory
294019TheRedstarSeats (IOI18_seats)C++14
17 / 100
4046 ms55672 KiB
#include "seats.h"
#include <bits/stdc++.h>

using namespace std;

typedef vector<int> vi;

int W,H;
vi R,C;

bitset<1000000> good;

int range[4][1000000];

int total=0;

int comp(int t, int a, int b) {
	if((t&1)==0) return min(a,b);
	return max(a,b);
}

void give_initial_chart(int h, int w, vi r, vi c) {
	W=w;
	H=h;
	R=r;
	C=c;
	

	for(int i=0; i<W*H; i++) {
		for(int j=0; j<4; j++) {
			if(i) range[j][i]=comp(j,range[j][i-1],j<2 ? R[i] : C[i]);
			else range[j][i]=j<2 ? R[i] : C[i];
		}
		if((range[1][i]-range[0][i]+1)*(range[3][i]-range[2][i]+1)==i+1) {
			good[i]=true;
			total++;
			//cout << "good " << i << endl;
		}
	}
	//cout << total << endl;
}

int swap_seats(int a, int b) {
	if(a>b) {a^=b;b^=a;a^=b;};
	int r1,c1,r2,c2;
	r1=R[a];
	c1=C[a];
	r2=R[b];
	c2=C[b];
	
	R[a]=r2;
	C[a]=c2;
	R[b]=r1;
	C[b]=c1;
	
	for(int i=a; i<=b; i++) {
		for(int j=0; j<4; j++) {
			if(i) range[j][i]=comp(j,range[j][i-1],j<2 ? R[i] : C[i]);
			else range[j][i]=j<2 ? R[i] : C[i];
		}
		
		if(((range[1][i]-range[0][i]+1)*(range[3][i]-range[2][i]+1)==i+1) ^ good[i]) {
			good[i]=good[i]^true;
			total=total-1+2*good[i];
			//cout << "changed " << i << endl;
		}
	}
	
	return total;
}
#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...