Submission #200008

#TimeUsernameProblemLanguageResultExecution timeMemory
200008dennisstarAbduction 2 (JOI17_abduction2)C++17
100 / 100
1919 ms127992 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int INF=(1<<30); struct Seg { int ar[(1<<17)]; void upd(int i, int s, int e, int t, int v) { if (s==e) { ar[i]=v; return ; } int md=(s+e)/2; if (t<=md) upd(i*2, s, md, t, v); else upd(i*2+1, md+1, e, t, v); ar[i]=max(ar[i*2], ar[i*2+1]); } int lo(int i, int s, int e, int t, int v) { if (t<=s||ar[i]<v) return INF; if (s==e) return s; int md=(s+e)/2, ret; ret=lo(i*2+1, md+1, e, t, v); if (ret<t) return ret; return lo(i*2, s, md, t, v); } int hi(int i, int s, int e, int t, int v) { if (e<=t||ar[i]<v) return -1; if (s==e) return s; int md=(s+e)/2, ret; ret=hi(i*2, s, md, t, v); if (ret>t) return ret; return hi(i*2+1, md+1, e, t, v); } }S1, S2; ll sol1(int u, int v); ll sol2(int u, int v); int H, W, Q, A[50010], B[50010]; int main() { scanf("%d %d %d", &H, &W, &Q); for (int i=1; i<=H; i++) scanf("%d", &A[i]), S1.upd(1, 1, H, i, A[i]); for (int i=1; i<=W; i++) scanf("%d", &B[i]), S2.upd(1, 1, W, i, B[i]); while (Q--) { int u, v; scanf("%d %d", &u, &v); printf("%lld\n", max(sol1(u, v), sol2(u, v))); } return 0; } ll hsh(int x, int y) { return x*50001ll+y; } map<ll, ll> M1, M2; ll sol1(int u, int v) { if (M1[hsh(u, v)]) return M1[hsh(u, v)]; ll a1, a2; int im; im=S1.lo(1, 1, H, u, B[v]); a1=(im<u?sol2(im, v)+u-im:u-1); im=S1.hi(1, 1, H, u, B[v]); a2=(im>u?sol2(im, v)+im-u:H-u); return M1[hsh(u, v)]=max(a1, a2); } ll sol2(int u, int v) { if (M2[hsh(u, v)]) return M2[hsh(u, v)]; ll a1, a2; int im; im=S2.lo(1, 1, W, v, A[u]); a1=(im<v?sol1(u, im)+v-im:v-1); im=S2.hi(1, 1, W, v, A[u]); a2=(im>v?sol1(u, im)+im-v:W-v); return M2[hsh(u, v)]=max(a1, a2); }

Compilation message (stderr)

abduction2.cpp: In function 'int main()':
abduction2.cpp:39:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d %d", &H, &W, &Q);
  ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
abduction2.cpp:40:45: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  for (int i=1; i<=H; i++) scanf("%d", &A[i]), S1.upd(1, 1, H, i, A[i]);
                           ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
abduction2.cpp:41:45: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  for (int i=1; i<=W; i++) scanf("%d", &B[i]), S2.upd(1, 1, W, i, B[i]);
                           ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
abduction2.cpp:43:18: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   int u, v; scanf("%d %d", &u, &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...
#Verdict Execution timeMemoryGrader output
Fetching results...