求助 TLE#9
查看原帖
求助 TLE#9
614725
masonpop楼主2023/8/19 21:05

感觉复杂度在 5 秒内能跑过去,但是实际 TLE#9,并且显示的是 return code -1,所以怀疑是哪里 RE 了,但是又找不出来问题(CF 没给我显示)。求大佬指点。

#include <bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
const int maxn=5e4+10;
const int maxm=4e5+10;
const int inf=1e9;
int n,N,m,x,y;
int app[maxn];
int head[maxm],to[maxm],nxt[maxm],ver[maxm],tot;
char s[maxn];
priority_queue<pii> q;
int dis[910][maxn+910],vis[maxn+910];
inline int ID(int i)//空隙的权值
{
	return (s[i]-'a')*26+(s[i+1]-'a');	
} 
inline void add(int x,int y,int z)
{
	to[++tot]=y;
	nxt[tot]=head[x];
	head[x]=tot;
	ver[tot]=z;
}
inline void dijkstra(int s)
{
	memset(vis,0,sizeof(vis));
	while(!q.empty())q.pop();
	dis[s-N][s]=0;
	q.push(mp(0,s));
	while(!q.empty())
	{
		int x=q.top().se;q.pop();
		if(vis[x])continue;
		vis[x]=1;
		for(int i=head[x];i;i=nxt[i])
		{
			int y=to[i];
			if(dis[s-N][y]>dis[s-N][x]+ver[i])
			{
				dis[s-N][y]=dis[s-N][x]+ver[i];
				q.push(mp(-dis[s-N][y],y));
			}
		}
	}
}
int main()
{
	scanf("%s",s+1);
	n=strlen(s+1);N=n+1;
	for(int i=1;i<=n-1;i++)
	{
		add(i,i+1,2);
		add(i+1,i,2);//边权扩倍 
	}
	for(int i=1;i<=n-1;i++)
	{
		add(ID(i)+N,i,1);//连虚点 
		add(i,ID(i)+N,1);
		app[ID(i)]=1;
	}
	memset(dis,0x3f,sizeof(dis));
	for(int i=0;i<=26*26;i++)if(app[i])dijkstra(i+N);
	scanf("%d",&m);
	while(m--)
	{
		scanf("%d%d",&x,&y);
		int ans=abs(x-y);
		for(int i=0;i<=26*26;i++)if(app[i])ans=min(ans,(dis[i][x]+dis[i][y])>>1);
		printf("%d\n",ans);
	}
	return 0;
}
2023/8/19 21:05
加载中...