社区讨论
求,为什么会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 条回复,欢迎继续交流。
正在加载回复...