ZOJ 3717 Balloon ( TLE )
正解2-SAT。
我用DLX想搜一搜的,结果TLE了……
没什么遗憾,最起码我尝试过了。
扔个代码留作纪念。
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm> using namespace std; const int INF = << ;
const int MAXN = ;
const double eps = 1e-; struct Point
{
double x, y, z;
Point( double x = , double y = , double z = ):x(x), y(y), z(z){ }
void readPoint()
{
scanf( "%lf%lf%lf", &x, &y, &z );
return;
}
}; bool mx[MAXN][]; //01矩阵
int C[MAXN*], cnt[];
int U[MAXN*], D[MAXN*];
int L[MAXN*], R[MAXN*];
int head;
int maxr, maxc;
Point P[MAXN];
int N; int dcmp( double a )
{
if ( fabs(a) < eps ) return ;
return a < ? - : ;
} double Dis( Point a, Point b )
{
return sqrt( ( a.x - b.x )*( a.x - b.x ) + ( a.y - b.y )*( a.y - b.y ) + ( a.z - b.z )*( a.z - b.z ) );
} void Remove( int c )
{
int i, j;
L[ R[c] ] = L[c];
R[ L[c] ] = R[c];
for ( i = D[c]; i != c; i = D[i] )
{
for ( j = R[i]; j != i; j = R[j] )
{
U[ D[j] ] = U[j];
D[ U[j] ] = D[j];
--cnt[ C[j] ];
}
}
return;
} void Resume( int c )
{
int i, j;
R[ L[c] ] = c;
L[ R[c] ] = c;
for ( i = D[c]; i != c; i = D[i] )
{
for ( j = R[i]; j != i; j = R[j] )
{
U[ D[j] ] = j;
D[ U[j] ] = j;
++cnt[ C[j] ];
}
}
return;
} bool DFS( int cur )
{
int i, j, c, minv; if ( cur > N ) return false;
if ( R[head] == head )
{
if ( cur == N )
return true;
return false;
} minv = INF;
for ( i = R[head]; i != head; i = R[i] )
{
if ( cnt[i] < minv )
{
minv = cnt[i];
c = i;
}
} Remove(c);
for ( i = D[c]; i != c; i = D[i] )
{
for( j = R[i]; j != i; j = R[j] )
Remove( C[j] ); if ( DFS( cur + ) ) return true; for( j = R[i]; j != i; j = R[j] )
Resume( C[j] );
} Resume(c);
return false;
} bool build()
{
int i, j, cur, pre, first;
head = ;
for ( i = ; i < maxc; ++i )
{
R[i] = i + ;
L[i + ] = i;
}
R[ maxc ] = ;
L[] = maxc; //列双向链表
for ( j = ; j <= maxc; ++j )
{
pre = j;
cnt[j] = ;
for ( i = ; i <= maxr; ++i )
{
if ( mx[i][j] )
{
++cnt[j];
cur = i * maxc + j; //当前节点的编号
C[cur] = j; //当前节点所在列
D[pre] = cur;
U[cur] = pre;
pre = cur;
}
}
U[j] = pre;
D[pre] = j;
if ( !cnt[j] ) return false; //一定无解
} //行双向链表
for ( i = ; i <= maxr; ++i )
{
pre = first = -;
for ( j = ; j <= maxc; ++j )
{
if( mx[i][j] )
{
cur = i * maxc + j;
if ( pre == - ) first = cur;
else
{
R[pre] = cur;
L[cur] = pre;
}
pre = cur;
}
}
if ( first != - )
{
R[pre] = first;
L[first] = pre;
}
}
return true;
} /**************以上DLX模板*****************/ void show()
{
for ( int i = ; i <= maxr; ++i )
{
for ( int j = ; j <= maxc; ++j )
printf( "%d", mx[i][j] );
puts("");
}
puts("---------");
return;
} //得到该情况下的01矩阵
void init( double R )
{
memset( mx, false, sizeof(mx) ); for ( int i = ; i <= maxr; ++i )
{
mx[i][i] = true;
if ( i % )
{
//printf("ii %d %d\n", i, i + 1);
mx[i][N + N + i/+] = true;
mx[i + ][N + N + i/+] = true;
}
for ( int j = ; j <= maxr; ++j )
{
//printf("i=%d j=%d\n", i, j );
if ( dcmp( Dis( P[i], P[j] ) - 2.0 * R ) < )
mx[j][i] = true;
}
}
//show();
return;
} bool ok( double mid )
{
init( mid );
if ( build() == false ) return false;
if ( DFS( ) == false ) return false;
return true;
} double solved()
{
double l = ;
double r = Dis( Point(, , ), Point( , , ) );
double ans;
while ( dcmp( r - l ) > )
{
double mid = ( l + r ) / 2.0;
//printf( "mid = %.6f\n", mid );
if ( ok( mid ) )
{
l = mid;
ans = mid;
}
else r = mid;
}
return ans;
} int main()
{
//freopen( "in.txt", "r", stdin );
//freopen( "out.txt", "w", stdout );
while ( scanf( "%d", &N ) == )
{
maxr = ;
for ( int i = ; i < N; ++i )
{
P[++maxr].readPoint();
P[++maxr].readPoint();
}
maxc = maxr + N;
double ans=(int)(solved()*+0.5+eps)/1000.0;
if ( !ok(ans) ) ans -= 0.001;
printf( "%.3f\n", ans );
}
return ;
}
ZOJ 3717 Balloon ( TLE )的更多相关文章
- zoj 3717 - Balloon(2-SAT)
裸的2-SAT,详见刘汝佳训练指南P-323 不过此题有个特别需要注意的地方:You should promise that there is still no overlap for any two ...
- zoj 3981 Balloon Robot
https://vjudge.net/problem/ZOJ-3981 题意: 有m个座位,其中n个队伍坐在这些位置上,一个队伍一个座位.当一个队A了题之后,他们们会得到气球,假设他们在a时刻A题,但 ...
- ZOJ 3717 二分+2-sat判定。
好久没有2-sat了,此题当复习之用,二分求最大值+2-sat判断可行,此题主要跪于题意:The results should be rounded to three decimal places. ...
- ZOJ - 3981 - Balloon Robot (思维)
参考自:https://blog.csdn.net/qq_36553623/article/details/78445558 题意: 第一行三个数字n, m, q表示有m个座位围成一个环,n个队伍,q ...
- ZOJ 3717
这题是二分+2SAT. 总结一下SAT题的特征.首先,可能会存在二选一的情况,然后会给出一些矛盾.据这些矛盾加边,再用SAT判定. 这一道题好像不能直接用printf("%0.3lf&quo ...
- 【BZOJ】1901: Zju2112 Dynamic Rankings(区间第k小+树状数组套主席树)
http://www.lydsy.com/JudgeOnline/problem.php?id=1901 首先还是吐槽时间,我在zoj交无限tle啊!!!!!!!!我一直以为是程序错了啊啊啊啊啊啊. ...
- ZOJ 3981 && 2017CCPC秦皇岛 A:Balloon Robot(思维题)
A - Balloon Robot Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu Sub ...
- POJ 2240 && ZOJ 1082 Arbitrage 最短路,c++ stl pass g++ tle 难度:0
http://poj.org/problem?id=2240 用log化乘法为加法找正圈 c++ 110ms,g++tle #include <string> #include <m ...
- zoj 2104 Let the Balloon Rise(map映照容器的应用)
题目链接: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2104 题目描述: Contest time again! Ho ...
随机推荐
- javaweb基础(40)_jdbc框架
一.元数据介绍 元数据指的是"数据库"."表"."列"的定义信息. 1.1.DataBaseMetaData元数据 Connection.g ...
- fine ui grid控件添加行号
grid控件的列中添加如下代码<f:RowNumberField EnablePagingNumber="true" TextAlign="Center" ...
- vue登录插件引来的后续问题
上次介绍了下写的登录弹框插件,过了几天发现点击去注册或者改密码的跳转失效.报错this.$router.push is not a function,继续打印this.$router也是undefin ...
- Python 初始—(列表)
列表切片 数组data=[a,b,c,d,e] print(data[1,3])#取出b,c , 如果用-号切片则是反向取数,那么去取出来的数为data[-3,-1],如果是0则默认不填 列表追加 d ...
- ubuntu built-in display 产生的一个原因
在没有禁用开源的显卡驱动 nouveau 下,从 apt 安装了nvidia的驱动,导致了后面开机后,系统不能正确的识别到显示器,整个界面分辨率变的非常小,在设置菜单中的显示设置中也不能调节分辨率,并 ...
- hibernate映射实体类查询时数据库空字段赋值给实体类报错的问题
因为一直报实体类空异常,去网上查了资料只查到了并没有查到数据库空值时不给实体类赋值的属性 异常 org.hibernate.InvalidMappingException: Could not par ...
- PHP生成特定长度的纯字母字符串
PHP中,md5().uniqid()函数可以返回32位和13位不重复的字符串,但是这些字符串都可能包含有数字.如果需要纯字母的字符串,而且长度不定,比如8位,那么直接用这两个函数无法达到效果. 这时 ...
- 图解HTTP总结(6)——HTTP首部
HTTP报文首部 HTTP 协议的请求和响应报文中必定包含 HTTP 首部. 首部内容为客户端和服务器分别处理请求和响应提供所需要的信息. 对于客户端用户来说, 这些信息中的大部分内容都无须亲自查看. ...
- 493. Reverse Pairs
// see more at https://www.youtube.com/watch?v=j68OXAMlTM4 // https://leetcode.com/problems/reverse- ...
- Hive 压缩技术Data Compression
Mapreducwe 执行流程 :input > map > shuffle > reduce > output 压缩执行时间,map 之后,压缩,数据存储在本地磁盘,减少磁盘 ...