真的完全自闭了

P4768 [NOI2018] 归程

100pts ```cpp #include<bits/stdc++.h> #define maxn 2000010 using namespace std; int head[maxn],tot;//用于求最短路 int tree_head[maxn],sum;//用于重构树 int n,m; int f[maxn],fa[maxn][25],dif[maxn]; struct Edge{ int u,v,len,height,next; void add(int x,int y,int l,int h){u=x,v=y,len=l,height=h;} void add_edge(int x,int y,int l,int h){ u=x,v=y,len=l,height=h; next=head[u]; head[u]=tot; } // void _add(int x,int y){ // v=y; // next=tree_head[u]; // tree_head[u]=sum; // printf("%d\n",tree_head[u]); // printf("%d to %d",x,y); // printf("all right\n"); // } bool operator <(Edge path)const{ return path.height <height; } }; Edge e[maxn];//用于求最短路 Edge E[maxn];//用于构建Kruskal树 Edge ed[maxn];//用于存储输入数据 struct node{ int pos,dis; bool operator <(node nd)const { return dis>nd.dis ; } }; priority_queue<node >q; bool vis[maxn]; int dis[maxn]; void dijkstra(){ dis[1]=0; q.push((node){1,0}); while(!q.empty()){ node now=q.top(); q.pop(); int u=now.pos ; if(vis[u])continue; vis[u]=true; for(int i=head[u];i;i=e[i].next ){ int v=e[i].v ; if(dis[v]>dis[u]+e[i].len){ dis[v]=dis[u]+e[i].len ; if(!vis[v])q.push((node){v,dis[v]}); } } } } void _add(int x,int y){ E[++sum].v =y; E[sum].next =tree_head[x]; tree_head[x]=sum; } void dfs(int u){ //printf("now is %d\n",u); for(int i=1;i<=20;i++)fa[u][i]=fa[fa[u][i-1]][i-1]; //if(!tree_head[u])return ; for(int i=tree_head[u];i;i=E[i].next ){ int v=E[i].v ; dfs(v); //printf("%d\n",dis[v]); dis[u]=min(dis[u],dis[v]); } return ; } int find(int x){return f[x]==x?x:f[x]=find(f[x]);} int num; void kruskal(){ for(int i=1;i<=n;i++)f[i]=i; sort(ed+1,ed+m+1); int cnt=n; for(int i=1;i<=m;i++){ int u=ed[i].u ,v=ed[i].v ; int fu=find(u),fv=find(v); if(fu==fv)continue; dif[++cnt]=ed[i].height; f[fu]=f[fv]=f[cnt]=cnt; fa[fu][0]=fa[fv][0]=cnt; // E[++sum]._add(cnt,fu); // E[++sum]._add(cnt,fv); _add(cnt,fu); _add(cnt,fv); } // num=cnt; // for(int i=1;i<=num;i++)printf("%d ",tree_head[i]); // printf("\n"); dfs(cnt); // for(int i=1;i<=cnt;i++)printf("%d ",dis[i]); // printf("\n"); } int main(){ int T; scanf("%d",&T); for(int up=1;up<=T;up++){ memset(e,0,sizeof e); memset(ed,0,sizeof ed); memset(E,0,sizeof E); memset(vis,0,sizeof vis); memset(tree_head,0,sizeof tree_head); memset(head,0,sizeof head); //f,fa,dif memset(f,0,sizeof f); memset(fa,0,sizeof fa); memset(dif,0,sizeof dif); scanf("%d%d",&n,&m); for(int i=1,u,v,l,a;i<=m;i++){ scanf("%d%d%d%d",&u,&v,&l,&a); ed[i].add(u,v,l,a); e[++tot].add_edge(u,v,l,a); e[++tot].add_edge(v,u,l,a); } //for(int i=1;i<=100;i++)dis[i]=10000; memset(dis,0x3f3f3f3f,sizeof dis); dijkstra(); // dfs(num); kruskal(); // for(int i=1;i<=num;i++)printf("%d ",dis[i]); // printf("\n"); int q,k,s,lastans=0; scanf("%d%d%d",&q,&k,&s); for(int i=1,v,p;i<=q;i++){ scanf("%d%d",&v,&p); v=(v+k*lastans-1)%n+1; p=(p+k*lastans)%(s+1); for(int i=20;i>=0;i--){ if(fa[v][i]&&dif[fa[v][i]]>p)v=fa[v][i]; } printf("%d\n",dis[v]); lastans=dis[v]; }} return 0; } ``` 还有,为什么数组要开到160w啊?不应该2m=80w就行了吗?而且我开160w还会re,必须开到200w ![](https://s2.ax1x.com/2019/08/27/m5oeln.jpg)
by HRLYB @ 2019-08-27 16:40:27


|