Submission #1141650

#TimeUsernameProblemLanguageResultExecution timeMemory
1141650Noproblem29Collapse (JOI18_collapse)C++20
5 / 100
163 ms2632 KiB
#include "collapse.h"
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+100;
#define ll long long
int n,m,q;
int p[N];
int pos[N];
vector<int>ans;
int dsu(int x){
	while(p[x]>=0)x=p[x];
	return x;
}
int sz;
void merge(int x,int y){
	x=dsu(x);
	y=dsu(y);
	if(x==y)return;
	if(p[x]<p[y])swap(x,y);
	if(p[x]==p[y])p[y]--;
	p[x]=y;
	sz--;
}
void solve1(vector<int>&t,vector<int>&x,vector<int>&y,vector<int>&w,vector<int>&ps){
	map<pair<int,int>,int>last;
	for(int i=0;i<m;i++){
		if(x[i]>y[i])swap(x[i],y[i]);
		if(last.count({x[i],y[i]})){
			pos[i]=last[{x[i],y[i]}];
			pos[pos[i]]=i;
			last.erase({x[i],y[i]});
		}
		else{
			last[{x[i],y[i]}]=i;
		}
	}
	for(auto i:last){
		pos[i.second]=m;
	}
	for(int i=0;i<q;i++){
		for(int j=0;j<n;j++){
			p[j]=-1;
		}
		sz=n;
		for(int j=0;j<=w[i];j++){
			if(x[j]<=ps[i]&&ps[i]+1<=y[j]){
				continue;
			}
			if(pos[j]>w[i]){
				merge(x[j],y[j]);
			}
		}
		ans[i]=sz;
	}
}
void solve2(){

}
vector<int> simulateCollapse(int _n,vector<int> t,vector<int> x,vector<int> y,vector<int> w,vector<int> ps) {
	n=_n;
	m=x.size();
	q=w.size();
	ans.resize(q,0);
	if(n<=5000&&m<=5000&&q<=5000){
		solve1(t,x,y,w,ps);
		return ans;
	}
	if(is_sorted(ps.begin(),ps.end())&&ps.front()==ps.back()){
		solve2();
		return ans;
	}
	return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...