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 |
求纠错,跟暴力也对拍过了啊, 难道还是阅读理解??#include<iostream> #include<cstdlib> #include<cstring> #include<stdio.h> #include<algorithm> #include<cmath> using namespace std; const int mod=1e9+9,inf=1e9+9; int n,m,en,r,c,o; struct point { int x,y; }; point pt[111],ms[11010]; struct observation { int ti,tx,ty; }; observation ob[111]; struct que { int x,y,ti; }; que queue[1011000]; int vis[111][111],times,cnt,ans; int cont[4][111][111]; int dx[]={-1,1,0,0,0}; int dy[]={0,0,-1,1,0}; bool hav[111][111]; void floodfill(int id) { int i,j,s,p,q,ti,tx,ty,temp1,temp2,temp,nx,ny; ti=ob[id].ti; tx=ob[id].tx; ty=ob[id].ty; memset(vis,-1,sizeof(vis)); queue[0].x=tx; queue[0].y=ty; queue[0].ti=ti; times=ti; vis[tx][ty]=ti; temp1=temp2=0; temp=1; while(temp1<=temp2) { times++; if(times>=m) break; for(i=0;i<r;i++) vis[i][pt[times].y]=times; for(i=0;i<c;i++) vis[pt[times].x][i]=times; for(i=temp1;i<=temp2;i++) { for(j=0;j<5;j++) { nx=queue[i].x+dx[j]; ny=queue[i].y+dy[j]; if(nx>=0&&nx<r&&ny>=0&&ny<c&&vis[nx][ny]!=times) { vis[nx][ny]=times; queue[temp].x=nx; queue[temp].y=ny; queue[temp++].ti=times; } } } temp1=temp2+1; temp2=temp-1; } for(i=0;i<r;i++) { for(j=0;j<c;j++) { if(hav[i][j]) continue; for(s=temp1;s<=temp2;s++) { if(abs(i-queue[s].x)+abs(j-queue[s].y)<=(en-m+1)) { hav[i][j]=true; ms[cnt].x=i; ms[cnt++].y=j; break; } } } } } void solve() { int i,j,s,p,q,lx,ly,rx,ry; memset(cont,0,sizeof(cont)); for(i=0;i<4;i++) { for(j=0;j<cnt;j++) cont[i][ms[j].x][ms[j].y]++; } for(i=0;i<r;i++) for(j=0;j<c;j++) { if(i>0) cont[0][i][j]+=cont[0][i-1][j]; if(j>0) cont[0][i][j]+=cont[0][i][j-1]; if(i>0&&j>0) cont[0][i][j]-=cont[0][i-1][j-1]; } for(i=r-1;i>=0;i--) for(j=0;j<c;j++) { if(i<r-1) cont[1][i][j]+=cont[1][i+1][j]; if(j>0) cont[1][i][j]+=cont[1][i][j-1]; if(i<r-1&&j>0) cont[1][i][j]-=cont[1][i+1][j-1]; } for(i=r-1;i>=0;i--) for(j=c-1;j>=0;j--) { if(i<r-1) cont[2][i][j]+=cont[2][i+1][j]; if(j<c-1) cont[2][i][j]+=cont[2][i][j+1]; if(i<r-1&&j<c-1) cont[2][i][j]-=cont[2][i+1][j+1]; } for(i=0;i<r;i++) for(j=c-1;j>=0;j--) { if(i>0) cont[3][i][j]+=cont[3][i-1][j]; if(j<c-1) cont[3][i][j]+=cont[3][i][j+1]; if(i>0&&j<c-1) cont[3][i][j]-=cont[3][i-1][j+1]; } for(i=0;i<r;i++) { for(j=0;j<c;j++) { if(i==0||j==0||cont[0][i-1][j-1]==0) { for(p=i;p<r;p++) { for(q=j;q<c;q++) { if(p==r-1||q==c-1||cont[2][p+1][q+1]==0) { if(p==r-1||j==0||cont[1][p+1][j-1]==0) { if(i==0||q==c-1||cont[3][i-1][q+1]==0) { lx=inf; ly=inf; rx=-inf; ry=-inf; for(s=0;s<cnt;s++) { if(ms[s].x<i||ms[s].x>p) { if(ly>ms[s].y) ly=ms[s].y; if(ry<ms[s].y) ry=ms[s].y; } if(ms[s].y<j||ms[s].y>q) { if(lx>ms[s].x) lx=ms[s].x; if(rx<ms[s].x) rx=ms[s].x; } } int dx,dy; if(lx==inf) dx=0; else dx=rx-lx; if(ly==inf) dy=0; else dy=ry-ly; if(ans>dx+q-j) ans=dx+q-j; if(ans>dy+p-i) ans=dy+p-i; } } } } } } } } } int main() { int i,j,s,p,q,id,ti,tx,ty; while(scanf("%d%d%d%d%d%d",&n,&m,&en,&r,&c,&o)&&(n!=0||m!=0||en!=0||r!=0||c!=0||o!=0)) { en--; // while(en<0) // puts("orz"); // while(n>=70||m>=100||en>=35000||r>=100||c>=100||r==0||c==0) // puts("orz"); for(i=0;i<m;i++) { scanf("%d%d",&pt[i].x,&pt[i].y); pt[i].x--; pt[i].y--; } for(i=0;i<n;i++) ob[i].ti=-1; for(i=0;i<o;i++) { scanf("%d",&id); id--; scanf("%d%d%d",&ti,&tx,&ty); tx--; ty--; ti--; while(ti<0) puts("orz"); if(ob[id].ti<ti) { ob[id].ti=ti; ob[id].tx=tx; ob[id].ty=ty; } } memset(hav,false,sizeof(hav)); cnt=0; for(i=0;i<n;i++) { if(ob[i].ti>=0) floodfill(i); } ans=mod; //printf("cnt=%d\n",cnt); // for(i=0;i<cnt;i++) // printf("%d %d\n",ms[i].x,ms[i].y); solve(); //while(ans>=mod||ans<=0) // puts("orz"); printf("%d\n",ans); } return 0; } /* 1 1 40 100 100 1 50 50 1 1 50 50 */ Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator