题意

给定一个三角形和一个点 \(p\),如果该点不在三角形边上直接输出 \(-1\),否则在三角形上找一点 \(q\),使得线段 \(pq\) 平分三角形面积。

思路

看完题想都没想直接二分了。

就是比赛时复制粘贴的时候改错了,贡献了三发罚时。

板子来自 kuangbin 的模板。

#include <bits/stdc++.h>
using namespace std;
typedef double db;
const db eps = 1e-8;
const db inf = 1e20;
const db pi = acos(-1.0); int sgn(db x){
if(fabs(x) < eps)return 0;
if(x < 0)return -1;
else return 1;
} struct Point{
db x, y;
Point(){}
Point(db _x, db _y){
x = _x;
y = _y;
}
void input(){
scanf("%lf%lf", &x, &y);
}
bool operator == (Point b)const{
return sgn(x-b.x) == 0 && sgn(y-b.y) == 0;
}
Point operator -(const Point &b)const{
return Point(x-b.x, y-b.y);
}
//叉积
db operator ^(const Point &b)const{
return x*b.y - y*b.x;
}
//点积
db operator *(const Point &b)const{
return x*b.x + y*b.y;
}
//返回两点的距离
db dis(Point p){
return hypot(x-p.x, y-p.y);
}
Point operator +(const Point &b)const{
return Point(x+b.x, y+b.y);
}
Point operator *(const db &k)const{
return Point(x*k, y*k);
}
Point operator /(const db &k)const{
return Point(x/k, y/k);
}
}; struct Line{
Point s,e;
Line(){}
Line(Point _s,Point _e){
s = _s;
e = _e;
}
// 点在线段上的判断
bool pointonseg(Point p){
return sgn((p-s)^(e-s)) == 0 && sgn((p-s) * (p-e)) <= 0;
} // 求两直线的交点
Point crosspoint(Line v){
double a1 = (v.e-v.s)^(s-v.s);
double a2 = (v.e-v.s)^(e-v.s);
return Point((s.x*a2-e.x*a1)/(a2-a1),(s.y*a2-e.y*a1)/(a2-a1));
}
}; // 求点a和点b的中点
Point get_mid(Point a, Point b) {
return (a + b) * 0.5;
} int main() {
int T;
scanf("%d", &T);
while(T--) {
Point a, b, c, p;
Line ab, bc, ac;
a.input(), b.input(), c.input(), p.input();
ab = Line(a, b); bc = Line(b, c); ac = Line(a, c);
db area = fabs((b - a) ^ (c - a) * 0.5); // 三角形面积
if(ab.pointonseg(p)) { // 点p在线段ab上
if(a.dis(p) < b.dis(p)) { // 点p靠近点a,则另一点一定在线段bc上
Point l = c, r = b;
Point mid = get_mid(l, r);
int times = 1000;
while(times--) {
mid = get_mid(l, r);
db s = fabs((mid - p) ^ (b - p));
if(sgn(s - area) > 0) {
l = mid;
} else if(sgn(s - area) == 0) {
break;
} else {
r = mid;
}
}
printf("%.10lf %.10lf\n", mid.x, mid.y);
} else { // 点p靠近点b,则另一点一定在线段ac上
Point l = c, r = a;
Point mid = get_mid(l, r);
int times = 1000;
while(times--) {
mid = get_mid(l, r);
db s = fabs((mid - p) ^ (a - p));
if(sgn(s - area) > 0) {
l = mid;
} else if(sgn(s - area) == 0) {
break;
} else {
r = mid;
}
}
printf("%.10lf %.10lf\n", mid.x, mid.y);
}
} else if(bc.pointonseg(p)) { // 另外两种情况复制粘贴就行了
if(b.dis(p) < c.dis(p)) {
Point l = a, r = c;
Point mid = get_mid(l, r);
int times = 1000;
while(times--) {
mid = get_mid(l, r);
db s = fabs((mid - p) ^ (c - p));
if(sgn(s - area) > 0) {
l = mid;
} else if(sgn(s - area) == 0) {
break;
} else {
r = mid;
}
}
printf("%.10lf %.10lf\n", mid.x, mid.y);
} else {
Point l = a, r = b;
Point mid = get_mid(l, r);
int times = 1000;
while(times--) {
mid = get_mid(l, r);
db s = fabs((mid - p) ^ (b - p));
if(sgn(s - area) > 0) {
l = mid;
} else if(sgn(s - area) == 0) {
break;
} else {
r = mid;
}
}
printf("%.10lf %.10lf\n", mid.x, mid.y);
}
} else if(ac.pointonseg(p)) {
if(a.dis(p) < c.dis(p)) {
Point l = b, r = c;
Point mid = get_mid(l, r);
int times = 1000;
while(times--) {
mid = get_mid(l, r);
db s = fabs((mid - p) ^ (c - p));
if(sgn(s - area) > 0) {
l = mid;
} else if(sgn(s - area) == 0) {
break;
} else {
r = mid;
}
}
printf("%.10lf %.10lf\n", mid.x, mid.y);
} else {
Point l = b, r = a;
Point mid = get_mid(l, r);
int times = 1000;
while(times--) {
mid = get_mid(l, r);
db s = fabs((mid - p) ^ (a - p));
if(sgn(s - area) > 0) {
l = mid;
} else if(sgn(s - area) == 0) {
break;
} else {
r = mid;
}
}
printf("%.10lf %.10lf\n", mid.x, mid.y);
}
} else {
printf("-1\n");
}
} return 0;
}

