Submission #131602

#TimeUsernameProblemLanguageResultExecution timeMemory
131602rondojimSeats (IOI18_seats)C++17
Compilation error
0 ms0 KiB
#include <bits/stdc++.h>
 
using namespace std;
 
const int N = 1e6 + 7;
 
struct segtree{
	struct node{
		int cnt, mn, lz;
 
		node(){
			mn = 0;
			cnt = 1;
			lz = 0;
		}
 
		node operator+(const node &p)const{
			node ret;
 
            ret.mn = min(mn, p.mn);
            ret.cnt = 0;
 
            if (ret.mn == mn){
            	ret.cnt += cnt;
            }
            if (ret.mn == p.mn){
            	ret.cnt += p.cnt;
            }
 
            ret.lz = 0;
 
            return ret;
		}
	}seg[4 * N];
 
	void update_lazy(int idx){
		seg[2 * idx].mn += seg[idx].lz;
		seg[2 * idx].lz += seg[idx].lz;
 
		seg[2 * idx + 1].mn += seg[idx].lz;
		seg[2 * idx + 1].lz += seg[idx].lz;
 
		seg[idx].lz = 0;
	}
 
	void update(int idx, int l, int r, int sl, int sr, int val){
		//cout << "update" << idx << " " << l << " " << r << " " << sl << " " << sr << " " << val << endl;
 
		if(l > sr || r < sl){
			return;
		}
		if(sl <= l && r <= sr){
			seg[idx].mn += val;
			seg[idx].lz += val;
 
			return;
		}
 
		update_lazy(idx);
 
		int mid = (l + r) >> 1;
 
		update(2 * idx, l, mid, sl, sr, val);
		update(2 * idx + 1, mid + 1, r, sl, sr, val);
 
		seg[idx] = seg[2 * idx] + seg[2 * idx + 1];
	}
 
	int get(){
		if(seg[1].mn == 2){
			return seg[1].cnt;
		}
 
		return 0;
	}
}st;
 
pair<int, int> p[N], mx[N], mn[N];
int ptr[N];
int h, w;
 
int ans = 0;
 
void give_initial_chart(int H, int W, vector<int> R, vector<int> C){
	h = H;
	w = W;
 
	for(int i = 0; i < (int)R.size(); i++){
		p[i].first = R[i];
		p[i].second = C[i];
	}
 
	if(h == 1){
		for(int i = 0; i < w; i++){
			ptr[p[i].second] = i;
		}
 
		for(int i = 0; i < w; i++){
			//cout << i << " i" << endl;
 
			if(p[i].second == H * W - 1){
				st.update(1, 0, w - 1, i, w - 1, 1);
 
				continue;
			}
			if(p[i].second == 0){
				st.update(1, 0, w - 1, i, w - 1, 1);
			}
 
			//cout << p[i].second + 1 << " p[i].second" << endl;
			
			int j = ptr[p[i].second + 1];
 
			//cout << j<< " j" << endl;
 
			st.update(1, 0, w - 1, min(i, j), max(i, j) - 1, 1);
		}
 
		return;
	}
 
	mx[0].first = p[0].first;
	mx[0].second = p[0].second;
	mn[0].first = p[0].first;
	mn[0].second = p[0].second;
 
	ans++;
 
	for(int i = 1; i < H * W; i++){
		mx[i].first = max(mx[i - 1].first, p[i].first);
		mx[i].second = max(mx[i - 1].second, p[i].second);
 
		mn[i].first = min(mn[i - 1].first, p[i].first);
		mn[i].second = min(mn[i - 1].second, p[i].second);
 
		if((mx[i].first - mn[i].first + 1) * (mx[i].second - mn[i].second + 1) == i + 1){
			ans++;
		}
	}
}
 
