POJ 2653 Pick-up sticks [线段相交 迷之暴力]
| Time Limit: 3000MS | Memory Limit: 65536K | |
| Total Submissions: 12861 | Accepted: 4847 | 
Description
Input
Output
The picture to the right below illustrates the first case from input. 
Sample Input
5
1 1 4 2
2 3 3 1
1 -2.0 8 4
1 4 8 2
3 3 6 -2.0
3
0 0 1 1
1 0 2 1
2 0 3 1
0
Sample Output
Top sticks: 2, 4, 5.
Top sticks: 1, 2, 3.
Hint
Source
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
typedef long long ll;
const int N=1e5+;
const double eps=1e-;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return x*f;
}
inline int sgn(double x){
if(abs(x)<eps) return ;
else return x<?-:;
}
struct Vector{
double x,y;
Vector(double a=,double b=):x(a),y(b){}
bool operator <(const Vector &a)const{
return x<a.x||(x==a.x&&y<a.y);
}
void print(){
printf("%lf %lf\n",x,y);
}
};
typedef Vector Point;
Vector operator +(Vector a,Vector b){return Vector(a.x+b.x,a.y+b.y);}
Vector operator -(Vector a,Vector b){return Vector(a.x-b.x,a.y-b.y);}
Vector operator *(Vector a,double b){return Vector(a.x*b,a.y*b);}
Vector operator /(Vector a,double b){return Vector(a.x/b,a.y/b);}
bool operator ==(Vector a,Vector b){return sgn(a.x-b.x)==&&sgn(a.y-b.y)==;} double Cross(Vector a,Vector b){
return a.x*b.y-a.y*b.x;
}
double Dot(Vector a,Vector b){
return a.x*b.x+a.y*b.y;
}
double DisPP(Point a,Point b){
Point t=a-b;
return sqrt(t.x*t.x+t.y*t.y);
}
struct Line{
Point s,t;
Line(){}
Line(Point p,Point v):s(p),t(v){}
}l[N];
bool isLSI(Line l1,Line l2){
Vector v=l1.t-l1.s,u=l2.s-l1.s,w=l2.t-l1.s;
return sgn(Cross(v,u))!=sgn(Cross(v,w));
}
bool isSSI(Line l1,Line l2){
Vector v1=l1.t-l1.s,v2=l2.t-l2.s;
if(sgn(Cross(v1,v2))==){
int flag=;
Vector u=l2.s-l1.s,w=l2.t-l1.s;
if(sgn(Dot(u,w))<) flag=;
u=l2.s-l1.t,w=l2.t-l1.t;
if(sgn(Dot(u,w))<) flag=;
return flag;
}
else return isLSI(l1,l2)&&isLSI(l2,l1);
} int n;
bool vis[N];
double x,y,x2,y2;
int main(int argc, const char * argv[]) {
while(true){
memset(vis,,sizeof(vis));
n=read(); if(n==) break;
for(int i=;i<=n;i++){
scanf("%lf%lf%lf%lf",&x,&y,&x2,&y2);
l[i]=Line(Point(x,y),Point(x2,y2));
}
for(int i=;i<=n;i++){
for(int j=i+;j<=n;j++) if(isSSI(l[j],l[i])){vis[i]=;break;}
}
printf("Top sticks: ");
int fir=;
for(int i=;i<=n;i++) if(!vis[i]){
if(fir) printf("%d",i),fir=;
else printf(", %d",i);
}
puts(".");
}
return ;
}
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
typedef long long ll;
const int N=1e5+;
const double eps=1e-;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-; c=getchar();}
while(c>=''&&c<=''){x=x*+c-''; c=getchar();}
return x*f;
}
inline int sgn(double x){
if(abs(x)<eps) return ;
else return x<?-:;
}
struct Vector{
double x,y;
Vector(double a=,double b=):x(a),y(b){}
bool operator <(const Vector &a)const{
return x<a.x||(x==a.x&&y<a.y);
}
void print(){
printf("%lf %lf\n",x,y);
}
};
typedef Vector Point;
Vector operator +(Vector a,Vector b){return Vector(a.x+b.x,a.y+b.y);}
Vector operator -(Vector a,Vector b){return Vector(a.x-b.x,a.y-b.y);}
Vector operator *(Vector a,double b){return Vector(a.x*b,a.y*b);}
Vector operator /(Vector a,double b){return Vector(a.x/b,a.y/b);}
bool operator ==(Vector a,Vector b){return sgn(a.x-b.x)==&&sgn(a.y-b.y)==;} double Cross(Vector a,Vector b){
return a.x*b.y-a.y*b.x;
}
double Dot(Vector a,Vector b){
return a.x*b.x+a.y*b.y;
}
double DisPP(Point a,Point b){
Point t=a-b;
return sqrt(t.x*t.x+t.y*t.y);
}
struct Line{
Point s,t;
Line(){}
Line(Point p,Point v):s(p),t(v){}
}l[N];
bool isLSI(Line l1,Line l2){
Vector v=l1.t-l1.s,u=l2.s-l1.s,w=l2.t-l1.s;
return sgn(Cross(v,u))!=sgn(Cross(v,w));
}
bool isSSI(Line l1,Line l2){
Vector v1=l1.t-l1.s,v2=l2.t-l2.s;
if(sgn(Cross(v1,v2))==){
int flag=;
Vector u=l2.s-l1.s,w=l2.t-l1.s;
if(sgn(Dot(u,w))<) flag=;
u=l2.s-l1.t,w=l2.t-l1.t;
if(sgn(Dot(u,w))<) flag=;
return flag;
}
else return isLSI(l1,l2)&&isLSI(l2,l1);
} int n,st[N],top;
inline void del(int p){
for(int i=p;i<=top;i++) st[i]=st[i+];top--;
}
double x,y,x2,y2;
int main(int argc, const char * argv[]) {
while(true){
top=;
n=read(); if(n==) break;
for(int i=;i<=n;i++){
scanf("%lf%lf%lf%lf",&x,&y,&x2,&y2);
l[i]=Line(Point(x,y),Point(x2,y2));
for(int j=;j<=top;j++) if(isSSI(l[st[j]],l[i])) del(j),j--;
st[++top]=i;
}
printf("Top sticks: %d",st[]);
for(int i=;i<=top;i++) printf(", %d",st[i]);
puts(".");
}
return ;
}
POJ 2653 Pick-up sticks [线段相交 迷之暴力]的更多相关文章
- 【POJ 2653】Pick-up sticks 判断线段相交
		一定要注意位运算的优先级!!!我被这个卡了好久 判断线段相交模板题. 叉积,点积,规范相交,非规范相交的简单模板 用了“链表”优化之后还是$O(n^2)$的暴力,可是为什么能过$10^5$的数据? # ... 