赛后发现直接推也可以,也不用写这么长的代码了 (虽然大部分是复制粘贴)。感觉在演队友。

2019 ACM-ICPC 南京 现场赛 K. Triangle (二分)的更多相关文章

  1. 2013 ACM/ICPC 长沙现场赛 A题 - Alice's Print Service (ZOJ 3726)

    Alice's Print Service Time Limit: 2 Seconds      Memory Limit: 65536 KB Alice is providing print ser ...

  2. 2013 ACM/ICPC 长沙现场赛 C题 - Collision (ZOJ 3728)

    Collision Time Limit: 2 Seconds      Memory Limit: 65536 KB      Special Judge There's a round medal ...

  3. hdu 4432 第37届ACM/ICPC天津现场赛B题

    题目大意就是找出n的约数,然后把约数在m进制下展开,各个数位的每一位平方求和,然后按m进制输出. 模拟即可 #include<cstdio> #include<iostream> ...

  4. hdu 4435 第37届ACM/ICPC天津现场赛E题

    转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 题目:给出N个城市,从1开始需要遍历所有点,选择一 ...

  5. 2018南京现场赛K 随机输出

    题目链接:http://codeforces.com/gym/101981/attachments n和m太小,空地联通无环,总步数太大,直接随机输出5w个方向 #include<iostrea ...

  6. 2013 ACM/ICPC 南京网络赛F题

    题意:给出一个4×4的点阵,连接相邻点可以构成一个九宫格,每个小格边长为1.从没有边的点阵开始,两人轮流向点阵中加边,如果加入的边构成了新的边长为1的小正方形,则加边的人得分.构成几个得几分,最终完成 ...

  7. 2015 ACM / ICPC 亚洲区域赛总结(长春站&北京站)

    队名:Unlimited Code Works(无尽编码)  队员:Wu.Wang.Zhou 先说一下队伍:Wu是大三学长:Wang高中noip省一:我最渣,去年来大学开始学的a+b,参加今年区域赛之 ...

  8. Gym101981D - 2018ACM-ICPC南京现场赛D题 Country Meow

    2018ACM-ICPC南京现场赛D题-Country Meow Problem D. Country Meow Input file: standard input Output file: sta ...

  9. 2018 icpc 徐州现场赛G-树上差分+组合数学-大佬的代码

    现场赛大佬打印的代码,观摩了一哈. 写了注释,贴一下,好好学习.%%%PKU 代码: //树上差分(LCA) #include<bits/stdc++.h> #define For(i,x ...

随机推荐

  1. JavaScript 类型浅解

    对于JavaScript 类型,可简单地概括为:相对于强类型语言来说,它是弱(松散)类型的语言:有基本类型和引用类型,他们是区别是一个有固定空间存在于栈内存中,一个没有固定空间保存在堆内存中并且在栈内 ...

  2. 测开之路五十五:实现类似于unittest查找case

    实现给一个路径,去查找test开头的测试用例文件 创建一个计算器的类,方便后面测试用 class Calculator(object): def add(self, x, y): return x + ...

  3. [Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop's value. Prop being

    [Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent c ...

  4. The Stream of Corning 2( 权值线段树/(树状数组+二分) )

    题意: 有两种操作:1.在[l,r]上插入一条值为val的线段 2.问p位置上值第k小的线段的值(是否存在) 特别的,询问的时候l和p合起来是一个递增序列 1<=l,r<=1e9:1< ...

  5. vue2.0---最近总结

    1.用脚手架给运维部门搞了个小东西,重新温习了一遍牛逼又方便的vue-cli. webpack的东西不必关心太多,而且webpack最近也是出了最新的4.0版本.还是改变挺多的,对一些代码的格式要求更 ...

  6. idea配置svn正确步骤(下载svn的过程就不写了)

    打开----->File------>Settings 2. 3在vcs中选择 4进入此界面 5选择 这样svn就配置好了

  7. Action.c(28): Error -27796: Failed to connect to server "xxxx": [10060] Connection timed out

    Error -27796: Failed to connect to server "125.93.51.230:8080": [10061] Connection refused ...

  8. Java常用的几个Json库,性能强势对比!

    作者:飞污熊 https://xncoding.com/2018/01/09/java/jsons.html 本篇通过JMH来测试一下Java中几种常见的JSON解析库的性能.每次都在网上看到别人说什 ...

  9. Java调用DB的存储过程

    2015/12/7 使用数据库存储过程的java代码:   try {            con = (Connection) DBProxy.getConnection(null);       ...

  10. Windows开发,关于通过写代码加载PDB的那些事

    最近,接到一个活,要写一个程序,用来批量分析一堆dll和对应的PDB, 其实工作很简单,就是根据一堆偏移,通过PDB文件,找到对应dll里面对应位置的明文符号, 简单的需求,实现起来,通常都很麻烦, ...