답안 #260778

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
260778 2020-08-11T00:44:01 Z amoo_safar 청소 (JOI20_sweeping) C++14
10 / 100
13146 ms 1054904 KB
// Zende bad Shoma nasime faghat !
#include <bits/stdc++.h>

#define pb push_back
#define F first
#define S second
#define all(x) x.begin(), x.end()
#define debug(x) cerr << #x << " : " << x << '\n'
//#define int long long

using namespace std;

const int N = 15e5 + 10;
const int SGN = 45e5 + 2;

int lc[SGN], rc[SGN], la = 0;

vector<int> GX[N], GY[N];
int parX[N], parY[N], X[N], Y[N], wh[N], lapo = 0;
int FindX(int u){ return parX[u] = (parX[u] == u ? u : FindX(parX[u])); }
int FindY(int u){ return parY[u] = (parY[u] == u ? u : FindY(parY[u])); }
int GetX(int u){ return X[FindX(u)]; }
int GetY(int u){ return Y[FindY(u)]; }

void UniteX(int u, int v){
	//cerr << "# " << u << ' ' << v << '\n';
	u = FindX(u); v = FindX(v);
	if(u == v) return ;
	if(pair<int, int>(GetY(u), u) < pair<int, int>(GetY(v), v)) swap(u, v);
	parX[v] = u;
	GX[u].pb(v);
}

/*
void UniteY(int u, int v){
	u = FindY(u); v = FindY(v);
	if(u == v) return ;
	if(GetX(u) < GetX(v)) swap(u, v);
	parY[v] = u;
	GY[u].pb(v);
}
*/
struct CMPX {
	bool operator ()(int i, int j) const {
		if(GetX(i) != GetX(j))
			return GetX(i) < GetX(j);
		return i < j;
	}
};
struct CMPY {
	bool operator ()(int i, int j) const {
		if(GetY(i) != GetY(j))
			return GetY(i) < GetY(j);
		return i < j;
	}
};
set<int, CMPX> stX[SGN];
set<int, CMPY> stY[SGN];

int n, m, Q;
vector<int> vis;
void DFSY(int u, int id){
	if(wh[u] != id) return ;
	assert(GY[u].empty());

	vis.pb(u);
	for(auto adj : GY[u])
		DFSY(adj, id);
}

void Ins(int id, int po, int X0, int Y0){
	if(X[po] + Y[po] == n){
		parX[po] = parY[po] = po;
		return ;
	}

	assert(id < SGN);
	int L = n - (X0 + Y0);
	int X1 = X0 + (L / 2);
	int Y1 = Y0 + ((L + 1) / 2);
	if(X[po] > X1){
		if(lc[id] == 0) lc[id] = ++la;
		Ins(lc[id], po, X1, Y0);
	} else if(Y[po] > Y1){
		if(rc[id] == 0) rc[id] = ++la;
		Ins(rc[id], po, X0, Y1);
	} else {
		//cerr << "ins: " << po << ' ' << id << '\n'; 
		wh[po] = id;
		parX[po] = po; parY[po] = po;
		stX[id].insert(po); stY[id].insert(po);
		GX[po].clear(); GY[po].clear();
	}
}

vector<int> Un;

void H(int id, int l, int X0, int Y0){
	//if(l <= 0) return ;
	//if(id == 3) debug(l);
	//cerr << "H: " << id << ' ' << l << ' ' << X0 << ' ' << Y0 << '\n';
	int L = n - (X0 + Y0);
	int X1 = X0 + (L / 2);
	int Y1 = Y0 + ((L + 1) / 2);
	int rt, mv = L - l;
	assert(L > 1);
	//if(l == L) return ;
	//assert(l <= L);
	if(Y1 - Y0 <= l){ // shift
		//cerr << "! " << mv << ' ' << X0 << ' ' << Y0 << ' ' << '\n' << '\n';
		Un.clear();
		//cerr << "list: ";
		//for(auto po : stX[id]) cerr << po << ' ';
		//cerr << '\n';
		for(auto po : stX[id]){
			if(GetX(po) > X0 + mv) break;
			Un.pb(po);
			//cerr << "% " << po << '\n';
		}

		for(auto u : Un) stX[id].erase(u);
		
		for(int i = 0; i + 1 < (int) Un.size(); i++) UniteX(Un[i], Un[i + 1]);
		if(!Un.empty()){
			rt = FindX(Un.back());
			X[rt] = X0 + mv;
			stX[id].insert(rt);
		}
		/*
		for(auto u : Un){
			X[u] = X0 + mv;
			stX[id].insert(u);
		}
		*/
		if(rc[id] != 0)
			H(rc[id], l - (Y1 - Y0), X0, Y1);
	} else { // remove
		vis.clear();
		for(auto po : stY[id]){
			if(GetY(po) > Y0 + l) break;
			DFSY(po, id);
			//vis.pb(po);
		}
		//cerr << "vis: ";
		//for(auto x : vis) cerr << x << '\n';
		//cerr << '\n';
		for(auto u : vis) stY[id].erase(u), stX[id].erase(u);
		for(auto u : vis) X[u] = X0 + mv, Y[u] = GetY(u);
		assert(X0 + mv > X1);

		if(!vis.empty()){
			for(auto u : vis)
				Ins(0, u, 0, 0);
		}
		if(lc[id] != 0)
			H(lc[id], l, X1, Y0);
		
	}
}

int main(){
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin >> n >> m >> Q;
	for(int i = 0; i < m; i++){
		lapo ++;
		cin >> X[lapo] >> Y[lapo];
		Ins(0, lapo, 0, 0);
	}
	//cerr << '\n';
	int type, Li, Pi;
	for(int i = 1; i <= Q; i++){
		//if(i % 1000 == 0) debug(i);
		cin >> type;
		assert(type != 3);
		if(type == 4){
			lapo ++;
			cin >> X[lapo] >> Y[lapo];
			Ins(0, lapo, 0, 0);
		}
		if(type == 2){
			cin >> Li;
			H(0, Li, 0, 0);
			/*for(int j = 1; j <= lapo; j++)
				if(GetY(j) <= Li)
					X[j] = max(X[j], n - Li);
			*/
		}
		if(type == 1){
			cin >> Pi;
			cout << GetX(Pi) << ' ' << Y[Pi] << '\n';
		}
	}
	//cerr << wh[2] << ' ' << lc[lc[ lc[0] ] ]  << '\n';
	return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Runtime error 864 ms 990072 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 6247 ms 591692 KB Output is correct
2 Correct 5977 ms 590400 KB Output is correct
3 Correct 5940 ms 590572 KB Output is correct
4 Correct 5010 ms 571536 KB Output is correct
5 Correct 13146 ms 618044 KB Output is correct
6 Correct 11368 ms 608252 KB Output is correct
7 Correct 5905 ms 609312 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 1265 ms 1054904 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 1265 ms 1054904 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 864 ms 990072 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -