Codeforces 350D(计算几何)
要点
- 用A、B、C一般式确定每条直线
- 将合法的圆心中点存到每条直线所属的vector中
- 枚举所有线段,二分后\(O(1)\)得到其中存在多少答案,累加
#include <cstdio>
#include <cmath>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <iomanip>
#include <vector>
#include <unordered_map>
using namespace std;
typedef long long ll;
const int maxn = 3e5 + 5, maxm = 1550;
const ll inf = 1e18;
struct Point {
ll x, y;
Point() {}
Point(ll a, ll b):x(a), y(b) {}
};
struct Circle {
Point p;
ll r;
Circle() {}
Circle(Point a, ll b):p(a), r(b) {}
};
int n, m, hashcnt;
Point a[maxn], b[maxn];//segments
Circle c[maxm];//circles
unordered_map<ll, int> mp;//<{A, B, C}, id>
vector<ll> v[maxn];//v[id]
ll A, B, C;//a few times used
ll ans;
int ID[maxn];
ll sqr(ll x) {
return x * x;
}
ll dis(int i, int j) {//distance ^ 2
return sqr(c[i].p.x - c[j].p.x) + sqr(c[i].p.y - c[j].p.y);
}
ll gcd(ll a, ll b) {//exist zero: return
if (!a || !b) return a + b;
return gcd(b, a % b);
}
ll Cross(Point A, Point B) {
return A.x * B.y - A.y * B.x;
}
void Deal(ll &A, ll &B, ll &C) {//unique the line
ll q = gcd(gcd(abs(A), abs(B)), abs(C));
A /= q, B /= q, C /= q;
if (A == 0 && B < 0) B = -B, C = -C;
else if (A < 0) A = -A, B = -B, C = -C;
}
ll hashi(ll A, ll B, ll C) {//map is TLE, so I hash it
return A * (ll)(1e12) + B * (ll)(1e6) + C;
}
void Hash(int i, ll A, ll B, ll C) {
ll d = hashi(A, B, C);
if (!mp.count(d)) {
mp[d] = ++hashcnt;
}
int id = mp[d];
ID[i] = id;
}
void calc(Point a, Point b) {// get A, B, C
A = b.y - a.y, B = a.x - b.x;
C = Cross(b, a);//Ax + By + C = 0
Deal(A, B, C);
}
int main() {
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++) {
scanf("%lld %lld %lld %lld", &a[i].x, &a[i].y, &b[i].x, &b[i].y);
a[i].x *= 2, a[i].y *= 2, b[i].x *= 2, b[i].y *= 2;//for line 99
if (a[i].x > b[i].x) swap(a[i], b[i]);//for line 109 & 110
calc(a[i], b[i]);
Hash(i, A, B, C);
}
for (int i = 1; i <= m; i++) {
scanf("%lld %lld %lld", &c[i].p.x, &c[i].p.y, &c[i].r);
c[i].p.x *= 2, c[i].p.y *= 2, c[i].r *= 2;
for (int j = 1; j < i; j++)
if (c[i].r == c[j].r && dis(i, j) > 4LL * sqr(c[i].r)) {//if eyes
calc(c[i].p, c[j].p);
ll A1 = B * 2, B1 = -A * 2;
ll C1 = A * (c[i].p.y + c[j].p.y) - B * (c[i].p.x + c[j].p.x);
Deal(A1, B1, C1);
ll d = hashi(A1, B1, C1);
if (!mp.count(d)) continue;
ll x = (c[i].p.x + c[j].p.x) / 2;//line 99: should avoid double
v[mp[d]].emplace_back(x);
}
}
for (int i = 1; i <= hashcnt; i++) {
v[i].emplace_back(inf);
sort(v[i].begin(), v[i].end());
}
for (int i = 1; i <= n; i++) {
int id = ID[i];
int l = lower_bound(v[id].begin(), v[id].end(), a[i].x) - v[id].begin();//line 109
int r = upper_bound(v[id].begin(), v[id].end(), b[i].x) - v[id].begin();//line 110
ans += r - l;
}
return !printf("%lld\n", ans);
}
Codeforces 350D(计算几何)的更多相关文章
- Codeforces Gym100543B 计算几何 凸包 线段树 二分/三分 卡常
原文链接https://www.cnblogs.com/zhouzhendong/p/CF-Gym100543B.html 题目传送门 - CF-Gym100543B 题意 给定一个折线图,对于每一条 ...
- Codeforces Round #335 (Div. 1) C. Freelancer's Dreams 计算几何
C. Freelancer's Dreams Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.codeforces.com/contes ...
- Codeforces 749B:Parallelogram is Back(计算几何)
http://codeforces.com/problemset/problem/749/B 题意:已知平行四边形三个顶点,求另外一个顶点可能的位置. 思路:用向量来做. #include <c ...
- Codeforces Round #339 (Div. 1) A. Peter and Snow Blower 计算几何
A. Peter and Snow Blower 题目连接: http://www.codeforces.com/contest/613/problem/A Description Peter got ...
- Codeforces Round #524 (Div. 2) C. Masha and two friends(思维+计算几何?)
传送门 https://www.cnblogs.com/violet-acmer/p/10146350.html 题意: 有一块 n*m 的棋盘,初始,黑白块相间排列,且左下角为白块. 给出两个区间[ ...
- Codeforces 528E Triangles 3000 - 计算几何
题目传送门 传送点I 传送点II 传送点III 题目大意 给定$n$的平面上的直线,保证没有三条直线共点,两条直线平行.问随机选出3条直线交成的三角形面积的期望. 显然$S=\frac{1}{2}ah ...
- Codeforces Round #284 (Div. 1) A. Crazy Town 计算几何
A. Crazy Town 题目连接: http://codeforces.com/contest/498/problem/A Description Crazy Town is a plane on ...
- Codeforces Round #357 (Div. 2) E. Runaway to a Shadow 计算几何
E. Runaway to a Shadow 题目连接: http://www.codeforces.com/contest/681/problem/E Description Dima is liv ...
- Codeforces Beta Round #1 C. Ancient Berland Circus 计算几何
C. Ancient Berland Circus 题目连接: http://www.codeforces.com/contest/1/problem/C Description Nowadays a ...
随机推荐
- bzoj 3012: [Usaco2012 Dec]First! Trie+拓扑排序
题目大意: 给定n个总长不超过m的互不相同的字符串,现在你可以任意指定字符之间的大小关系.问有多少个串可能成为字典序最小的串,并输出这些串.n <= 30,000 , m <= 300,0 ...
- tarjian求lca
看了好多dalao的博客,就总结一下啦ovo tarjian算法很是神奇,它的作用是求lca.它是一种离线算法. 在线是指输入一个询问输出一个结果. 离线是将询问一次性输入,一起处理. tarjan它 ...
- bzoj 2096 [POI2004]ZAW——二进制枚举
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2069 可以把直接相连的点分成 从1点出的一部分 和 走向1点的一部分.多起点最短路就和 ...
- git常见使用情境整理
一.版本回退 回退到某个commit版本的方法如下: 1. 查看commit历史 git log 找到想要回退的版本的号码,eg:f765889 2. 回退到该版本 git reset f765889 ...
- office2016_windows永久激活查看方法
YC7N8-G7WR6-9WR4H-6Y2W4-KBT6X 首先要保证你安装了 百云址:http://pan.baidu.com/share/home?uk=4011207371 如果你是win8,w ...
- java代码JFrame练习
总结: package com.da; import java.awt.Button; import java.awt.Color; import java.awt.FlowLayout; impor ...
- telnet IP:ERROR
实验环境:CentOS6.8 主机:172.16.xxx.xxx:80 客户端:172.16.xxx.xxx [root@www ~18:32:27]#telnet 172.16.xxx.xxx 80 ...
- TP5隐藏url中的index.php
在public文件夹下,有个.htacess文件,没有则新建一个, 如果已有这个文件,原文件内容如下: <IfModule mod_rewrite.c> Options +FollowSy ...
- js数组与 json 的区别
一,数组 1. 定义一维数组:var s1=new Array(); s1=[1,2,3,4]或者s1[0]=1,s1[1]=2,s1[3]=3,s1[4]=4; alert(s1[0]); 结果为1 ...
- IO系列之File
1 File类 1.1 目录列表器 在这里我主要是参考Think in Java的内容从而做的一些总结以及扩展.Java中的IO流的设计应该说是Java中最经典的,最学院式的设计,包括它的整体架构设计 ...