社区讨论

求,为什么会MLE啊qwq?

P4768[NOI2018] 归程参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@lwmzivvs
此快照首次捕获于
2024/05/26 11:33
2 年前
此快照最后确认于
2024/05/26 14:19
2 年前
查看原帖
rt,50分
算了一下空间,应该是没有问题。所以为什么啊qwq
CPP
#include<bits/stdc++.h>
using namespace std;
inline int read(){
	int rt=0; char g=getchar();
	while(g<'0'||g>'9')	g=getchar();
	while(g>='0'&&g<='9')	rt=(rt<<3)+(rt<<1)+g-'0',g=getchar();
	return rt;
}
inline void out(long long A){
	if(A<10){putchar(A+'0');return;}
	out(A/10);	putchar(A%10+'0');
}

int T,n,m,Q,s,v,p;
long long lastans;
bool kk;

struct edge{int u,v,h;}e[400005];
bool cmp_h(edge A,edge B){return A.h>B.h;}
int f[400005][20],num;
struct tree{
	int ls,rs,h;
	long long ans;
}tr[200005];
void dfs(int now,int fa){
	f[now][0]=fa;
	for(int j=1;j<20;j++)	f[now][j]=f[f[now][j-1]][j-1];
	if(!tr[now].ls)	return;
	dfs(tr[now].ls,now);	dfs(tr[now].rs,now);
	tr[now].ans=min(tr[tr[now].ls].ans,tr[tr[now].rs].ans);
}

struct node{int to,w;};
vector<node>t[200005];
struct massage{int bh;long long dis;};
bool operator<(massage A,massage B){return A.dis>B.dis;}
long long dis[200005];
bool ck[200005];
priority_queue<massage>q;
void dij(){
	while(!q.empty())	q.pop();
	memset(dis,0x3f,sizeof(dis));
	memset(ck,0,sizeof(ck));
	q.push({1,0});	dis[1]=0;
	massage now;
	while(!q.empty())
	{
		now=q.top();	q.pop();
		if(ck[now.bh])	continue;
		ck[now.bh]=1;
		for(int i=0,to,w;i<t[now.bh].size();i++)
		{
			to=t[now.bh][i].to;	w=t[now.bh][i].w;
			if(dis[to]>dis[now.bh]+w)
				dis[to]=dis[now.bh]+w,q.push({to,dis[to]});
		}
	}
}

int b[400005];
int BOSS(int A){return b[A]==A?A:b[A]=BOSS(b[A]);}
void HB(int A,int B){b[BOSS(A)]=BOSS(B);}

void init()
{
	lastans=0;
	memset(f,0,sizeof(f));
	memset(tr,0,sizeof(tr));
	for(int i=1;i<=(n<<1);i++)	t[i].clear(),b[i]=i;
}
int main()
{
	T=read();
	while(T--)
	{
		n=read();	m=read();
		init();
		for(int i=1,w;i<=m;i++)
		{
			e[i]={read(),read(),0};w=read();e[i].h=read();
			t[e[i].u].push_back({e[i].v,w});
			t[e[i].v].push_back({e[i].u,w});
		}
		dij();
		sort(e+1,e+1+m,cmp_h);
		for(int i=1;i<=n;i++)	tr[i]={0,0,0x3f3f3f3f,dis[i]};
		num=n;
		for(int i=1;i<=m;i++)
		{
			if(BOSS(e[i].u)==BOSS(e[i].v))	continue;
			tr[++num]={BOSS(e[i].u),BOSS(e[i].v),e[i].h,0x3f3f3f3f};
			HB(e[i].u,num);	HB(e[i].v,num);
		}
		dfs(num,num);
		Q=read();	kk=read();	s=read();
		while(Q--)
		{
			v=read();	p=read();
			if(kk)	v=(v+lastans-1)%n+1,p=(p+lastans)%(s+1);
			for(int i=19;i>=0;i--)if(tr[f[v][i]].h>p)v=f[v][i];
			lastans=tr[v].ans;out(tr[v].ans);puts("");
		}
	}
	return 0;
}

回复

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

正在加载回复...