http://codeforces.com/problemset/problem/50/C
记录出轮廓线,计算出走的长度, ans+4
View Code
void get_data() { int64 i,j,k; for(i=0;i<N;i++) scanf("%I64d%I64d",&g[i].x,&g[i].y); } void solve() { int64 i,j,k,x,y,ans=0,cnt; cnt=graham(g,N,res); for(i=1;i<cnt;i++) { // printf("%d %d\n",res[i].x,res[i].y); x=f_abs(res[i].x-res[i-1].x); y=f_abs(res[i].y-res[i-1].y); // printf("%d %d\n",x,y); ans+=f_max(x,y); } x=f_abs(res[cnt-1].x-res[0].x); y=f_abs(res[cnt-1].y-res[0].y); ans+=f_max(x,y); printf("%I64d\n", ans+4); } int main() { while(scanf("%d",&N)!=EOF) get_data(),solve(); return 0; }
这种构造方法不能说明正确性, 认为对于一个点,构造4个和他相邻的点比较靠谱,默认就把点不包括在边界上啦。
View Code
void get_data() { int64 i,j,k,a,b; for(i=0;i<N;i++) { scanf("%I64d%I64d",&a,&b); g[i].x=a, g[i].y=b+1; g[i+N].x=a, g[i+N].y=b-1; g[i+2*N].x=a+1, g[i+2*N].y=b; g[i+3*N].x=a-1, g[i+3*N].y=b; } } void solve() { int64 i,j,k,x,y,ans=0,cnt; cnt=graham(g,N<<2,res); for(i=1;i<cnt;i++) { x=f_abs(res[i].x-res[i-1].x); y=f_abs(res[i].y-res[i-1].y); ans+=f_max(x,y); } x=f_abs(res[cnt-1].x-res[0].x); y=f_abs(res[cnt-1].y-res[0].y); ans+=f_max(x,y); printf("%I64d\n", ans); } int main() { while(scanf("%I64d",&N)!=EOF) get_data(),solve(); return 0; }