标签:des style blog color io os ar java for
Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 822 Accepted Submission(s): 239
这条题卡了好久呀 -。-
卡完构图卡空间, 卡完空间卡二分范围 , 右区间要去到 800W , 500W返WA 。
卡完二分范围卡编译器问题 ,
不知道为啥 , 把run() 部分写在 主函数交 C++会超时, 交G++就过。
条题其实很入门 , 依然是 2分 + two-sat ....
处理距离牛与牛之间的距离那里也先大好表,避免超时吧~
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> #include <map> using namespace std; typedef long long LL; const int N = 1010; const int M = 1000010; const int MAX = 8000000; int n , A , B , st[N] , top , dis_s1_s2 ; int eh[N] , et[M] , nxt[M] , tot ; bool mark[N]; struct node { int x , y ; }e[N] , h[N<<1] , s[2] ; int d[510][3] ; void init() { tot = 0; memset ( eh , -1 ,sizeof eh ); memset ( mark , false , sizeof mark ); } void addedge( int u , int v) { et[tot] = v , nxt[tot] = eh[u] , eh[u] = tot ++ ; et[tot] = u , nxt[tot] = eh[v] , eh[v] = tot ++ ; } //-------------------- inline int dis( int x1 , int y1 , int x2 , int y2 ){ return abs( x1 - x2 ) + abs( y1 - y2 ); } bool dfs( int u ) { if( mark[u] ) return true ; if( mark[u^1] ) return false ; mark[u] = true; st[top++] = u ; for( int i = eh[u] ; ~i ; i = nxt[i] ){ int v = et[i]; if( !dfs( v^1 ) ) return false ; } return true ; } bool solve( ) { for( int i = 0 ; i < 2 * n ; i += 2 ){ if( !mark[i] && !mark[i+1] ){ top = 0 ; if( !dfs( i ) ){ while( top > 0 ) mark[ st[--top] ] = false ; if( !dfs( i + 1 ) ) return false ; } } } return true; } bool test( double DIS ) { init(); for( int i = 0 ; i < A + B ; ++i ){ if( i < A ) addedge( 2*h[i].x , 2*h[i].y ) , addedge( 2*h[i].x^1 , 2*h[i].y^1 ) ; else addedge( 2*h[i].x^1 , 2*h[i].y ) , addedge( 2*h[i].x , 2*h[i].y^1 ) ; } for( int i = 0 ; i < n ; i ++ ){ for( int j = i + 1 ; j < n ; j ++ ){ if( d[i][0] + d[j][0] > DIS ) addedge( 2*i , 2*j ); if( d[i][1] + d[j][0] + dis_s1_s2 > DIS ) addedge( 2*i^1 , 2*j ); if( d[i][0] + d[j][1] + dis_s1_s2 > DIS ) addedge( 2*i , 2*j^1 ); if( d[i][1] + d[j][1] > DIS ) addedge( 2*i^1 , 2*j^1 ); } } return solve(); } void run() { int x , y ; for( int i = 0 ; i < 2 ; ++i ) scanf("%d%d",&s[i].x,&s[i].y); dis_s1_s2 = dis( s[0].x,s[0].y,s[1].x,s[1].y ); for( int i = 0 ; i < n ; ++i ){ scanf("%d%d",&x,&y ); d[i][0] = dis( x , y , s[0].x , s[0].y ); d[i][1] = dis( x , y , s[1].x , s[1].y ); } for( int i = 0 ; i < A + B ; ++i ){ scanf("%d%d",&h[i].x,&h[i].y); h[i].x -- ;h[i].y -- ; } int ans = -1 , l = 0 , r = MAX ; while( l <= r ) { int mid = ( l + r ) >> 1 ; if( test(mid) ) ans = mid , r = mid - 1 ; else l = mid + 1 ; } printf("%d\n",ans); } int main() { #ifdef LOCAL freopen("in.txt","r",stdin); #endif while( scanf("%d%d%d",&n,&A,&B) != EOF )run(); }
标签:des style blog color io os ar java for
原文地址:http://www.cnblogs.com/hlmark/p/4021307.html