Submission #428459

#TimeUsernameProblemLanguageResultExecution timeMemory
428459kshitij_sodaniShortcut (IOI16_shortcut)C++14
71 / 100
2057 ms1868 KiB
#include <bits/stdc++.h> using namespace std; typedef long long llo; #define a first #define b second #define pb push_back #include "shortcut.h" llo pre[1000001]; int n; llo it[1000001]; llo ind[1000001]; llo ind2[1000001]; llo ind3[1000001]; llo ind4[1000001]; llo ss; llo ma[2][2]; bool check(llo mid){ llo ma=-1e18; llo ma2=-1e18; llo ma3=-1e18; llo ma4=-1e18; llo st=1; for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ /*if(i==1 and j==3){ cout<<pre[j]-pre[i]+it[i]+it[j]<<":"<<endl; }*/ if(pre[j]-pre[i]+it[i]+it[j]>mid){ st=0; ma=max(ma,pre[i]+pre[j]+it[i]+it[j]); ma2=max(ma2,pre[i]-pre[j]+it[i]+it[j]); ma3=max(ma3,-pre[i]-pre[j]+it[i]+it[j]); ma4=max(ma4,-pre[i]+pre[j]+it[i]+it[j]); } } } if(st==1){ return true; } //return false; ma=mid-ma-ss; ma=-ma; ma2=mid-ma2-ss; ma2=-ma2; ma3=mid-ma3-ss; ma4=mid-ma4-ss; //-pre[i]-pre[j]<=ma //pre[i]+pre[j]>=ma //pre[i]+pre[j]<=ma3 //-pre[i]+pre[j]<=ma2 //pre[i]-pre[j]>=ma2 //pre[i]-pre[j]<=ma4 /* llo ind=0; llo ind3=0; llo ind2=0; llo ind4=0;*/ if(pre[n-1]+pre[n-2]<ma){ return false; } if(ma>ma3 or ma2>ma4){ return false; } llo cur=0; for(int i=n-1;i>=0;i--){ while(cur<i){ if(pre[cur]+pre[i]<ma){ cur++; } else{ break; } } ind[i]=cur; } cur=0; for(int i=n-1;i>=0;i--){ //cur=0; while(cur<i){ if(pre[cur+1]+pre[i]<=ma3){ cur++; } else{ break; } } ind3[i]=cur; } cur=0; for(int i=0;i<n;i++){ while(cur<i){ if(pre[cur]-pre[i]<ma2){ cur++; } else{ break; } } ind2[i]=cur; } cur=0; for(int i=0;i<n;i++){ while(cur<i){ if(pre[cur+1]-pre[i]<=ma4){ cur++; } else{ break; } } ind4[i]=cur; } for(int i=1;i<n;i++){ /*while(ind<i){ if(pre[i]+pre[ind]<ma){ ind++; } else{ break; } } while(ind3<i){ if(pre[i]+pre[ind3+1]<=ma3){ ind3++; } else{ break; } }*/ /*while(ind2+1<i){ if(pre[i]-pre[ind2]>ma4){ ind2--; } } if(pre[]) */ for(int j=0;j<i;j++){ if(j>=ind[i]){//pre[i]+pre[j]>=ma){ if(j<=ind3[i]){//pre[i]+pre[j]<=ma3){ //if(j>=ind){//} and j<=ind3 and pre[ind3]+pre[i]<=ma3){ if(ind2[i]<=j){//pre[j]-pre[i]>=ma2){ if(j<=ind4[i]){//pre[j]-pre[i]<=ma4){ return true; } } //} } } } } //ma to ma3 range return false; } long long find_shortcut(int nn, std::vector<int> l, std::vector<int> d, int c) { n=nn; pre[0]=0; ss=c; for(int i=1;i<n;i++){ pre[i]=pre[i-1]+l[i-1]; } for(int i=0;i<n;i++){ it[i]=d[i]; } llo low=-1; for(int i=52;i>=0;i--){ if(check(low+(1LL<<i))==false){ low+=(1LL<<i); } } return low+1; }
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...