MLE求助
查看原帖
MLE求助
785917
Chthollian楼主2024/8/20 16:02

开数组开了101MB。

#include<bits/stdc++.h>
using namespace std;
char a;
int n,m,op,x,y,q,cnt,tot,li,g[1000005],cnt2,anc[800005][21],sz[1000005],lg,to[1000005],val[1000005],last[1000005];
int dfn(int x)
{
	return (x==g[x]?x:g[x]=dfn(g[x]));
}
struct Edge
{
	int u,v,k,id;
} edge[1000005];
struct EDge
{
	int to,pre;
} e[400005];
char b;
void add(int u,int v)
{
	e[++cnt].to=v;
	e[cnt].pre=last[u];
	last[u]=cnt;
}
bool cmp(Edge x,Edge y)
{
	return x.k>y.k;
}
void dfs(int now)
{
	for(int i=1;i<=lg+1;i++)
	{
		anc[now][i]=anc[anc[now][i-1]][i-1];
	}
	if(now<=n)
	{
		sz[now]=1;
		return;
	}
	for(int i=last[now];i;i=e[i].pre)
	{
		int to=e[i].to;
		if(sz[to])
		{
			continue;
		}
		anc[to][0]=now;
		dfs(to);
		sz[now]+=sz[to];
	}
}
int main()
{
	cin>>n>>m>>q;
	cnt2=n;
	lg=log2(n);
	for(int i=1;i<=n;i++)
	{
		g[i]=i;
	}
	for(int i=1;i<=m;i++)
	{
		cin>>edge[i].u>>edge[i].v>>edge[i].k;
		edge[i].id=i;
	}
	sort(edge+1,edge+m+1,cmp);
	for(int i=1;i<=m;i++)
	{
		int du=dfn(edge[i].u),dv=dfn(edge[i].v);
		if(du==dv)
		{
			continue;
		}
		g[++cnt2]=g[du]=g[dv]=cnt2;
		add(cnt2,du),add(cnt2,dv);
		to[edge[i].id]=cnt2;
		val[cnt2]=edge[i].k;
		tot++;
		if(tot==n-1)
		{
			break;
		}
	}
	for(int i=cnt2;i>=1;i--)
	{
		if(!sz[i])
		{
			dfs(i);
		}
	}
	while(q--)
	{
		cin>>op>>x;
		if(op==1)
		{
			li=x;
		}
		else if(op==2)
		{
			for(int i=lg+1;i>=0;i--)
			{
				if(anc[x][i] && val[anc[x][i]]>=li)
				{
					x=anc[x][i];
				}
			}
			cout<<sz[x]<<"\n";
		}
		else
		{
			cin>>y;
			val[to[x]]=y;
		}
	}
	//cout<<(&b-&a)/1024/1024;
	return 0;
}
2024/8/20 16:02
加载中...