| ||||||||||
| 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 | |||||||||
帮忙看下程序还能怎样优化啊。。。用了2125MSIn Reply To:终于AC了,说下体会吧 Posted by:whuwinnie at 2008-08-05 09:31:40 我用双重表索引,还是2s向上。。。。汗
Source Code
Problem: 1054 User: yzhw
Memory: 24872K Time: 2125MS
Language: GCC Result: Accepted
Source Code
# include <stdio.h>
# include <stdlib.h>
int row,col,num,maxnum=3;
char map[5001][5001],change=0;
struct point
{
int r;
int c;
}data[5001];
int cmp(const void *a,const void *b)
{
struct point *aa=(struct point *)a;
struct point *bb=(struct point *)b;
if(aa->r!=bb->r) return aa->r-bb->r;
else return aa->c-bb->c;
}
void deal(int id,struct point n)
{
int i;
if(n.r==data[id].r)
{
if(n.c>data[id].c)
{
int s=n.c-data[id].c;
if(data[id].c-s>0||data[id].c+((col-data[id].c)/s+1)*s<=col) return;
else
{
for(i=data[id].c;i<=col;i+=s)
if(!map[data[id].r][i]) return;
if((col-data[id].c)/s+1>=maxnum)
{
maxnum=(col-data[id].c)/s+1;
change=1;
}
}
}
else
{
int s=data[id].c-n.c;
if(data[id].c+s<=col||data[id].c-((data[id].c-1)/s+1)*s>0) return;
else
{
for(i=data[id].c;i>=1;i-=s)
if(!map[data[id].r][i]) return;
if((data[id].c-1)/s+1>=maxnum)
{
maxnum=(data[id].c-1)/s+1;
change=1;
}
}
}
}
else if(n.c==data[id].c)
{
int s=n.r-data[id].r;
if(data[id].r-s>0||data[id].r+s*((row-data[id].r)/s+1)<=row) return;
for(i=data[id].r;i<=row;i+=s)
if(!map[i][data[id].c]) return;
if((row-data[id].r)/s+1>=maxnum)
{
maxnum=(row-data[id].r)/s+1;
change=1;
}
}
else if(n.c<data[id].c) /*k>0*/
{
int rs=n.r-data[id].r,cs=data[id].c-n.c;
int tr=data[id].r,tc=data[id].c;
int valid=((row-data[id].r)/rs)<((data[id].c-1)/cs)?((row-data[id].r)/rs):((data[id].c-1)/cs);
if((data[id].r-rs>0&&data[id].c+cs<=col)||(data[id].r+rs*(valid+1)<=row&&data[id].c-cs*(valid+1)>0)) return;
for(i=1;i<=valid;i++)
{
tr+=rs;
tc-=cs;
if(!map[tr][tc]) return;
}
if(valid+1>=maxnum)
{
maxnum=valid+1;
change=1;
}
}
else
{
int rs=n.r-data[id].r,cs=n.c-data[id].c;
int tr=data[id].r,tc=data[id].c;
int valid=((row-data[id].r)/rs)<((col-data[id].c)/cs)?((row-data[id].r)/rs):((col-data[id].c)/cs);
if((data[id].r-rs>0&&data[id].c-cs>0)||(data[id].r+rs*(valid+1)<=row&&data[id].c+cs*(valid+1)<=col)) return;
for(i=1;i<=valid;i++)
{
tr+=rs;
tc+=cs;
if(!map[tr][tc]) return;
}
if(valid+1>=maxnum)
{
maxnum=valid+1;
change=1;
}
}
}
struct point* find(int id,int *count)
{
int rl,ll,i,j;
struct point *res=(struct point*)calloc(5001,sizeof(struct point));
/*---------------k>0------------------*/
rl=(row-data[id].r)/(maxnum-1)+data[id].r;
ll=data[id].c-(data[id].c-1)/(maxnum-1);
if(rl>row) rl=row;
if(ll<1) ll=1;
for(i=data[id].r;i<=rl;i++)
for(j=ll;j<=data[id].c;j++)
if(i!=data[id].r||j!=data[id].c)
if(map[i][j])
{
res[++(*count)].r=i;
res[*count].c=j;
}
/*----------------k<0--------------*/
ll=(col-data[id].c)/(maxnum-1)+data[id].c;
if(ll>col) ll=col;
for(i=data[id].r;i<=rl;i++)
for(j=data[id].c;j<=ll;j++)
if(i!=data[id].r||j!=data[id].c)
if(map[i][j])
{
res[++(*count)].r=i;
res[*count].c=j;
}
/*----------------------------------*/
return res;
}
int main()
{
int i,j;
memset(map,0,sizeof(map));
scanf("%d %d %d",&row,&col,&num);
for(i=1;i<=num;i++)
{
scanf("%d %d",&data[i].r,&data[i].c);
map[data[i].r][data[i].c]=1;
}
qsort(data+1,num,sizeof(struct point),cmp);
for(i=1;i<=num;i++)
{
int c=0;
struct point *list=find(i,&c);
if(c==0)
{
free(list);
continue;
}
else
{
for(j=1;j<=c;j++)
deal(i,list[j]);
free(list);
}
}
if(change) printf("%d\n",maxnum);
else printf("0\n");
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator