Submission #14736

#TimeUsernameProblemLanguageResultExecution timeMemory
14736gs13068Palembang Bridges (APIO15_bridge)C++98
63 / 100
2000 ms20220 KiB
#include<cstdio> #include<algorithm> int p[111111]; int s[111111]; int q[111111]; int t[111111]; char pp[11],qq[11]; int x[222222]; std::pair<int,int> d[111111]; int dn; long long L[111111]; long long R[111111]; struct tree { int l; int r; int s; int e; int t; long long x; } T[444444]; int Tn; int stat=-1; long long now; int n; void init(int i,int s,int e) { T[i].s = s; T[i].e = e; if(e-s>1) { T[i].l=Tn++; T[i].r=Tn++; init(T[i].l,s,(s+e)/2); init(T[i].r,(s+e)/2,e); } } void add(int i,int s,int e,int t) { if(s<T[i].s)s=T[i].s; if(e>T[i].e)e=T[i].e; if(s>=e)return; if(t>0)T[i].x+=x[e]-x[s]; else T[i].x-=x[e]-x[s]; if(s==T[i].s&&e==T[i].e) { T[i].t+=t; return; } add(T[i].l,s,e,t); add(T[i].r,s,e,t); } long long get(int i,int s,int e) { if(s<T[i].s)s=T[i].s; if(e>T[i].e)e=T[i].e; if(s>=e)return 0LL; if(s==T[i].s&&e==T[i].e)return T[i].x; return 1LL*(x[e]-x[s])*T[i].t+get(T[i].l,s,e)+get(T[i].r,s,e); } int get_t(int i,int t) { if(t<T[i].s||t>=T[i].e)return 0; if(t==T[i].s&&t+1==T[i].e)return T[i].t; return T[i].t+get_t(T[i].l,t)+get_t(T[i].r,t); } void calcL(int ss,int ee,int l,int r) { if(ss>=ee)return; long long tt; int i,j,m=(ss+ee)/2; int ll,rr; while(stat<m) { ++stat; j=d[stat].second; now+=x[std::min(s[j],t[j])]-x[0]; add(0,0,std::min(s[j],t[j]),-1); add(0,std::max(s[j],t[j]),n+n-1,1); } while(stat>m) { j=d[stat].second; now-=x[std::min(s[j],t[j])]-x[0]; add(0,0,std::min(s[j],t[j]),1); add(0,std::max(s[j],t[j]),n+n-1,-1); stat--; } ll=rr=l; tt=L[m]=now+get(0,0,l); for(i=l+1;i<r;i++) { tt+=1LL*(x[i]-x[i-1])*get_t(0,i-1); if(L[m]>tt) { L[m]=tt; ll=rr=i; } if(L[m]==tt)rr=i; } i=std::upper_bound(x,x+n+n-1,(x[ll]+x[rr]+1)/2)-x; calcL(ss,m,l,i); calcL(m+1,ee,i-1,r); } void calcR(int ss,int ee,int l,int r) { if(ss>=ee)return; long long tt; int i,j,m=(ss+ee)/2; int ll,rr; while(stat>m) { --stat; j=d[stat].second; now+=x[std::min(s[j],t[j])]-x[0]; add(0,0,std::min(s[j],t[j]),-1); add(0,std::max(s[j],t[j]),n+n-1,1); } while(stat<m) { j=d[stat].second; now-=x[std::min(s[j],t[j])]-x[0]; add(0,0,std::min(s[j],t[j]),1); add(0,std::max(s[j],t[j]),n+n-1,-1); stat++; } ll=rr=l; tt=R[m]=now+get(0,0,l); for(i=l+1;i<r;i++) { tt+=1LL*(x[i]-x[i-1])*get_t(0,i-1); if(R[m]>tt) { R[m]=tt; ll=rr=i; } if(R[m]==tt)rr=i; } i=std::upper_bound(x,x+n+n-1,(x[ll]+x[rr]+1)/2)-x; calcR(ss,m,l,i); calcR(m+1,ee,i-1,r); } int main() { //freopen("input","r",stdin); //freopen("output","w",stdout); long long res=0; int i,j,m,ss,ee,l,r; int fir,sec; long long min; scanf("%d%d",&m,&n); if(m==1) { j=0; for(i=0;i<n;i++) { scanf("%s%d%s%d",pp,&s[i],qq,&t[i]); p[i]=pp[0]-'A'; q[i]=qq[0]-'A'; if(p[i]!=q[i]) { j++; d[dn++]=std::make_pair(std::min(s[i],t[i]),-1); d[dn++]=std::make_pair(std::max(s[i],t[i]),-1); } } std::sort(d,d+dn); for(i=0;i<dn;i++) { j+=d[i].second; if(j<=0)break; } for(j=0;j<n;j++) { if(p[j]!=q[j])res+=std::abs(s[j]-d[i].first)+std::abs(t[j]-d[i].first)+1; else res+=std::abs(s[j]-t[j]); } printf("%lld\n",res); return 0; } for(i=0;i<n;i++) { scanf("%s%d%s%d",pp,&s[i],qq,&t[i]); p[i]=pp[0]-'A'; q[i]=qq[0]-'A'; //s[i]=2*i; //t[i]=2*i+1; x[i]=s[i]; x[i+n]=t[i]; } for(i=0;i<n;i++)if(p[i]!=q[i])d[dn++]=std::make_pair(s[i]+t[i],i); std::sort(x,x+n+n); for(i=0;i<n;i++) { s[i]=std::lower_bound(x,x+n+n,s[i])-x; t[i]=std::lower_bound(x,x+n+n,t[i])-x; } if(dn) { std::sort(d,d+dn); Tn=1; init(0,0,n+n-1); calcL(0,dn,0,n+n-1); for(i=0;i<Tn;i++)T[i].x=T[i].t=0; now=0; stat=dn; calcR(0,dn,0,n+n-1); res=std::min(L[dn-1],R[0]); for(i=1;i<dn;i++)res=std::min(res,L[i-1]+R[i]); } else res=0; res*=2; for(i=0;i<n;i++) { res+=std::abs(x[s[i]]-x[t[i]]); res+=p[i]!=q[i]; } printf("%lld\n",res); }

Compilation message (stderr)

bridge.cpp: In function 'int main()':
bridge.cpp:165:12: warning: unused variable 'ss' [-Wunused-variable]
  int i,j,m,ss,ee,l,r;
            ^
bridge.cpp:165:15: warning: unused variable 'ee' [-Wunused-variable]
  int i,j,m,ss,ee,l,r;
               ^
bridge.cpp:165:18: warning: unused variable 'l' [-Wunused-variable]
  int i,j,m,ss,ee,l,r;
                  ^
bridge.cpp:165:20: warning: unused variable 'r' [-Wunused-variable]
  int i,j,m,ss,ee,l,r;
                    ^
bridge.cpp:166:6: warning: unused variable 'fir' [-Wunused-variable]
  int fir,sec;
      ^
bridge.cpp:166:10: warning: unused variable 'sec' [-Wunused-variable]
  int fir,sec;
          ^
bridge.cpp:167:12: warning: unused variable 'min' [-Wunused-variable]
  long long min;
            ^
bridge.cpp:168:21: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d%d",&m,&n);
                     ^
bridge.cpp:174:39: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
    scanf("%s%d%s%d",pp,&s[i],qq,&t[i]);
                                       ^
bridge.cpp:201:38: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%s%d%s%d",pp,&s[i],qq,&t[i]);
                                      ^
#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...