80分不是MLE就是WA,求助
查看原帖
80分不是MLE就是WA,求助
998474
ShaunJulian楼主2024/8/13 19:04
#include<bits/stdc++.h>
#define int long long
using namespace std;

const int maxn=5e5+1;
int n,m,root;
vector<int> to [maxn];
vector<int> pos;
bool vis[maxn];
int st[25][maxn];
int dfn[maxn], idx, D[maxn],B[maxn];
int dt[maxn];
int ln(int a)
{
	return log(a)/log(2);
}
void dfs(int x)
{
	D[x]=++idx;
	B[idx]=x;
	pos.push_back(D[x]);
	vis[x]=1;
	for(int i=0;i<to[x].size();i++)
	if(!vis[to[x][i]])
	{
		dt[to[x][i]]=dt[x]+1;
		dfs(to[x][i]);
		pos.push_back(D[x]);
	}
	dfn[D[x]]=pos.size();
	vis[x]=0;
}

int query(int a,int b)
{
	if(a>b)
	swap(a,b);
	int k=ln(b-a+1);
	return min(st[k][a],st[k][b-(1<<k)+1]);
}
signed main()
{
	scanf("%d%d",&n,&m);
	int a,b,c;
	for(int i=1;i<n;i++)
	{
		scanf("%d%d",&a,&b);
		if(i==1)
		root=a;
		to[a].push_back(b);
		to[b].push_back(a);
	}
	
	dfs(root);
	for(int i=1;i<=pos.size()+1;i++)
	{
		st[0][i]=pos[i-1];
	}
	for(int i=1;(1<<i)<=pos.size();i++)
	{
		for(int j=1;j+(1<<i)<=pos.size()+1;j++)
		{
			st[i][j]=min(st[i-1][j],st[i-1][j+(1<<(i-1))]);
		}
	}
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&a,&b,&c);
		int P1=query(dfn[D[a]],dfn[D[b]]);
		int P2=query(dfn[D[a]],dfn[D[c]]);
		int P3=query(dfn[D[b]],dfn[D[c]]);
		
//		cout<<D[a]<<"   "<<D[b]<<"   "<<D[c]<<endl<<endl;
		
//		cout<<P1<<"   "<<P2<<"  "<<P3<<endl;
		
		if(P1==P2&&P2==P3)
		{
			printf("%d %d\n",B[P1],dt[a]+dt[b]+dt[c]-3*dt[B[P1]]);
		}
		if(P1==P2&&P2!=P3)
		{
			printf("%d %d\n",B[P3],dt[a]+dt[b]+dt[c]-dt[B[P3]]-2*dt[B[P2]]);
		}
		if(P1==P3&&P2!=P3)
		{
			printf("%d %d\n",B[P2],dt[a]+dt[b]+dt[c]-dt[B[P2]]-2*dt[B[P1]]);
		}
		if(P2==P3&&P1!=P2)
		{
			printf("%d %d\n",B[P1],dt[a]+dt[b]+dt[c]-dt[B[P1]]-2*dt[B[P2]]);
		}
	}
	return 0;
}
/*
18 5
8 9
9 10
9 11
1 8
7 1
2 1
2 3
2 4
4 5
5 6
2 12
2 13
12 14
12 15
12 16
18 15
17 15
*/

这是MLE,显示125MB https://www.luogu.com.cn/record/172424883

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
const int maxn=500001;
int n,m,root;
vector<int> to [maxn];
vector<int> pos;
bool vis[maxn];
int st[25][maxn];
int dfn[maxn], idx, D[maxn],B[maxn];
int dt[maxn];
int ln(int a)
{
	return log(a)/log(2);
}
void dfs(int x)
{
	D[x]=++idx;
	B[idx]=x;
	pos.push_back(D[x]);
	vis[x]=1;
	for(int i=0;i<to[x].size();i++)
	if(!vis[to[x][i]])
	{
		dt[to[x][i]]=dt[x]+1;
		dfs(to[x][i]);
		pos.push_back(D[x]);
	}
	dfn[D[x]]=pos.size();
	vis[x]=0;
}

int query(int a,int b)
{
	if(a>b)
	swap(a,b);
	int k=ln(b-a+1);
	return min(st[k][a],st[k][b-(1<<k)+1]);
}
int main()
{
	scanf("%d%d",&n,&m);
	int a,b,c;
	for(int i=1;i<n;i++)
	{
		scanf("%d%d",&a,&b);
		if(i==1)
		root=a;
		to[a].push_back(b);
		to[b].push_back(a);
	}
	
	dfs(root);
	for(int i=1;i<=pos.size()+1;i++)
	{
		st[0][i]=pos[i-1];
	}
	for(int i=1;(1<<i)<=pos.size();i++)
	{
		for(int j=1;j+(1<<i)<=pos.size()+1;j++)
		{
			st[i][j]=min(st[i-1][j],st[i-1][j+(1<<(i-1))]);
		}
	}
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&a,&b,&c);
		int P1=query(dfn[D[a]],dfn[D[b]]);
		int P2=query(dfn[D[a]],dfn[D[c]]);
		int P3=query(dfn[D[b]],dfn[D[c]]);
		if(P1==P2&&P2==P3)
		{
			printf("%d %d\n",B[P1],dt[a]+dt[b]+dt[c]-3*dt[B[P1]]);
		}
		if(P1==P2&&P2!=P3)
		{
			printf("%d %d\n",B[P3],dt[a]+dt[b]+dt[c]-dt[B[P3]]-2*dt[B[P2]]);
		}
		if(P1==P3&&P2!=P3)
		{
			printf("%d %d\n",B[P2],dt[a]+dt[b]+dt[c]-dt[B[P2]]-2*dt[B[P1]]);
		}
		if(P2==P3&&P1!=P2)
		{
			printf("%d %d\n",B[P1],dt[a]+dt[b]+dt[c]-dt[B[P1]]-2*dt[B[P2]]);
		}
	}
	return 0;
}
/*
18 5
8 9
9 10
9 11
1 8
7 1
2 1
2 3
2 4
4 5
5 6
2 12
2 13
12 14
12 15
12 16
18 15
17 15
*/
这是WA,WA的那两个点显示81.75MB和81.76MB

太奇怪了!怎么#define int long long 写了就导致空间爆掉,不写就炸int?

2024/8/13 19:04
加载中...