| ||||||||||
| 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 | |||||||||
小人写了个o(n) 的程序,sample 过了,但是莫名的run time error...... 那位大牛能帮帮忙?不胜感谢(如果有测试数据,请发到qmczcn@sohu.com)#include <stdio.h>
#define Maxn 2000
struct node{
__int64 n,b,bn;
}m,u,d,l,r,ul,ur,dl,dr;
struct ansnode{
__int64 c,l;
}now,ans[Maxn];
__int64 ll;
__int64 t[Maxn];
__int64 c[Maxn];
long n , total;
__int64 abs( __int64 a){
if (a>0) return a;
return -a;
}
__int64 max( __int64 a, __int64 b){
if (a<b) a=b;
return a;
}
__int64 max( __int64 a, __int64 b, __int64 c, __int64 d){
if (a<b) a=b;
if (a<c) a=c;
if (a<d) a=d;
return a;
}
__int64 min( __int64 a, __int64 b, __int64 c, __int64 d, __int64 e){
if (a>b) a=b;
if (a>c) a=c;
if (a>d) a=d;
if (a>e) a=e;
return a;
}
void inp(){
long x,y;
n=0;
scanf("%ld %ld",&x,&y);
while (x!=0 || y!=0) {
n++;
t[n]=y;
c[n]=x;
scanf("%ld %ld",&x,&y);
if (n>1000) break;
}
while (x!=0 || y!=0) scanf("%ld %ld",&x,&y);
t[0]=ll;
c[0]=0;
t[n+1]=ll;
t[n+1]=0;
}
void prepare(){
__int64 s, i;
u.n=-ll+1; u.bn=1; u.b=0;
l.n=0; l.bn=ll; l.b=0;
m.n=1; m.bn=1; m.b=1;
r.n=2; r.bn=2; r.b=1;
now.c=0;
if (t[1]==1){
r.n=2;
r.bn=1;
r.b=2;
}
s=0; i=0;
while (s<=ll || i>n){
i++;
s+=t[i];
}
s-=ll;
d.n=ll+1; d.bn=t[i]-s+1; d.b=i;
if (d.n!=n+1) now.c=max(now.c,abs(c[d.b]-c[m.b]));
if (ll!=1) now.c=max(now.c,abs(c[r.b]-c[m.b]));
if (d.b!=n+1 && ll!=1)
if (d.bn==t[d.b]) now.c=max(now.c,abs(c[d.b+1]-c[m.b]));
now.l=1;
c[n+1]=-100000000;
t[n+1]=ll;
}
void promote(node &k, __int64 l){
k.bn+=l;
k.n+=l;
if (k.bn>t[k.b]){
k.b++;
k.bn=1;
}
}
__int64 calc(){
if (m.b==n+1) return -1;
__int64 max1;
max1=0;
if (u.b!=0) max1=max(max1,abs(c[u.b]-c[m.b]));
if (l.n%ll!=0) max1=max(max1,abs(c[l.b]-c[m.b]));
if (r.n%ll!=1) max1=max(max1,abs(c[r.b]-c[m.b]));
if (d.b!=n+1) max1=max(max1,abs(c[d.b]-c[m.b]));
if (m.n>ll){
if (u.bn==1 && m.n%ll!=1) max1=max(max1,abs(c[u.b-1]-c[m.b]));
if (u.b!=n && u.bn==t[u.b] && m.n%ll!=0) max1=max(max1,abs(c[u.b+1]-c[m.b]));
}
if (d.b!=n+1){
if (d.bn==1 && m.n%ll!=1) max1=max(max1,abs(c[d.b-1]-c[m.b]));
if (d.b!=n && d.bn==t[d.b] && m.n%ll!=0) max1=max(max1,abs(c[d.b+1]-c[m.b]));
}
return max1;
}
void add( __int64 del , __int64 col){
if (col==now.c){
now.l+=del;
return ;
}
total++;
ans[total].c=now.c;
ans[total].l=now.l;
now.l=del;
now.c=col;
}
void work(){
prepare();
__int64 del , col;
while (1) {
del=min(abs(t[m.b]-m.bn),abs(t[u.b]-u.bn),abs(t[d.b]-d.bn),abs(t[l.b]-l.bn),abs(t[r.b]-r.bn));
if (m.n>ll){
if (u.bn==1 && m.n%ll!=1) del=0;
if (u.bn==t[u.b] && m.n%ll!=0) del=0;
}
if (d.b!=n+1){
if (d.bn==1 && m.n%ll!=1) del=0;
if (d.bn==t[d.b] && m.n%ll!=0) del=0;
}
if (del==0) del=1;
promote(u,del);
promote(d,del);
promote(l,del);
promote(m,del);
promote(r,del);
col=calc();
add(del,col);
if (m.b==n+1) return ;
if (total> 1000) return ;
}
}
void out(){
printf("%I64d\n",ll);
long i;
for (i=1; i<=total; i++) printf("%I64d %I64d\n",ans[i].c, ans[i].l);
printf("0 0\n");
}
int main(){
long i;
// freopen("1009.in","r",stdin);
// freopen("1009.out","w",stdout);
scanf("%I64d",&ll);
while (ll!=0){
total=0;
inp();
if (n>1000){ scanf("%I64d",&ll); continue; }
work();
if (total<=1000) out();
scanf("%I64d",&ll);
}
printf("0\n");
// fclose(stdout);
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator