社区讨论

20pts WA 玄关求条

P9638「yyOI R1」youyou 的军训参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@m2kc0w2l
此快照首次捕获于
2024/10/22 18:58
去年
此快照最后确认于
2025/11/04 16:31
4 个月前
查看原帖
rt
CPP
#include<bits/stdc++.h>
using namespace std;
inline int rd()
{
	int res=0;
	char c=getchar();
	while(!isdigit(c))c=getchar();
	while(isdigit(c))res=res*10+c-'0',c=getchar();
	return res;
}
bool sta;
const int N=400050;
int n,m,q,minn;
struct edge{
	int x,y,w;
	bool operator <(edge a)const{return w>a.w;}
}e[N],e2[N];
struct change{
	int x,y;
};
vector<change>stk;
int fa[N<<1],W[N<<1],siz[N<<1],st[N<<1][25],dep[N<<1];
int g[N<<1][2];
int idx;
bool ed;
inline int find(int x)
{
	if(fa[x]!=x)fa[x]=find(fa[x]);
	return fa[x];
}
inline bool mer(int x,int y,int w)
{
	if(find(x)==find(y))return 0;
	idx++;
	W[idx]=w;
	siz[idx]=siz[fa[x]]+siz[fa[y]];
	st[fa[x]][0]=st[fa[y]][0]=idx;
	g[idx][0]=fa[x];g[idx][1]=fa[y];
	fa[fa[x]]=fa[fa[y]]=idx;
	return 1;
}
inline void dfs(int x,int d)		// 获取 dep
{
	dep[x]=d;
	if(g[x][0])
	{
		dfs(g[x][0],d+1);
		dfs(g[x][1],d+1);
	}
}
inline int lca(int x,int y)
{
	if(dep[x]<dep[y])swap(x,y);
	for(int i=24;i>=0;i--)
	{
		if(dep[x]-(1<<i)>=dep[y])
			x=st[x][i];
	}
	if(x==y)return x;
	for(int i=24;i>=0;i--)
	{
		if(st[x][i]!=st[y][i])
		{
			x=st[x][i];
			y=st[y][i];
		}
	}
	return st[x][0];
}
inline int query(int x)
{
	for(int i=24;i>=0;i--)
	{
		if(W[st[x][i]]>=minn)
			x=st[x][i];
	}
	return siz[x];
}
int main()
{
	cerr<<(&ed-&sta)/1024.0/1024<<'\n';
	n=idx=rd();m=rd();q=rd();
	for(int i=1;i<=n*2;i++)fa[i]=i;
	fill(siz+1,siz+n+1,1);
	for(int i=1;i<=m;i++)
	{
		e[i].x=e2[i].x=rd();
		e[i].y=e2[i].y=rd();
		e[i].w=e2[i].w=rd();
	}
	sort(e+1,e+m+1);
	for(int i=1;i<=m;i++)mer(e[i].x,e[i].y,e[i].w);
	for(int k=1;k<22;k++)
	{
		for(int i=1;i<=n*2;i++)
			st[i][k]=st[st[i][k-1]][k-1];
	}
	for(int i=1;i<=n*2;i++)
	{
		if(fa[i]==i)
			dfs(i,1);
	}
	/*
	printf("dep : ");
	for(int i=1;i<=n*2;i++)printf("%d ",dep[i]);
	puts("");
	for(int i=1;i<=n*2;i++)
	{
		printf("%d (siz = %d , w = %d): ",i,siz[i],W[i]);
		for(int k=0;k<=5;k++)printf("%d ",st[i][k]);
		puts("");
	}*/
	int op,x,y;
	while(q--)
	{
		op=rd();
		if(op==1)
		{
			minn=rd();
			for(auto j:stk)W[lca(e2[j.x].x,e2[j.x].y)]=j.y;
			stk.clear();
		}
		else if(op==2)		// query
		{
			x=rd();
			printf("%d\n",query(x));
		}
		else {				// change
			x=rd();y=rd();
			stk.push_back((change){x,y});
			//W[lca(e2[x].x,e2[x].y)]=y;
		}
	}
}

回复

1 条回复,欢迎继续交流。

正在加载回复...