Submission #14916

#TimeUsernameProblemLanguageResultExecution timeMemory
14916comet막대기 (KOI13_game)C++98
100 / 100
205 ms27928 KiB
#include<iostream> #include<algorithm> #include<vector> using namespace std; typedef long long ll; ll n,L; struct line{ ll u,v; line(int uu=0,int vv=0){ u=uu,v=vv; } }UP[100010],DOWN[100010]; vector<int> up[200010],down[200010]; bool cmp(line x,line y){ return x.u!=y.u?x.u<y.u:x.v<y.v; } bool cmp2(line x,line y){ return x.v!=y.v?x.v<y.v:x.u<y.u; } int lu[200010],sz; ll d[100010][2]; ll f(int x,int k){ ll &ret=d[x][k]; if(ret)return ret; int lo=0,hi=0,mid,z; if(k==0){ //cout<<"x=("<<UP[x].u<<", "<<UP[x].v<<") k= "<<k<<endl; hi=up[UP[x].u].size(); while(lo+1<hi){ mid=(lo+hi)/2; if(DOWN[up[UP[x].u][mid]].v>UP[x].v)hi=mid; else lo=mid; } for(int i=hi;i<up[UP[x].u].size();i++){ z=up[UP[x].u][i]; ret=max(ret,f(z,1)); break; } ret+=abs(lu[UP[x].v]-lu[UP[x].u])+L; lo=0; hi=down[UP[x].v].size(); while(lo+1<hi){ mid=(lo+hi)/2; if(UP[down[UP[x].v][mid]].u>UP[x].u)hi=mid; else lo=mid; } //for(int i=0;i<down[UP[x].v].size();i++)cout<<UP[down[UP[x].v][i]].u<<","<<UP[down[UP[x].v][i]].v<<" "; //cout<<endl; if(hi<down[UP[x].v].size())ret=max(ret,f(down[UP[x].v][hi],k)); } else{ //cout<<"x=("<<DOWN[x].u<<", "<<DOWN[x].v<<") k= "<<k<<endl; hi=down[DOWN[x].v].size(); while(lo+1<hi){ mid=(lo+hi)/2; if(UP[down[DOWN[x].v][mid]].u>DOWN[x].u)hi=mid; else lo=mid; } for(int i=hi;i<down[DOWN[x].v].size();i++){ z=down[DOWN[x].v][i]; ret=max(ret,f(z,0)); } ret+=abs(lu[DOWN[x].v]-lu[DOWN[x].u])+L; lo=0; hi=up[DOWN[x].u].size(); while(lo+1<hi){ mid=(lo+hi)/2; if(DOWN[up[DOWN[x].u][mid]].v>DOWN[x].v)hi=mid; else lo=mid; } if(hi<up[DOWN[x].u].size())ret=max(ret,f(up[DOWN[x].u][hi],k)); } return ret; } int main(){ ios::sync_with_stdio(0); cin>>n>>L; ll x,y; for(int i=0;i<n;i++){ cin>>x>>y; lu[sz++]=x; lu[sz++]=y; UP[i]=line(x,y); DOWN[i]=line(x,y); } sort(lu,lu+sz); sz=unique(lu,lu+sz)-lu; for(int i=0;i<n;i++){ UP[i].u=lower_bound(lu,lu+sz,UP[i].u)-lu; UP[i].v=lower_bound(lu,lu+sz,UP[i].v)-lu; DOWN[i]=UP[i]; } sort(UP,UP+n,cmp); sort(DOWN,DOWN+n,cmp2); for(int i=0;i<n;i++){ down[UP[i].v].push_back(i); up[DOWN[i].u].push_back(i); } ll ans=0; for(int i=0;i<n;i++){ if(UP[i].u<=UP[down[UP[i].v][0]].u){ ans=max(ans,f(i,0)); } if(DOWN[i].v<=DOWN[up[DOWN[i].u][0]].v){ ans=max(ans,f(i,1)); } } cout<<ans; }
#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...