首页 > 其他分享 >洛谷 P1153 点和线

洛谷 P1153 点和线

时间:2022-10-30 21:59:29浏览次数:62  
标签:nxt now 洛谷 Point 点和线 vec return P1153 define

前置知识

(1) 求两条线段的交点

方法1, 运用高中的解析几何知识求.
方法2, 运用向量点积求.
考虑向量叉乘。若 \(\vec a\times\vec b>0\), 那么 \(\vec b\)在 \(\vec a\) 的逆时针方向;若叉积小于 \(0\),那么 \(\vec b\)在 \(\vec a\) 的顺时针方向。于是,判断点 C 和 D 是否在直线 AB 的两侧,就是判断 \(\overrightarrow{AB}\times\overrightarrow{AC}\)和 \(\overrightarrow{AB}\times\overrightarrow{AD}\)是否同号。如果同号,那么在同侧;如果异号,那么在两侧。题目保证了任意三点不共线,所以叉积为 0 的情况不可能出现。(copy from be60_)

(2) DFS

由于本题数据范围太小了, 可以用无脑STL的next_permutation搞. 不难做.

Code

#include <bits/stdc++.h>
using namespace std;
#define F(i, a, b) for(int i=a; i<=b;i++)
#define Fd(i, a, b) for(int i=a;i>=b;i--)
#define D double
#define MAXN 10
#define printf blank
#define eps (1e-9)
#define pb push_back
#define ppp pair<Point, Point> 
void blank(...){}
struct Point{
	int x, y; 
	Point(double x=0, double y=0): x(x), y(y){}
};
vector<Point> v;

Point operator-(Point a,Point b){return Point(a.x-b.x,a.y-b.y);}
D cross(Point a, Point b){
	return ((D)(a.x*b.y-a.y*b.x));
}
int dcmp(D x){return fabs(x)<eps?0:(x<0?-1:1);}
bool interc(Point a1, Point a2, Point b1, Point b2){
	double c1=cross(a2-a1,b1-a1);
	double c2=cross(a2-a1,b2-a1);
	double c3=cross(b2-b1,a1-b1);
	double c4=cross(b2-b1,a2-b1);
    return dcmp(c1)*dcmp(c2)<0&&dcmp(c3)*dcmp(c4)<0;
}
int s[10]={0,1,2,3,4,5,6,7,8,9};
int cnt=1, num=0;
bool chk(){
	vector<pair<Point, Point> > now;
	now.clear();
	F(i, 1, cnt-1){
		ppp nxt = make_pair(v[s[i]], v[s[i-1]]);
		for(ppp i : now){
			if(interc(i.first, i.second, nxt.first, nxt.second)){
				return 0;
			}
		}
		now.pb(nxt);
	}
	ppp nxt = make_pair(v[0], v[s[cnt-1]]);
	for(ppp i : now){
			if(interc(i.first, i.second, nxt.first, nxt.second)){
				return 0;
			}
	}
	return 1;
}

int main(){
	int m, n; 
	cin>>m>>n;
	v.pb(Point(0,0));
	while(m != 0 || n != 0){
		cnt++;
		Point p(m, n);
		v.pb(p);
		cin>>m>>n;
		
	}
	
	#define UPDATE if(chk()) {num++; printf("SUCCESS\n");}else{printf("FAIL\n");}
	UPDATE
	while(next_permutation(s+1, s+cnt)){
		UPDATE
	}
	
	cout<<num/2<<endl;
	
	
}

错在哪

第一次没有考虑全面, 最后一条线也要完全做, 因此没有考虑最后一条线和第一条线的关系.

标签:nxt,now,洛谷,Point,点和线,vec,return,P1153,define
From: https://www.cnblogs.com/augpath/p/16842348.html

相关文章

  • 洛谷 P1789【Mc生存】插火把
    萌新写的代码,长但模块化#include<stdio.h>#defineROW100#defineCOLUMN100intmap[ROW][COLUMN];/*函数测试数据={1,1,1,0,0,1,1,0,1,0,1,1,1,0,0,0,0,0,0,0......
  • 洛谷P8539 「Wdoi-2」来自地上的支援 题解
    ST表做法思路当进行第\(x\)次操作时,若\(b_1\)到\(b_{x-1}\)中有比\(b_x\)大的数,那这次操作轮不到\(b_x\),并且前面的本来就比它大的数只会越来越大,所以以后的......
  • P1597洛谷刷题
    #include<iostream>#include<string>usingnamespacestd;intmain(intargc,char**argv){ stringstr="a:=3;b:=4;c:=5"; for(inti=1;i<=3;i++){ ints......
  • 洛谷P5759题解
    本文摘自本人洛谷博客,原文章地址:https://www.luogu.com.cn/blog/cjtb666anran/solution-p5759\[这道题重在理解题意\]选手编号依次为:\(1,2...N\)(\(N\)为参赛总人数)。......
  • 【EA的练习赛2】【洛谷P7274】草地(单调栈,LCT维护最小生成树)
    学到了很多。我们分步走。首先在做这道题前先观察到几个小性质:操作顺序不同不影响结果发现对于每一个黑点,一通操作过后它扩展出的区域是一个矩形,而操作顺序是不影响......
  • 洛谷P3391 【模板】文艺平衡树
    题目描述您需要写一种数据结构(可参考题目标题),来维护一个有序数列。其中需要提供以下操作:翻转一个区间,例如原有序序列是5 4 3 2 1,翻转区间是[2,4] 的话,结果是5 2 ......
  • 洛谷P8805题解
    原题P8805[蓝桥杯2022国B]机房思路概述题意分析给定一个\(n\)个点的无根树,每个点的权值等于其出边数量。对于给定的\(m\)组询问,第\(i(1≤i≤n)\)组询问包......
  • 洛谷 P6294
    首先有一个显而易见的性质:每次取都是取最大的一个数。然后就变成了加数,取最大值,加数,取最大值。。。直接单走一个优先队列(但是很明显这个数据不打算把优先队列放过去。......
  • 洛谷 P1077 [NOIP2012 普及组] 摆花 (DP)
    https://www.luogu.com.cn/problem/P1077题目描述摆上m盆花。一共有n种花,从1到n标号。为了在门口展出更多种花,规定第i种花不能超过ai盆,摆花时同一种花放在一起,且不同......
  • 洛谷 P6963
    不难发现,包含关系只可能是短的路径被长的路径包含。那么我们考虑按照路径长度从小到大,一条一条路径边加入边判断。考虑先将树上的所有边断开,每加入一条路径的时候就将这......