Submission #593949

#TimeUsernameProblemLanguageResultExecution timeMemory
593949jeroenodbWombats (IOI13_wombats)C++14
76 / 100
20073 ms27652 KiB
#pragma GCC optimize("O3") #include "bits/stdc++.h" using namespace std; #define all(x) begin(x),end(x) template<typename A, typename B> ostream& operator<<(ostream &os, const pair<A, B> &p) { return os << '(' << p.first << ", " << p.second << ')'; } template<typename T_container, typename T = typename enable_if<!is_same<T_container, string>::value, typename T_container::value_type>::type> ostream& operator<<(ostream &os, const T_container &v) { string sep; for (const T &x : v) os << sep << x, sep = " "; return os; } #define debug(a) cerr << "(" << #a << ": " << a << ")\n"; typedef long long ll; typedef vector<int> vi; typedef vector<vi> vvi; typedef pair<int,int> pi; #include "wombats.h" void cmin(int& a, int b) {a=min(a,b);} const int N = 200, K = 200, oo = 1e9; static int HH[5000][N], VV[5000][N],R,C; typedef array<array<int,N>,N> node; const node identity() { node res = {}; for(int i=0;i<N;++i) { for(int j=0;j<N;++j) res[i][j]=oo; res[i][i]=0; } return res; } node res; void merge(const node& n1, const node& n2, int l, int r, int a, int b, int c, int d) { if(c==d or l==r) return; if(r-l<3 or d-c<3) { for(int i=l;i<r;++i) { for(int j=a;j<b;++j) { for(int k=c;k<d;++k) { cmin(res[i][k],n1[i][j]+n2[j][k]); } } } return; } int m1 = (l+r)/2, m2 = (c+d)/2; pi opt = {n1[m1][a]+n2[a][m2],a}; for(int j = a+1;j<b;++j) { opt = min(opt, {n1[m1][j]+n2[j][m2],j}); } int pos = opt.second; merge(n1,n2,l,m1,a,pos+1,c,m2); merge(n1,n2,m1,r,pos,b,m2,d); merge(n1,n2,l,m1,a,b,m2,d); merge(n1,n2,m1,r,a,b,c,m2); } struct segtree { vector<node> nds; int ptwo; segtree(){} segtree(int n) { ptwo=1; while(ptwo<n) ptwo*=2; nds.assign(ptwo*2,identity()); } node& operator[](int i) { return nds[i+ptwo]; } void update(int b) { for(b = (b+ptwo)/2;b>=1;b/=2) { for(int i=0;i<N;++i) fill(all(res[i]),oo); merge(nds[b*2],nds[b*2+1],0,C,0,C,0,C); nds[b]=res; } } int query(int A, int B) { return nds[1][A][B]; } } seg; void recalculate(int b) { // recalculates a block int l = b*K, r = min(R,(b+1)*K); int ans[N] = {}; for(int s=0;s<C;++s) { fill(ans,ans+N,oo); ans[s] = 0; for(int i=l;i<r;++i) { for(int j=0;j<C-1;++j) { cmin(ans[j+1],ans[j]+HH[i][j]); } for(int j=C-1;j>=1;--j) { cmin(ans[j-1],ans[j]+HH[i][j-1]); } if(i!=R-1) for(int j=0;j<C;++j) ans[j]+=VV[i][j]; } copy(ans,ans+N,seg[b][s].begin()); } seg.update(b); } 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) { copy(H[i],H[i]+C,HH[i]); copy(V[i],V[i]+C,VV[i]); } int SEGSIZE = (R+K-1)/K; seg = segtree(SEGSIZE); for(int i=0;i*K<R;++i) recalculate(i); } void changeH(int P, int Q, int W) { HH[P][Q]=W; int B = P/K; recalculate(B); } void changeV(int P, int Q, int W) { VV[P][Q]=W; int B = P/K; recalculate(B); } int escape(int V1, int V2) { return seg.query(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]
   15 |  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...