Submission #60380

#TimeUsernameProblemLanguageResultExecution timeMemory
60380spencercomptonWombats (IOI13_wombats)C++17
100 / 100
14617 ms218488 KiB
#include "wombats.h" #include <bits/stdc++.h> using namespace std; int bel[5000][200]; int rig[5000][200]; int r, c; vector<vector<int> > get1(int a){ // cout << "BEG " << endl; vector<vector<int> > ret; for(int i = 0; i<c; i++){ vector<int> now; now.resize(c); int sum = 0; for(int j = i+1; j<c; j++){ sum += rig[a][j-1]; now[j] = sum; } sum = 0; for(int j = i-1; j>=0; j--){ sum += rig[a][j]; now[j] = sum; } ret.push_back(now); } // cout << "END " << endl; return ret; } vector<int> cur; vector<vector<int> > a1; vector<vector<int> > a2; int beg; int ro; void go(int l, int r, int lo, int hi){ if(l>r){ return; } int m = (l+r)/2; int best = lo; int val = a1[beg][best] + a2[best][m] + bel[ro][best]; for(int i = lo+1; i<=hi; i++){ int here = a1[beg][i] + a2[i][m] + bel[ro][i]; if(here<val){ val = here; best = i; } } cur[m] = val; go(l,m-1,lo,best); go(m+1,r,best,hi); } vector<vector<int> > comb(vector<vector<int> > a, vector<vector<int> > b){ vector<vector<int> > ret; cur.resize(c); a1 = a; a2 = b; for(int i = 0; i<c; i++){ beg = i; go(0,c-1,0,c-1); ret.push_back(cur); } return ret; // vector<vector<int> > ret; // cur.resize(c); // a1 = a; // a2 = b; // for(int i = 0; i<c; i++){ // int prev = -1; // for(int k = 0; k<c; k++){ // int best = a1[i][0] + bel[ro][0] + a2[0][k]; // int noww = 0; // for(int j = 1; j<c; j++){ // int cv = a1[i][j] + bel[ro][j] + a2[j][k]; // if(cv<best){ // noww = j; // best = cv; // } // } // assert(noww>=prev); // prev = noww; // // cout << "@ " << best << " " << i << " " << k << endl; // cur[k] = best; // } // ret.push_back(cur); // } // return ret; } vector<vector<int> > brute(int s, int e){ int rows = e-s+1; vector<int> all[rows][c]; vector<vector<int> > bot = get1(e); for(int i = 0; i<c; i++){ all[rows-1][i] = bot[i]; } for(int i = rows-2; i>=0; i--){ for(int j = 0; j<c; j++){ for(int k = 0; k<c; k++){ all[i][j].push_back(all[i+1][j][k]+bel[s+i][j]); } } for(int j = 1; j<c; j++){ for(int k = 0; k<c; k++){ all[i][j][k] = min(all[i][j][k],all[i][j-1][k]+rig[s+i][j-1]); } } for(int j = c-2; j>=0; j--){ for(int k = 0; k<c; k++){ all[i][j][k] = min(all[i][j][k],all[i][j+1][k]+rig[s+i][j]); } } } vector<vector<int> > ret; for(int i = 0; i<c; i++){ ret.push_back(all[0][i]); } return ret; } class Node{ public: int s, e; Node *l, *r; bool leaf; vector<vector<int> > ar; Node (int a, int b){ s = a; e = b; leaf = (e-s+1) <= 16; if(s==e){ ar = get1(s); l = NULL; r = NULL; } else if(leaf){ ar = brute(s,e); l = NULL; r = NULL; } else{ l = new Node(s,(s+e)/2); r = new Node((s+e)/2+1,e); ro = l->e; ar = comb(l->ar,r->ar); } // cout << "FOR " << a << " - " << b << endl; // for(int i = 0; i<c; i++){ // for(int j = 0; j<c; j++){ // // cout << i << " to " << j << " " << ar[i][j] << endl; // } // } } void upd(int ind){ if(s==e){ ar = get1(s); return; } if(leaf){ ar = brute(s,e); return; } if(ind<=(s+e)/2){ l->upd(ind); } else{ r->upd(ind); } ro = l->e; ar = comb(l->ar,r->ar); } }; Node *t; void init(int R, int C, int H[5000][200], int V[5000][200]) { r = R; c = C; for(int i = 0; i<r; i++){ for(int j =0 ; j<c; j++){ if(i+1<r){ bel[i][j] = V[i][j]; // cout << bel[i][j] << " "; } if(j+1<c){ rig[i][j] = H[i][j]; } } // cout << endl; } t = new Node(0,r-1); } void changeH(int P, int Q, int W) { // cout << "UPDATE " << P << endl; rig[P][Q] = W; // t = new Node(0,c-1); t->upd(P); } void changeV(int P, int Q, int W) { // cout << "QED " << P << endl; bel[P][Q] = W; // t = new Node(0,c-1); t->upd(P); } int escape(int V1, int V2) { return t->ar[V1][V2]; }

Compilation message (stderr)

grader.c: In function 'int main()':
grader.c:15:6: warning: variable 'res' set but not used [-Wunused-but-set-variable]
  int res;
      ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...