Submission #340937

#TimeUsernameProblemLanguageResultExecution timeMemory
340937couplefireSoccer (JOI17_soccer)C++17
100 / 100
984 ms187236 KiB
#include<bits/stdc++.h>
#define LL long long
using namespace std;
LL A,B,C;
int Head[8000005],Cnt,N,M,D[505][505],Mantot,Arrive[505][505];
struct Point{int Xh,Yh;}P[8000005];
struct Edge{int Next,To; LL W;}E[8000005];
void Add_Edge(int X1,int Y1,LL Z1){E[++Cnt].Next=Head[X1],E[Cnt].To=Y1,E[Cnt].W=Z1,Head[X1]=Cnt;}
int Change(int X0,int Y0,int K0){return K0*(N+1)*(M+1)+X0*(M+1)+Y0;}
const int Go[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
void BFS(){
   queue<pair<int,int> >Que;
   memset(D,0x3f,sizeof(D));
   for(int I=1;I<=Mantot;I++) Que.push(make_pair(P[I].Xh,P[I].Yh)),D[P[I].Xh][P[I].Yh]=0;
   while(!Que.empty()){
   	pair<int,int> Par=Que.front(); Que.pop();
   	Arrive[Par.first][Par.second]=0;
   	for(int I=0;I<4;I++){
   		int Nx=Par.first+Go[I][0],Ny=Par.second+Go[I][1];
   		if(Nx>N||Nx<0||Ny>M||Ny<0) continue;
   		if(D[Nx][Ny]>D[Par.first][Par.second]+1){
   			D[Nx][Ny]=D[Par.first][Par.second]+1;
   			if(!Arrive[Nx][Ny]) Que.push(make_pair(Nx,Ny)),Arrive[Nx][Ny]=1;
   		}
   	}
   }
}
struct Node{
   int Id;
   LL Dis;
   bool operator < (const Node& B)const{
   	return Dis>B.Dis;
   }
};
int Vis[8000005];
LL Best[8000005];
void Dijkstra(){
   priority_queue<Node>Q;
   memset(Best,0x3f,sizeof(Best));
   memset(Vis,0,sizeof(Vis));
   Q.push((Node){Change(P[1].Xh,P[1].Yh,4),0}),Best[Change(P[1].Xh,P[1].Yh,4)]=0;
   while(!Q.empty()){
   	Node Tp=Q.top(); Q.pop();
   	if(Vis[Tp.Id]) continue;
   	Vis[Tp.Id]=1;
   	for(int I=Head[Tp.Id];I;I=E[I].Next){
   		int Y=E[I].To;
   		if(Best[Y]<=Best[Tp.Id]+E[I].W) continue;
   		Best[Y]=Best[Tp.Id]+E[I].W,Q.push((Node){Y,Best[Y]});
   	} 
   }
}
signed main(){
   scanf("%d%d%lld%lld%lld%d",&N,&M,&A,&B,&C,&Mantot);
   for(int I=1;I<=Mantot;I++) scanf("%d%d",&P[I].Xh,&P[I].Yh);
   BFS();
   for(int I=0;I<=N;I++)
   	for(int J=0;J<=M;J++)
   		for(int U=0;U<4;U++){
   			Add_Edge(Change(I,J,U),Change(I,J,4),0LL);
   			Add_Edge(Change(I,J,4),Change(I,J,5),1LL*C*D[I][J]);
   			Add_Edge(Change(I,J,5),Change(I,J,U),1LL*B);
   			int Nx=I+Go[U][0],Ny=J+Go[U][1];
   			if(Nx<0||Ny<0||Nx>N||Ny>M) continue;
   			Add_Edge(Change(I,J,U),Change(Nx,Ny,U),1LL*A);
   			Add_Edge(Change(I,J,5),Change(Nx,Ny,5),1LL*C);
   		}
   Dijkstra();
   LL Ans=0x3f3f3f3f3f3f3f3f;
   for(int I=0;I<6;I++) Ans=min(Ans,Best[Change(P[Mantot].Xh,P[Mantot].Yh,I)]);
   printf("%lld",Ans);
   return 0;
}

Compilation message (stderr)

soccer.cpp: In function 'int main()':
soccer.cpp:54:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   54 |    scanf("%d%d%lld%lld%lld%d",&N,&M,&A,&B,&C,&Mantot);
      |    ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
soccer.cpp:55:36: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   55 |    for(int I=1;I<=Mantot;I++) scanf("%d%d",&P[I].Xh,&P[I].Yh);
      |                               ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...