제출 #1016273

#제출 시각아이디문제언어결과실행 시간메모리
1016273huutuan웜뱃 (IOI13_wombats)C++14
76 / 100
10396 ms141752 KiB
#include "wombats.h" #include <bits/stdc++.h> using namespace std; const int inf=1e9; struct Matrix{ int data[100][100]; Matrix (int x=0){ for (int i=0; i<100; ++i) for (int j=0; j<100; ++j) data[i][j]=x && i==j?0:inf; } auto & operator[](int x){ return data[x]; } const auto & operator[](int x) const { return data[x]; } Matrix operator*(const Matrix &a){ Matrix ans; for (int i=0; i<100; ++i){ for (int k=0; k<100; ++k){ for (int j=0; j<100; ++j){ ans[i][j]=min(ans[i][j], data[i][k]+a[k][j]); } } } return ans; } }; struct Node{ Matrix data; int tl, tr; Node (){ tl=tr=-1; } }; struct SegmentTree{ int n; vector<int> id; vector<Node> t; SegmentTree(){ t.emplace_back(); } void init(int _n){ n=_n; id.assign(n, 0); } void build(int k, int l, int r){ if (l==r){ id[l]=k; return; } int mid=(l+r)>>1; t[k].tl=t.size(); t.emplace_back(); t[k].tr=t.size(); t.emplace_back(); build(t[k].tl, l, mid); build(t[k].tr, mid+1, r); } void build2(int k, int l, int r){ if (l==r) return; int mid=(l+r)>>1; build2(t[k].tl, l, mid); build2(t[k].tr, mid+1, r); t[k].data=t[t[k].tl].data*t[t[k].tr].data; } void update(int k, int l, int r, int pos){ if (l==r) return; int mid=(l+r)>>1; if (pos<=mid) update(t[k].tl, l, mid, pos); else update(t[k].tr, mid+1, r, pos); t[k].data=t[t[k].tl].data*t[t[k].tr].data; } } st; const int SZ=8; int R, C, H[5000][200], V[5000][200]; void solve(){ } void init(int _R, int _C, int _H[5000][200], int _V[5000][200]) { R=_R, C=_C; memcpy(H, _H, sizeof H); memcpy(V, _V, sizeof V); st.init((R+SZ-1)/SZ); st.build(0, 0, st.n-1); for (int il=0, ir=SZ-1; il<R; il+=SZ, ir+=SZ){ ir=min(ir, R-1); Matrix cur(1), nxt; for (int i=il; i<=ir; ++i){ for (int j=0; j<C; ++j){ int sum=0; for (int k=j; k<C; ++k){ if (k!=j) sum+=H[i][k-1]; nxt[j][k]=sum+(i?V[i-1][j]:0); nxt[k][j]=sum+(i?V[i-1][k]:0); } } cur=cur*nxt; } st.t[st.id[il/SZ]].data=cur; } st.build2(0, 0, st.n-1); } void changeH(int P, int Q, int W) { H[P][Q]=W; int il=P/SZ*SZ, ir=min(il+SZ-1, R-1); Matrix cur(1), nxt; for (int i=il; i<=ir; ++i){ for (int j=0; j<C; ++j){ int sum=0; for (int k=j; k<C; ++k){ if (k!=j) sum+=H[i][k-1]; nxt[j][k]=sum+(i?V[i-1][j]:0); nxt[k][j]=sum+(i?V[i-1][k]:0); } } cur=cur*nxt; } st.t[st.id[il/SZ]].data=cur; st.update(0, 0, st.n-1, il/SZ); } void changeV(int P, int Q, int W) { V[P][Q]=W; int il=(P+1)/SZ*SZ, ir=min(il+SZ-1, R-1); Matrix cur(1), nxt; for (int i=il; i<=ir; ++i){ for (int j=0; j<C; ++j){ int sum=0; for (int k=j; k<C; ++k){ if (k!=j) sum+=H[i][k-1]; nxt[j][k]=sum+(i?V[i-1][j]:0); nxt[k][j]=sum+(i?V[i-1][k]:0); } } cur=cur*nxt; } st.t[st.id[il/SZ]].data=cur; st.update(0, 0, st.n-1, il/SZ); } int escape(int V1, int V2) { return st.t[0].data[V1][V2]; }

컴파일 시 표준 에러 (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...