Submission #132265

#TimeUsernameProblemLanguageResultExecution timeMemory
132265gs14004Wild Boar (JOI18_wild_boar)C++17
62 / 100
18124 ms537464 KiB
#include <bits/stdc++.h> using namespace std; const int MAXN = 2005; const int MAXL = 100005; using lint = long long; using pi = pair<lint, int>; struct edg{ int pos, idx, cost; }; int n, m, q, l; vector<edg> gph[MAXN]; lint dist[MAXN * 2][MAXN * 2]; struct path_info{ int midl, midr; lint cost; bool operator<(const path_info &p)const{ return cost < p.cost; } }; vector<path_info> plist[MAXN][MAXN]; int ed[MAXN * 2], cost[MAXN * 2]; void preprocess(){ for(int i=0; i<m; i++){ int s, e, x; scanf("%d %d %d",&s,&e,&x); ed[2 * i] = e; ed[2 * i + 1] = s; cost[2 * i] = cost[2 * i + 1] = x; gph[s].push_back({e, i*2, x}); gph[e].push_back({s, i*2+1, x}); } memset(dist, 0x3f, sizeof(dist)); for(int i=0; i<2*m; i++){ dist[i][i] = cost[i]; priority_queue<pi, vector<pi>, greater<pi> > pq; pq.emplace(cost[i], i); int vis[MAXN] = {}; while(!pq.empty()){ auto x = pq.top(); pq.pop(); if(dist[i][x.second] != x.first) continue; vis[ed[x.second]]++; if(vis[ed[x.second]] > 2) continue; for(auto &j : gph[ed[x.second]]){ if((j.idx ^ x.second) == 1) continue; if(dist[i][j.idx] > x.first + j.cost){ dist[i][j.idx] = x.first + j.cost; pq.emplace(dist[i][j.idx], j.idx); } } } } for(int i=1; i<=n; i++){ for(int j=1; j<=n; j++){ if(i != j){ vector<path_info> pth; for(auto &k : gph[i]){ for(auto &l : gph[j]){ lint cost = dist[k.idx][l.idx ^ 1]; pth.push_back({k.pos, l.pos, cost}); } } sort(pth.begin(), pth.end()); if(pth.size() <= 2){ plist[i][j] = pth; continue; } plist[i][j].push_back(pth[0]); plist[i][j].push_back(pth[1]); if(pth[0].midl != pth[1].midl && pth[0].midr != pth[1].midr){ plist[i][j].push_back(pth[2]); pi nxt_punkty = pi(-1, -1); if(pth[2].midl == pth[1].midl){ nxt_punkty = pi(pth[2].midl, pth[0].midr); } else if(pth[2].midl == pth[0].midl){ nxt_punkty = pi(pth[2].midl, pth[1].midr); } else if(pth[2].midr == pth[1].midr){ nxt_punkty = pi(pth[0].midl, pth[2].midr); } else if(pth[2].midr == pth[0].midr){ nxt_punkty = pi(pth[1].midl, pth[2].midr); } for(int k = 3; k < pth.size(); k++){ if(nxt_punkty.first != pth[k].midl && nxt_punkty.second != pth[k].midr){ plist[i][j].push_back(pth[k]); break; } } } else if(pth[0].midl == pth[1].midl){ for(int x = 0; x < pth.size(); x++){ if(pth[x].midl != pth[0].midl){ plist[i][j].push_back(pth[x]); pi nxt_punkty = pi(pth[0].midl, pth[x].midr); for(int k = x + 1; k < pth.size(); k++){ if(nxt_punkty.first != pth[k].midl && nxt_punkty.second != pth[k].midr){ plist[i][j].push_back(pth[k]); break; } } break; } } } else if(pth[0].midr == pth[1].midr){ for(int x = 0; x < pth.size(); x++){ if(pth[x].midr != pth[0].midr){ plist[i][j].push_back(pth[x]); pi nxt_punkty = pi(pth[x].midl, pth[0].midr); for(int k = x + 1; k < pth.size(); k++){ if(nxt_punkty.first != pth[k].midl && nxt_punkty.second != pth[k].midr){ plist[i][j].push_back(pth[k]); break; } } break; } } } else assert(0); // for(auto &k : plist[i][j]) printf("(%d -> %d), (%d -> %d), %lld\n", i, k.midl, k.midr, j, k.cost); } } } } int a[MAXL]; lint dp[MAXL][4]; int main(){ scanf("%d %d %d %d",&n,&m,&q,&l); preprocess(); for(int i=0; i<l; i++) scanf("%d",&a[i]); for(int i=0; i<q; i++){ int x, v; scanf("%d %d",&x,&v); x--; a[x] = v; memset(dp, 0x3f, sizeof(dp)); for(int k=0; k<plist[a[0]][a[1]].size(); k++){ dp[1][k] = plist[a[0]][a[1]][k].cost; } for(int k=2; k<l; k++){ for(int x = 0; x < plist[a[k - 2]][a[k - 1]].size(); x++){ for(int y = 0; y < plist[a[k - 1]][a[k]].size(); y++){ if(plist[a[k - 2]][a[k - 1]][x].midr != plist[a[k - 1]][a[k]][y].midl){ dp[k][y] = min(dp[k][y], dp[k - 1][x] + plist[a[k - 1]][a[k]][y].cost); } } } } int w = plist[a[l - 2]][a[l - 1]].size(); lint dap = *min_element(dp[l - 1], dp[l - 1] + w); if(dap > 9e17) dap = -1; printf("%lld\n", dap); } }

Compilation message (stderr)

wild_boar.cpp: In function 'void preprocess()':
wild_boar.cpp:87:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
      for(int k = 3; k < pth.size(); k++){
                     ~~^~~~~~~~~~~~
wild_boar.cpp:95:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
      for(int x = 0; x < pth.size(); x++){
                     ~~^~~~~~~~~~~~
wild_boar.cpp:99:29: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
        for(int k = x + 1; k < pth.size(); k++){
                           ~~^~~~~~~~~~~~
wild_boar.cpp:110:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
      for(int x = 0; x < pth.size(); x++){
                     ~~^~~~~~~~~~~~
wild_boar.cpp:114:29: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
        for(int k = x + 1; k < pth.size(); k++){
                           ~~^~~~~~~~~~~~
wild_boar.cpp: In function 'int main()':
wild_boar.cpp:143:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int k=0; k<plist[a[0]][a[1]].size(); k++){
                ~^~~~~~~~~~~~~~~~~~~~~~~~~
wild_boar.cpp:147:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for(int x = 0; x < plist[a[k - 2]][a[k - 1]].size(); x++){
                   ~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
wild_boar.cpp:148:22: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int y = 0; y < plist[a[k - 1]][a[k]].size(); y++){
                    ~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
wild_boar.cpp: In function 'void preprocess()':
wild_boar.cpp:29:21: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   int s, e, x; scanf("%d %d %d",&s,&e,&x);
                ~~~~~^~~~~~~~~~~~~~~~~~~~~
wild_boar.cpp: In function 'int main()':
wild_boar.cpp:135:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d %d %d",&n,&m,&q,&l);
  ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~
wild_boar.cpp:137:30: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  for(int i=0; i<l; i++) scanf("%d",&a[i]);
                         ~~~~~^~~~~~~~~~~~
wild_boar.cpp:139:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   int x, v; scanf("%d %d",&x,&v);
             ~~~~~^~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...