Submission #233006

#TimeUsernameProblemLanguageResultExecution timeMemory
233006thebesAbduction 2 (JOI17_abduction2)C++14
100 / 100
1899 ms128644 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<int,int> pii; typedef pair<double,double> pdd; typedef vector<int> vi; #define F first #define S second #define pb push_back #define mt make_tuple const int MN = 1e5+5; int N, M, Q, i, j, x, y, dx[]={0,0,1,-1}, dy[]={1,-1,0,0}; map<tuple<int,int,int>,ll> dp; vi a, b; struct MaxSegmentTree{ int st[2*MN], n; void build(int i,int s,int e,vi &vec){ if(s!=e){ build(2*i,s,(s+e)/2,vec); build(2*i+1,(s+e)/2+1,e,vec); st[i]=max(st[2*i],st[2*i+1]); } else st[i]=vec[s]; } void init(vi vec){ n = (int)vec.size(); build(1,0,n-1,vec); } int lquery(int i,int s,int e,int ss,int se,int val){ if(ss>se) return -1; if(s>=ss&&e<=se){ if(st[i]<=val) return -1; else if(s==e) return e; } else if((s+e)/2<ss) return lquery(2*i+1,(s+e)/2+1,e,ss,se,val); else if((s+e)/2>=se) return lquery(2*i,s,(s+e)/2,ss,se,val); int r = lquery(2*i+1,(s+e)/2+1,e,ss,se,val); return r==-1?lquery(2*i,s,(s+e)/2,ss,se,val):r; } int lquery(int idx,int val){ return lquery(1,0,n-1,0,idx-1,val); } int rquery(int i,int s,int e,int ss,int se,int val){ if(ss>se) return -1; if(s>=ss&&e<=se){ if(st[i]<=val) return -1; else if(s==e) return s; } else if((s+e)/2<ss) return rquery(2*i+1,(s+e)/2+1,e,ss,se,val); else if((s+e)/2>=se) return rquery(2*i,s,(s+e)/2,ss,se,val); int r = rquery(2*i,s,(s+e)/2,ss,se,val); return r==-1?rquery(2*i+1,(s+e)/2+1,e,ss,se,val):r; } int rquery(int idx,int val){ return rquery(1,0,n-1,idx+1,n,val); } }R,C; ll solve(int x,int y,int d){ if(dp.count(mt(x,y,d))) return dp[mt(x,y,d)]; ll ans = 0; if(a[x]>b[y]){ if(d!=0){ int nxt = C.lquery(y,a[x]); if(~nxt) ans=max(ans,(ll)y-nxt+(ll)solve(x,nxt,1)); else ans=max(ans,(ll)y); } if(d!=1){ int nxt = C.rquery(y,a[x]); if(~nxt) ans=max(ans,(ll)nxt-y+(ll)solve(x,nxt,0)); else ans=max(ans,(ll)M-1-y); } } else{ if(d!=2){ int nxt = R.lquery(x,b[y]); if(~nxt) ans=max(ans,(ll)x-nxt+(ll)solve(nxt,y,3)); else ans=max(ans,(ll)x); } if(d!=3){ int nxt = R.rquery(x,b[y]); if(~nxt) ans=max(ans,(ll)nxt-x+(ll)solve(nxt,y,2)); else ans=max(ans,(ll)N-1-x); } } return dp[mt(x,y,d)]=ans; } int main(){ scanf("%d%d%d",&N,&M,&Q); for(i=1;i<=N;i++){ scanf("%d",&x); a.pb(x); } for(i=1;i<=M;i++){ scanf("%d",&x); b.pb(x); } R.init(a), C.init(b); for(;Q;Q--){ scanf("%d%d",&x,&y); ll sna = 0; for(i=0;i<4;i++){ int nx=x+dx[i], ny=y+dy[i]; if(nx<1||nx>N||ny<1||ny>M) continue; sna=max(sna,(ll)solve(nx-1,ny-1,i)+1); } printf("%lld\n",sna); } return 0; }

Compilation message (stderr)

abduction2.cpp: In function 'int main()':
abduction2.cpp:92:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d%d",&N,&M,&Q);
     ~~~~~^~~~~~~~~~~~~~~~~~~
abduction2.cpp:94:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d",&x);
         ~~~~~^~~~~~~~~
abduction2.cpp:98:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d",&x);
         ~~~~~^~~~~~~~~
abduction2.cpp:103:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d",&x,&y);
         ~~~~~^~~~~~~~~~~~~~
#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...