int swap_seats(int a, int b){
	if(h == 1){
		if(w == 1){
			return 1;
		}
 
		if(a == b){
			return st.get();
		}
		if(a > b){
			swap(a, b);
		}
 
		//cout << p[a].second << " p " << p[b].second << endl;
 
		if(p[a].second + 1 != p[b].second){
			int x, y;
 
			if(p[a].second != w - 1){
				x = ptr[p[a].second + 1];
 
				//cout << x << " x" << endl;
 
				st.update(1, 0, w - 1, min(a, x), max(a, x) - 1, -1);
				st.update(1, 0, w - 1, min(b, x), max(b, x) - 1, 1);
			}
			else{
				st.update(1, 0, w - 1, a, w - 1, -1);
				st.update(1, 0, w - 1, b, w - 1, 1);
			}
 
			if(p[b].second != 0){
				y = ptr[p[b].second - 1];
 
				//cout << y << " y" << endl; 
 
				st.update(1, 0, w - 1, min(b, y), max(b, y) - 1, -1);
				st.update(1, 0, w - 1, min(a, y), max(a, y) - 1, 1);
			}
			else{
				st.update(1, 0, w - 1, a, w - 1, 1);
				st.update(1, 0, w - 1, b, w - 1, -1);
			}
		}
		if(p[a].second != p[b].second + 1){
			int x, y;
 
			if(p[a].second != 0){
				x = ptr[p[a].second - 1];
 
				//cout << x << " x" << endl;
 
				st.update(1, 0, w - 1, min(a, x), max(a, x) - 1, -1);
				st.update(1, 0, w - 1, min(b, x), max(b, x) - 1, 1);
			}
			else{
				st.update(1, 0, w - 1, a, w - 1, -1);
				st.update(1, 0, w - 1, b, w - 1, 1);
			}
 
			if(p[b].second != w - 1){
				y = ptr[p[b].second + 1];
 
				//cout << y << " y" << endl;
 
				st.update(1, 0, w - 1, min(b, y), max(b, y) - 1, -1);
				st.update(1, 0, w - 1, min(a, y), max(a, y) - 1, 1);
			}
			else{
				st.update(1, 0, w - 1, a, w - 1, 1);
				st.update(1, 0, w - 1, b, w - 1, -1);
			}
		}
 
		swap(p[a], p[b]);
		swap(ptr[p[a].second], ptr[p[b].second]);
 
		return st.get();
	}
 
	swap(p[a], p[b]);
 
	if(a > b){
		swap(a, b);
	}
 
	for(int i = a; i <= b; i++){
		if((mx[i].first - mn[i].first + 1) * (mx[i].second - mn[i].second + 1) == i + 1){
			ans--;
		}
 
		if(i){
			mx[i].first = max(mx[i - 1].first, p[i].first);
			mx[i].second = max(mx[i - 1].second, p[i].second);
 
			mn[i].first = min(mn[i - 1].first, p[i].first);
			mn[i].second = min(mn[i - 1].second, p[i].second);
		}
		else{
			mx[0].first = p[0].first;
			mx[0].second = p[0].second;
			mn[0].first = p[0].first;
			mn[0].second = p[0].second;
		}
 
		if((mx[i].first - mn[i].first + 1) * (mx[i].second - mn[i].second + 1) == i + 1){
			ans++;
		}
	}
 
	return ans;
}
 
/*int main(){
	int H, W;
 
	cin >> H >> W;
 
	vector<int> R, C; 
 
	for(int i = 0; i < H * W; i++){
		int x;
 
		cin >> x;
 
		R.push_back(x);
	}
 
	for(int i = 0; i < H * W; i++){
		int x;
 
		cin >> x;
 
		C.push_back(x);
	}
 
	give_initial_chart(H, W, R, C);
 
	while(true){
		int a, b;
 
		cin >> a >> b;
 
		//cout << swap_seats(a, b) << endl;
	}

Compilation message (stderr)

seats.cpp:255:1: error: unterminated comment
 /*int main(){
 ^