Submission #563880

#TimeUsernameProblemLanguageResultExecution timeMemory
563880tqbfjotldWild Boar (JOI18_wild_boar)C++14
62 / 100
18081 ms377996 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long

const int INF = 1000000000000000000LL;
pair<int,pair<int,int> > edgel[4005];
vector<int> inedge[2005];
vector<int> outedge[2005];

int distm[4005][4005];

pair<int,int> thing1[2005][4005]; //node, edge
pair<int,int> thing2[2005][4005];

int n,m;
int T,L;

int arr[100005];

void handle(int &dist1, int &e1, int &dist2, int &e2, pair<int,int> opt){
    if (e1==opt.second){
        if (opt.first<=dist1){
            dist1 = opt.first;
        }
    }
    else if (e2==opt.second){
        if (opt.first<=dist2){
            dist2 = opt.first;
        }
    }
    else if (opt.first<=dist1){
        dist2 = dist1;
        e2 = e1;
        dist1 = opt.first;
        e1 = opt.second;
    }
    else if (opt.first<=dist2){
        dist2 = opt.first;
        e2 = opt.second;
    }
    if (dist1>dist2){
        swap(dist1,dist2);
        swap(e1,e2);
    }
}

main(){
    scanf("%lld%lld",&n,&m);
    scanf("%lld%lld",&T,&L);
    for (int x = 0; x<m; x++){
        int a,b,c;
        scanf("%lld%lld%lld",&a,&b,&c);
        edgel[2*x] = {c,{a,b}};
        edgel[2*x+1] = {c,{b,a}};
        inedge[a].push_back(2*x+1);
        outedge[a].push_back(2*x);
        inedge[b].push_back(2*x);
        outedge[b].push_back(2*x+1);
    }
    priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > pq;
    for (int x = 0; x<2*m; x++){
        for (int y = 0; y<2*m; y++){
            distm[x][y] = INF;
        }
        distm[x][x] = 0;
        pq.push({0,x});
        while (!pq.empty()){
            int u = pq.top().second;
            int d = pq.top().first;
            pq.pop();
            if (d>distm[x][u]) continue;
            for (auto y : outedge[edgel[u].second.second]){
                if ((y^1)==u) continue;
                if (d+edgel[y].first<distm[x][y]){
                    distm[x][y] = d+edgel[y].first;
                    pq.push({distm[x][y],y});
                }
            }
        }
    }
    for (int x = 0; x<=2*m; x++){
        for (int y = 1; y<=m; y++){
            thing1[y][x] = {INF,-1};
            thing2[y][x] = {INF,-1};
        }
    }

    for (int x = 0; x<2*m; x++){
        for (int y = 0; y<2*m; y++){
            if (distm[x][y]<INF){
                pair<int,int> nw = {distm[x][y],y};
                if (nw<=thing1[edgel[y].second.second][x]){
                    thing2[edgel[y].second.second][x] = thing1[edgel[y].second.second][x];
                    thing1[edgel[y].second.second][x] = nw;
                }
                else if (nw<=thing2[edgel[y].second.second][x]){
                    thing2[edgel[y].second.second][x] = nw;
                }
            }
        }
    }


    for (int x = 0; x<L; x++){
        scanf("%lld",&arr[x+1]);
    }
    for (int i = 0; i<T; i++){
        int a,b;
        scanf("%lld%lld",&a,&b);
        arr[a] = b;
        int dist1 = INF;
        int e1 = -1;
        int dist2 = INF;
        int e2 = -1;
        for (auto x : outedge[arr[1]]){
            auto t1 = thing1[arr[2]][x];
            t1.first += edgel[x].first;
            if (e1==t1.second){
                if (t1.first<=dist1){
                    dist1 = t1.first;
                }
            }
            else if (e2==t1.second){
                if (t1.first<=dist2){
                    dist2 = t1.first;
                }
            }
            else if (t1.first<=dist1){
                dist2 = dist1;
                e2 = e1;
                dist1 = t1.first;
                e1 = t1.second;
            }
            else if (t1.first<=dist2){
                dist2 = t1.first;
                e2 = t1.second;
            }
            if (dist1>dist2){
                swap(dist1,dist2);
                swap(e1,e2);
            }

            auto t2 = thing2[arr[2]][x];
            t2.first += edgel[x].first;
            if (e1==t2.second){
                if (t2.first<=dist1){
                    dist1 = t2.first;
                }
            }
            else if (e2==t2.second){
                if (t2.first<=dist2){
                    dist2 = t2.first;
                }
            }
            else if (t2.first<=dist1){
                dist2 = dist1;
                e2 = e1;
                dist1 = t2.first;
                e1 = t2.second;
            }
            else if (t2.first<=dist2){
                dist2 = t2.first;
                e2 = t2.second;
            }
            if (dist1>dist2){
                swap(dist1,dist2);
                swap(e1,e2);
            }
        }
        if (dist1==INF){
            printf("-1\n");
            continue;
        }
        for (int x = 3; x<=L; x++){
            //printf("vals are %lld %lld %lld %lld\n",dist1,e1,dist2,e2);

            int ndist1 = INF;
            int ne1 = -1;
            int ndist2 = INF;
            int ne2 = -1;
            auto t1 = thing1[arr[x]][e1];
            t1.first += dist1;
            handle(ndist1,ne1,ndist2,ne2,t1);
            auto t2 = thing2[arr[x]][e1];
            t2.first += dist1;
            handle(ndist1,ne1,ndist2,ne2,t2);
            auto t3 = thing1[arr[x]][e2];
            t3.first += dist2;
            handle(ndist1,ne1,ndist2,ne2,t3);
            auto t4 = thing2[arr[x]][e2];
            t4.first += dist2;
            handle(ndist1,ne1,ndist2,ne2,t4);

            dist1 = ndist1;
            dist2 = ndist2;
            e1 = ne1;
            e2 = ne2;

            if (dist1==INF){
                printf("-1\n");
                break;
            }
        }
        if (dist1==INF) continue;
        printf("%lld\n",dist1);
    }
}

Compilation message (stderr)

wild_boar.cpp:47:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   47 | main(){
      | ^~~~
wild_boar.cpp: In function 'int main()':
wild_boar.cpp:48:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   48 |     scanf("%lld%lld",&n,&m);
      |     ~~~~~^~~~~~~~~~~~~~~~~~
wild_boar.cpp:49:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   49 |     scanf("%lld%lld",&T,&L);
      |     ~~~~~^~~~~~~~~~~~~~~~~~
wild_boar.cpp:52:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   52 |         scanf("%lld%lld%lld",&a,&b,&c);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
wild_boar.cpp:105:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  105 |         scanf("%lld",&arr[x+1]);
      |         ~~~~~^~~~~~~~~~~~~~~~~~
wild_boar.cpp:109:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  109 |         scanf("%lld%lld",&a,&b);
      |         ~~~~~^~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...