- POJ 2653 Pick-up sticks(线段相交)
		题意:给定n个木棍依次放下,要求最终判断没被覆盖的木棍是哪些. 思路:快速排斥以及跨立实验可以判断线段相交. #include<algorithm> #include<cstdio& ... 
- POJ 1066 Treasure Hunt (线段相交)
		题意:给你一个100*100的正方形,再给你n条线(墙),保证线段一定在正方形内且端点在正方形边界(外墙),最后给你一个正方形内的点(保证不再墙上) 告诉你墙之间(包括外墙)围成了一些小房间,在小房间 ... 
- POJ 1410	 Intersection  --几何,线段相交
		题意: 给一条线段,和一个矩形,问线段是否与矩形相交或在矩形内. 解法: 判断是否在矩形内,如果不在,判断与四条边是否相交即可.这题让我发现自己的线段相交函数有错误的地方,原来我写的线段相交函数就是单 ... 
- POJ 1269 Intersecting Lines(线段相交,水题)
		id=1269" rel="nofollow">Intersecting Lines 大意:给你两条直线的坐标,推断两条直线是否共线.平行.相交.若相交.求出交点. ... 
- POJ 1066 Treasure Hunt【线段相交】
		思路:枚举四边墙的门的中点,与终点连成一条线段,判断与其相交的线段的个数.最小的加一即为答案. 我是傻逼,一个数组越界调了两个小时. #include<stdio.h> #include& ... 
- poj 1556 (Dijkstra + Geometry 线段相交)
		链接:http://poj.org/problem?id=1556 The Doors Time Limit: 1000MS Memory Limit: 10000K Total Submissi ... 
- POJ 3304 Segments[直线与线段相交]
		Segments Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13514 Accepted: 4331 Descrip ... 
- POJ 1408 Fishnet【枚举+线段相交+叉积求面积】
		题目: http://poj.org/problem?id=1408 http://acm.hust.edu.cn/vjudge/contest/view.action?cid=22013#probl ... 
随机推荐
- c++2(循环和递归)
			其实编程的朋友知道,不管学什么语言,循环和递归是两个必须学习的内容.当然,如果循环还好理解一点,那么递归却没有那么简单.我们曾经对递归讳莫如深,但是我想告诉大家的是,递归其实没有那么可怕.所谓的递归就 ... 
- callback和spring的MD5加密
			举个例子:当我们访问淘宝网站的时候,当点击购物车的时候,这个时候提示用户登录用户名和密码,登录成功后,会返回到购物车的页面.这就是回调. 它不返回淘宝的首页,而是返回到我们点击的内容所在页面. 在写接 ... 
- Fiddler显示服务器IP的方法
			Fiddler默认配置中是看不到服务器IP的,接下来简单介绍下在fiddler上也能够看到请求的服务器IP: 1.Fiddler--->Rules--->Customize Rules , ... 
- [国嵌笔记][004][Linux快速体验]
			Linux文件系统 bin目录:可执行的程序 boot目录:与Linux启动相关的文件 dev目录:设备以文件的方式存放 etc目录:配置文件 home目录:用户文件 lib目录:与库相关的文件 ro ... 
- CSS中的定位与浮动
			CSS中的定位与浮动 本文主要讲述CSS中的三种定位样式static.relative和absolute的区别以及浮动元素的特征. 定位样式 CSS中定位样式position的取值有三个,默认值:st ... 
- 一致性哈希java实现
			值得注意的点 哈希函数的选择 murmur哈希函数 该函数是非加密型哈希,性能高,且发生哈希碰撞的概率据说很低 md5 SHA 可以选择guava包,提供了丰富的哈希函数的API 支持虚拟节点+加权, ... 
- 将本地的项目导入到github仓库总结lxw
			关键步骤: 第一:git clone https://github.com/lxw18231857001/demo-.git #把github上面的仓库克隆到本地 本地项目文件夹下 ... 
- SSL和SSH有什么区别
			SSL 是一种安全协议,它为网络(例如因特网)的通信提供私密性.SSL 使应用程序在通信时不用担心被窃听和篡改. SSL 实际上 是共同工作的两个协议:"SSL 记录协议"(SSL ... 
- jQuery使用简单示例 validate 插件
			摘录自:http://blog.csdn.net/u010320371/article/details/51104783用户登录 用户名 密码 确认密码 <!DOCTYPE html> & ... 
- programing
			body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ... 
