马蜂良好WA0 求调
查看原帖
马蜂良好WA0 求调
530468
_determination_楼主2024/3/21 17:26
#include<bits/stdc++.h>
#define int long long
#define inf 0x3f3f3f3f3f3f3f3f
#define endl '\n'
using namespace std;
void debug(){cout << "debug" << endl;}
void debug(string s){cout << "debug " << s << endl;}
void debug(int x){cout << "debug " << x << endl;}
int n,m,q,k;
vector<int>e[100010];
int dep[100010],siz[100010],fa[100010],son[100010];
multiset<int,greater<int> >st[40010];
void dfs1(int x,int f)
{
	fa[x]=f,dep[x]=dep[f]+1,siz[x]++;
	for ( int i = 0 ; i < e[x].size() ; i++ )
	{
		int v=e[x][i];
		if(v==f)continue;
		dfs1(v,x);
		siz[x]+=siz[v];
		if(siz[son[x]]<siz[v])son[x]=v;
	}
}
int id[100010],bef[100010],top[100010],tot;
void dfs2(int x,int head)
{
	if(!x)return;
	id[x]=++tot,bef[tot]=x,top[x]=head;
	dfs2(son[x],head);
	for ( int i = 0 ; i < e[x].size() ; i++ )
	{
		int v=e[x][i];
		if(v==fa[x]||v==son[x])continue;
		dfs2(v,v);
	}
}
struct node{
	int a[25],tot;
	int l,r;
}t[400010];
node pu(node l,node r)
{
	node ans;
	ans.l=l.l;
	ans.r=r.r;
	ans.tot=0;
	int f1=0,f2=0;
	while(f1<l.tot&&f2<r.tot&&ans.tot<k)
	{
		if(l.a[f1]>r.a[f2])
		{
			ans.a[ans.tot++]=l.a[f1++];
		}else{
			ans.a[ans.tot++]=r.a[f2++];
		}
	}
	while(f1<l.tot&&ans.tot<k)
	{
		ans.a[ans.tot++]=l.a[f1++];
	}
	while(f2<r.tot&&ans.tot<k)
	{
		ans.a[ans.tot++]=r.a[f2++];
	}
	return ans;
}
#define iter multiset<int,greater<int> >::iterator
void build(int x,int l,int r)
{
	t[x].l=l;
	t[x].r=r;
	if(l==r)
	{
		iter it=st[bef[l]].begin();
		t[x].tot=0;
		while(t[x].tot<k&&it!=st[bef[l]].end())
		{
			t[x].a[t[x].tot++]=*it;
			it++;
		}
		//选k个点 
		return;
	}
	int mid=(l+r)/2;
	build(x<<1,l,mid);
	build(x<<1|1,mid+1,r);
	t[x]=pu(t[x<<1],t[x<<1|1]);
}
void upd(int x,int p)
{
	int lf=t[x].l;
	int rt=t[x].r;
	if(p<lf||rt<p)
	{
		return;
	}
	if(p<=lf&&rt<=p)
	{
		iter it=st[bef[lf]].begin();
		t[x].tot=0;
		while(t[x].tot<k&&it!=st[bef[lf]].end())
		{
			t[x].a[t[x].tot++]=*it;
			it++;
		}
		return;
	}
	upd(x<<1,p);
	upd(x<<1|1,p);
	t[x]=pu(t[x<<1],t[x<<1|1]);
}
node calc(int x,int l,int r)
{
	int lf=t[x].l;
	int rt=t[x].r;
	if(l<=lf&&rt<=r)
	{
		return t[x];
	}
	int mid=(lf+rt)/2;
	if(mid<l)
	{
		return calc(x<<1|1,l,r);
	}
	if(r<=mid)
	{
		return calc(x<<1,l,r);
	}
	return pu(calc(x<<1,l,r),calc(x<<1|1,l,r));
}
int x[40010],y[40010];
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin >> n ;
	for ( int i = 1 ; i < n ; i++ )
	{
		int u,v;
		cin >> u >> v;
		e[u].push_back(v),e[v].push_back(u);
	}
	cin >> m;
	for ( int i = 1 ; i <= m ; i++ )
	{
		cin >> x[i] >> y[i];
		st[y[i]].insert(x[i]);
	}
	cin >> q>>k;
	dfs1(1,1),dfs2(1,1),build(1,1,n);
	while(q--)
	{
		int u,v,op;
		cin >> op >> u >> v ;
		if(op==1)
		{
			node ans;
			ans.tot=0;
			while(top[u]!=top[v])
			{
				if(dep[top[u]]<dep[top[v]])
				{
					swap(u,v);
				}
				ans=pu(ans,calc(1,id[top[u]],id[u]));
				u=fa[top[u]];
			}
			ans=pu(ans,calc(1,min(id[u],id[v]),max(id[u],id[v])));
			if(ans.tot==0)cout << -1;
			for ( int i = 0 ; i < min(k,ans.tot) ; i++ )
			{
				cout << ans.a[i] << " ";
			}
			cout << endl;
		}else if(op==2)
		{
			st[y[u]].erase(st[y[u]].find(x[u]));
			st[v].insert(x[u]);
			y[u]=v;
			upd(1,id[y[u]]);
			upd(1,id[v]);
		}else{
			st[y[u]].erase(st[y[u]].find(x[u]));
			st[y[u]].insert(v);
			upd(1,id[y[u]]);
			x[u]=v;
		}
	}
	return 0;
}
2024/3/21 17:26
加载中...