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 |
Re:小人写了个o(n) 的程序,sample 过了,但是莫名的run time error...... 那位大牛能帮帮忙?不胜感谢(如果有测试数据,请发到qmczcn@sohu.com)In Reply To:小人写了个o(n) 的程序,sample 过了,但是莫名的run time error...... 那位大牛能帮帮忙?不胜感谢(如果有测试数据,请发到qmczcn@sohu.com) Posted by:qmczcn at 2005-08-10 21:42:01 > #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