제출 #428512

#제출 시각아이디문제언어결과실행 시간메모리
428512kshitij_sodaniShortcut (IOI16_shortcut)C++14
71 / 100
2093 ms11300 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 ind5[1000001]; llo tree[4*1000001][4]; llo ss; llo ma[2][2]; vector<pair<llo,llo>> tt; void update(int no,int l,int r,int i,int val,int ee){ if(l==r){ tree[no][ee]=val; } else{ int mid=(l+r)/2; if(i<=mid){ update(no*2+1,l,mid,i,val,ee); } else{ update(no*2+2,mid+1,r,i,val,ee); } tree[no][ee]=max(tree[no*2+1][ee],tree[no*2+2][ee]); } } llo query(int no,int l,int r,int aa,int bb,int ee){ if(r<aa or l>bb){ return -(llo)1e18; } if(aa<=l and r<=bb){ return tree[no][ee]; } int mid=(l+r)/2; return max(query(no*2+1,l,mid,aa,bb,ee),query(no*2+2,mid+1,r,aa,bb,ee)); } bool check(llo mid){ llo ma=-1e18; llo ma2=-1e18; llo ma3=-1e18; llo ma4=-1e18; //llo st=1; for(int i=0;i<4*n;i++){ for(int j=0;j<2;j++){ tree[i][j]=-1e18; } } for(int j=0;j<n;j++){ llo xx=-1; for(int k=19;k>=0;k--){ if(xx+(1<<k)<n){ if(tt[xx+(1<<k)].a+pre[j]+it[j]>mid){ xx+=(1<<k); } } } if(xx>=0){ llo yy=query(0,0,n-1,0,xx,0); llo zz=query(0,0,n-1,0,xx,1); ma=max(ma,yy+pre[j]+it[j]); ma2=max(ma2,yy-pre[j]+it[j]); ma3=max(ma3,zz-pre[j]+it[j]); ma4=max(ma4,zz+pre[j]+it[j]); //st=0; } update(0,0,n-1,ind5[j],pre[j]+it[j],0); update(0,0,n-1,ind5[j],-pre[j]+it[j],1); } for(int i=0;i<n;i++){ for(int j=i+1;j<n;j++){ 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(llo i=1;i<n;i++){ if(max(ind[i],ind2[i])<=min(i-1,min(ind3[i],ind4[i]))){ 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]; } for(int i=0;i<n;i++){ tt.pb({-pre[i]+it[i],i}); } sort(tt.begin(),tt.end()); reverse(tt.begin(),tt.end()); for(int i=0;i<n;i++){ ind5[tt[i].b]=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...