답안 #1066299

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1066299 2024-08-19T17:35:46 Z NemanjaSo2005 Board Game (JOI24_boardgame) C++17
3 / 100
4000 ms 5976 KB
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=5e4+5;
vector<int> graf[maxn];
ll N,M,K,poz[maxn],res[maxn],dist[maxn],d1[maxn],d2[maxn],cena[maxn],propval[maxn];
bool nexttostop[maxn];
int prosli[maxn],pvred;
string stop;
priority_queue<pair<ll,ll>> PQ;
queue<pair<int,int>> Q;
void input(){
   ios_base::sync_with_stdio(false);
   cin.tie(0);
   cin>>N>>M>>K;
   while(M--){
      int a,b;
      cin>>a>>b;
      graf[a].push_back(b);
      graf[b].push_back(a);
   }
   cin>>stop;
   stop="0"+stop+"0000";
   for(int i=0;i<stop.size();i++)
      stop[i]-='0';
   for(int i=1;i<=K;i++)
      cin>>poz[i];
 //  cout<<"UNEO INPUT"<<endl;
}
void BFS(){
   for(int i=1;i<=N;i++)
      dist[i]=1e18;
   while(Q.size()){
      auto x=Q.front();
      Q.pop();
      int tren=x.first;
      int d=x.second;
    //  cout<<tren<<" "<<d<<endl;
      if(dist[tren]!=1e18)
         continue;
      dist[tren]=d;
      for(int y:graf[tren])
         Q.push({y,d+1});
   }
}
void solve1(){
   int poc=poz[1];
   Q.push({poc,0});
   BFS();
   for(int i=1;i<=N;i++)
      cout<<dist[i]<<"\n";
}
void calcdist(){
   for(int i=1;i<=N;i++){
      nexttostop[i]=false;
      for(int x:graf[i])
         nexttostop[i]|=stop[x];
   }
   for(int i=1;i<=N;i++)
      if(stop[i])
         Q.push({i,0});
   BFS();
   for(int i=1;i<=N;i++)
      d1[i]=dist[i];
   for(int i=1;i<=N;i++){
      if(d1[i]==0){
         if(nexttostop[i])
            d1[i]=1;
         else
            d1[i]=2;
      }
   }/*
   for(int i=1;i<=N;i++)
      cout<<d1[i]<<" ";
   cout<<endl;*/
   //cout<<"OVDE"<<endl;
   for(int i=1;i<=N;i++)
      d2[i]=1e18;
   for(int i=1;i<=N;i++)
      if(nexttostop[i] and stop[i])
         PQ.push({-1,i});
   pvred++;
   while(PQ.size()){
      auto aa=PQ.top();
      PQ.pop();
      int tren=aa.second;
      int d=-aa.first;
      if(prosli[tren]==pvred)
         continue;
      prosli[tren]=pvred;
      d2[tren]=d;
      for(int x:graf[tren])
         PQ.push({-(d+1-stop[tren]),x});
   }

}
void calcchange(){
   for(int i=2;i<=K;i++){
      int x=poz[i];
      for(int i=1;i<=N;i++)
         cena[i]+=min(d1[x]+2*(i-1),d2[x]+(i-1));
   }
   for(int i=N;i>=2;i--)
      cena[i]-=cena[i-1];
}
void Dijkstra(){
   pvred++;
   while(PQ.size()){
      auto aa=PQ.top();
      PQ.pop();
      int tren=aa.second;
      ll d=-aa.first;
      if(prosli[tren]==pvred)
         continue;
     // cout<<tren<<" "<<d<<endl;
      prosli[tren]=pvred;
      dist[tren]=min(dist[tren],d);
      if(stop[tren] and propval[tren]!=d)
         continue;
      for(int x:graf[tren])
         PQ.push({-(d+1),x});
   }
}
int main(){
   input();
   bool hasstop=false;
   for(int i=1;i<=N;i++)
      if(stop[i])
         hasstop=true;
   if(hasstop==false){
      solve1();
      return 0;
   }

   calcdist();
   //cout<<"AAA"<<endl;
   calcchange();
   //cout<<"BB"<<endl;

  /* cout<<"CENE"<<endl;
   for(int i=1;i<=N;i++)
      cout<<cena[i]<<" ";
   cout<<endl;
*/
   for(int i=1;i<=N;i++)
      dist[i]=res[i]=1e18;
   int poc=poz[1];
   //dist[poc]=res[poc]=0;
   for(int i=1;i<=N;i++)
      propval[i]=-1;
   propval[poc]=0;
   PQ.push({0,poc});
   Dijkstra();

  /* for(int i=1;i<=N;i++)
      cout<<dist[i]<<" ";
   cout<<endl;
*/
   for(int i=1;i<=N;i++)
      res[i]=min(dist[i],res[i]);

   for(int it=1;it<=2*N;it++){
      for(int i=1;i<=N;i++)
         propval[i]=-1;
      for(int i=1;i<=N;i++)
         if(stop[i] and dist[i]<1e17){
            ll d=dist[i]+cena[it];
            PQ.push({-d,i});
            propval[i]=d;
         }
      for(int i=1;i<=N;i++)
         dist[i]=1e18;
      Dijkstra();
      for(int i=1;i<=N;i++)
         res[i]=min(dist[i],res[i]);
   }
   for(int i=1;i<=N;i++)
      cout<<res[i]<<"\n";
   return 0;
}
/*
15 15 2
1 2
1 10
2 3
3 4
4 5
5 6
6 7
7 8
7 10
8 9
10 11
11 12
12 13
13 14
14 15
000000111100000
1 15
*/

Compilation message

Main.cpp: In function 'void input()':
Main.cpp:24:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   24 |    for(int i=0;i<stop.size();i++)
      |                ~^~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 3672 KB Output is correct
2 Correct 10 ms 4952 KB Output is correct
3 Correct 18 ms 5976 KB Output is correct
4 Correct 15 ms 5468 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2557 ms 3816 KB Output is correct
2 Execution timed out 4070 ms 5228 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1413 ms 3828 KB Output is correct
2 Execution timed out 4065 ms 5204 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1509 ms 3676 KB Output is correct
2 Correct 3041 ms 3676 KB Output is correct
3 Correct 1629 ms 3796 KB Output is correct
4 Incorrect 3638 ms 3676 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 4035 ms 5976 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 4035 ms 5976 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1509 ms 3676 KB Output is correct
2 Correct 3041 ms 3676 KB Output is correct
3 Correct 1629 ms 3796 KB Output is correct
4 Incorrect 3638 ms 3676 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 3672 KB Output is correct
2 Correct 10 ms 4952 KB Output is correct
3 Correct 18 ms 5976 KB Output is correct
4 Correct 15 ms 5468 KB Output is correct
5 Correct 2557 ms 3816 KB Output is correct
6 Execution timed out 4070 ms 5228 KB Time limit exceeded
7 Halted 0 ms 0 KB -