这题有人用LCT过了吗
查看原帖
这题有人用LCT过了吗
924621
pig1121楼主2024/8/4 12:11

RT,一直TLE,根本卡不动常数

#include<iostream>
#include<fstream>
#include<vector>
#include<algorithm>
#include<cstring>
#include<string>
#include<set>
#define endl '\n'

using namespace std;

ifstream fin;
ofstream fout;

struct node{
	int ch[2],rev,fa;
	vector<int>key,mn;
};

node lct[200005];

vector<int> merge(vector<int>s1,vector<int>s2){
	vector<int>res;
	auto it1=s1.begin(),it2=s2.begin();
	while(it1!=s1.end()&&it2!=s2.end()&&res.size()<=10){
		if(*it1<=*it2)res.push_back(*(it1++));
		else res.push_back(*(it2++));
	}
	while(it1!=s1.end()&&res.size()<=10)res.push_back(*(it1++));
	while(it2!=s2.end()&&res.size()<=10)res.push_back(*(it2++));
	return res;
}

inline void update(int p){
	int l=lct[p].ch[0],r=lct[p].ch[1];
	lct[p].mn=merge(lct[p].key,merge(lct[l].mn,lct[r].mn));
}

inline void pushr(int p){
	int&l=lct[p].ch[0],&r=lct[p].ch[1];
	swap(l,r);
	lct[p].rev^=1;
}

inline void pushdown(int p){
	int l=lct[p].ch[0],r=lct[p].ch[1];
	if(lct[p].rev){
		if(l)pushr(l);
		if(r)pushr(r);
		lct[p].rev=0;
	}
}

inline bool isroot(int p){
	return (lct[lct[p].fa].ch[0]!=p)&&(lct[lct[p].fa].ch[1]!=p);
}

inline void rotate(int p){
	int f=lct[p].fa,ff=lct[f].fa;
	if(!isroot(f))lct[ff].ch[(lct[ff].ch[1]==f)]=p;
	int l=(lct[f].ch[1]==p),r=!l;
	lct[f].fa=p;
	lct[p].fa=ff;
	lct[lct[p].ch[r]].fa=f;
	lct[f].ch[l]=lct[p].ch[r];
	lct[p].ch[r]=f;
	update(f);
	update(p);
}

int st[100005],tp;

inline void splay(int p){
	tp=0;
	st[++tp]=p;
	for(int i=p;!isroot(i);i=lct[i].fa)st[++tp]=lct[i].fa;
	while(tp)pushdown(st[tp--]);
	while(!isroot(p)){
		int f=lct[p].fa,ff=lct[f].fa;
		if(!isroot(f)){
			if((lct[ff].ch[1]==f)^(lct[f].ch[1]==p))rotate(p);
			else rotate(f);
		}
		rotate(p);
	}
}

void access(int p){
	for(int i=0;p;p=lct[p].fa){
		splay(p);
		lct[p].ch[1]=i;
		update(p);
		i=p;
	}
}

void makeroot(int p){
	access(p);
	splay(p);
	pushr(p);
}

int split(int x,int y){
	makeroot(x);
	access(y);
	splay(y);
	return y;
}

void query(int x,int y,int a){
	int p=split(x,y);
	int cnt=0;
	cout<<min(a,(int)lct[p].mn.size())<<' ';
	for(auto it=lct[p].mn.begin();it!=lct[p].mn.end();it++){
		cout<<*it<<' ';
		cnt++;
		if(cnt>=a)break;
	}
	cout<<endl;
}

void link(int x,int y){
	makeroot(x);
	splay(y);
	lct[x].fa=y;
}

int u[100005],v[100005];

signed main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int n,m,q;
	cin>>n>>m>>q;
	for(int i=1;i<n;i++)cin>>u[i]>>v[i];
	for(int i=1;i<=m;i++){
		int x;
		cin>>x;
		lct[x].key.push_back(i);
	}
	for(int i=1;i<=n;i++){
		sort(lct[i].key.begin(),lct[i].key.end());
		update(i);
	}
	for(int i=1;i<n;i++)link(u[i],v[i]);
	while(q--){
		int x,y,a;
		cin>>x>>y>>a;
		query(x,y,a);
	}
	return 0;
}
2024/8/4 12:11
加载中...