| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
居然1Y了,必须ORZ一下,再附上代码Source Code
Problem: 3722 User: Los_Angelos_Laycurse
Memory: 1136K Time: 344MS
Language: C++ Result: Accepted
Source Code
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<stdio.h>
#include<cmath>
#include<map>
using namespace std;
struct soldier
{
double x;
int d;
bool operator <(const soldier &temp)const
{
if(x==temp.x)
return d<temp.d;
return x<temp.x;
}
};
soldier a[111],na[111];
struct point
{
double f,t;
};
point list[10000000];
int cnt,n,id;
double l,r,t,now,ax,temp,ans,nt,lt,k1,b1,k2,b2,value;
int main()
{
int i,j,s,p,q,id1,id2;
scanf("%lf%lf%d%lf",&l,&r,&n,&t);
for(i=0;i<n;i++)
{
scanf("%lf%d",&a[i].x,&a[i].d);
if(a[i].x==0)
a[i].d=1;
else if(a[i].x==l)
a[i].d=-1;
}
if(n==0)
printf("%.3lf\n",l*t);
else
{
sort(a,a+n);
cnt=1;
for(i=1;i<n;i++)
{
if((a[i].x!=a[cnt-1].x)||(a[i].d!=a[cnt-1].d))
a[cnt++]=a[i];
}
n=cnt;
now=cnt=0;
while(true)
{
value=0;
ax=min(l,a[0].x+r);
id=0;
for(i=1;i<n;i++)
{
if(max(0.0,a[i].x-r)>ax)
{
value+=ax-max(0.0,a[id].x-r);
id=i;
}
if(min(l,a[i].x+r)>ax)
ax=min(l,a[i].x+r);
}
value+=ax-max(0.0,a[id].x-r);
list[cnt].t=now;
list[cnt++].f=l-value;
if(now>=2*l)
break;
value=2*l-now;
for(i=0;i<n-1;i++)
{
if(a[i].d==1&&a[i+1].d==-1)
{
if(a[i+1].x-a[i].x<=2*r)
{
if(value>(a[i+1].x-a[i].x)/2.00)
value=(a[i+1].x-a[i].x)/2.00;
}
else
{
if(value>(a[i+1].x-a[i].x-2*r)/2.00)
value=(a[i+1].x-a[i].x-2*r)/2.00;
}
}
else if(a[i].d==-1&&a[i+1].d==1)
{
if(a[i+1].x-a[i].x<2*r)
{
if(value>(2*r-(a[i+1].x-a[i].x))/2.00)
value=(2*r-(a[i+1].x-a[i].x))/2.00;
}
}
}
if(a[0].d==-1)
{
if(a[0].x>r)
{
if(value>a[0].x-r)
value=a[0].x-r;
}
else
{
if(value>a[0].x)
value=a[0].x;
}
}
else
{
if(a[0].x<r)
{
if(value>r-a[0].x)
value=r-a[0].x;
}
}
if(a[n-1].d==1)
{
if(l-a[n-1].x>r)
{
if(value>l-a[n-1].x-r)
value=l-a[n-1].x-r;
}
else
{
if(value>l-a[n-1].x)
value=l-a[n-1].x;
}
}
else
{
if(l-a[n-1].x<r)
{
if(value>r-(l-a[n-1].x))
value=r-(l-a[n-1].x);
}
}
while(value<=0)
puts("orz");
for(i=0;i<n;i++)
{
if(a[i].d==1)
{
a[i].x+=value;
if(a[i].x==l)
a[i].d=-1;
}
else
{
a[i].x-=value;
if(a[i].x==0)
a[i].d=1;
}
}
sort(a,a+n);
now+=value;
}
// for(i=0;i<cnt;i++)
// printf("%f %f\n",list[i].t,list[i].f);
cnt--;
int ncnt=cnt;
for(i=0;list[i].t<=t||i<cnt;i++)
{
list[ncnt].t=list[i].t+2*l;
list[ncnt++].f=list[i].f;
}
cnt=ncnt;
/*
printf("cnt=%d\n",cnt);
for(i=0;i<cnt;i++)
printf("%f %f\n",list[i].t,list[i].f);
*/
ans=lt=0;
id1=0;
for(i=0;i<cnt;i++)
{
double k,b;
nt=min(t,list[i+1].t);
k=(list[i+1].f-list[i].f)/(list[i+1].t-list[i].t);
b=list[i].f-k*list[i].t;
ans+=0.5*k*(nt*nt-list[i].t*list[i].t)+b*(nt-list[i].t);
if(nt==t)
{
id2=i;
break;
}
}
value=ans;
while(list[id1].t<2*l)
{
double x1=lt,x2=nt,x=min(list[id1+1].t-lt,list[id2+1].t-nt),dx;
double A,B;
k1=(list[id1+1].f-list[id1].f)/(list[id1+1].t-list[id1].t);
b1=list[id1].f-k1*list[id1].t;
k2=(list[id2+1].f-list[id2].f)/(list[id2+1].t-list[id2].t);
b2=list[id2].f-k2*list[id2].t;
A=0.5*(k2-k1);
B=k2*x2+b2-k1*x1-b1;
if(ans<value+A*x*x+B*x)
ans=value+A*x*x+B*x;
if(A!=0)
{
dx=-B/(2*A);
if(dx>=0&&dx<=x)
{
if(ans<value+A*dx*dx+B*dx)
ans=value+A*dx*dx+B*dx;
}
}
value+=A*x*x+B*x;
// printf("x1=%f,x2=%f\n",x1,x2);
//printf("id1=%d,id2=%d,x=%f,value=%f\n",id1,id2,x,value);
lt+=x;
nt+=x;
if(lt>=list[id1+1].t)
id1++;
if(nt>=list[id2+1].t)
id2++;
}
printf("%.3lf\n",ans);
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator