「几何」[USACO12DEC]疯狂的栅栏Crazy Fences
时间:2019-09-13
本文章向大家介绍「几何」[USACO12DEC]疯狂的栅栏Crazy Fences,主要包括「几何」[USACO12DEC]疯狂的栅栏Crazy Fences使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
[USACO12DEC]疯狂的栅栏Crazy Fences
题目链接:[USACO12DEC]疯狂的栅栏Crazy Fences
题目大意
给你\(n\)个坐标,每个坐标包含四个位置信息 \(x_1,y_1,x_2,y_2\) 然后\(x_1,y_1\) 与 \(x_2, y_2\)通过一条直线连接,再给你 \(m\) 个坐标,每个坐标两个字母\(x_1, y_1\)分别代表牛的位置,每两头牛如果不通过直线能相互到达,那么就说明这两头牛在一个社区,现在求一个社区的最大奶牛数。
题目题解
想了爆搜,看了下数据范围,啊,没了没了,然后洛谷上没有题解,去USACO上找题解
题解在这里:题解
这个题解的代码 quq太TM难看了,写了半天发现有些思路都不知道他是怎么想的,那就直接copy吧
这个题的总体思路还算简单,如果当前由当前点从某一个方向上释放一条直线,直线通过图上的直线的次数是奇数就说明肯定在多边形内,如果是偶数,就说明在多边形外,然后对于每个多边形我们考虑图形内奶牛可以交互,这里可以排序嘛,以\(x\)从小到大排序,考虑前后奶牛是否能够交互即可(关于最终判断,有些问题没有捋清楚,如果有dalao知道,可以在下面留言ing)
代码如下
#include <cstdio>
#include <map>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
#define NFENCES_MAX 1005
#define NCOWS_MAX 1005
bool rayHits(long long cx, long long cy, long long f1x, long long f1y, long long f2x, long long f2y) {
if ((f1y > cy) ^ (f2y > cy)) {
return (f1y - f2y < 0) ^ (f2x * (f1y - cy) + f1x * (cy - f2y) > cx * (f1y - f2y));
} else return false;
}
map<pair<int,int>, vector<int> > pointMap;
pair<pair<int,int>, pair<int,int> > fences[NFENCES_MAX];
int cycle[NFENCES_MAX];
char parities[NCOWS_MAX][NFENCES_MAX];
char* parityptrs[NCOWS_MAX];
inline bool ptrcmp(char* a, char* b) {
return strcmp(a, b) < 0;
}
int main() {
int nFences, nCows;
scanf("%d", &nFences);
scanf("%d", &nCows);
for (int i = 0; i < nFences; i++) {
pair<int,int> p1, p2;
scanf("%d", &p1.first);
scanf("%d", &p1.second);
scanf("%d", &p2.first);
scanf("%d", &p2.second);
pointMap[p1].push_back(i);
pointMap[p2].push_back(i);
fences[i] = pair<pair<int,int>, pair<int,int> >(p1, p2);
cycle[i] = -1;
memset(parities[i], 0, nCows);
}
for (int i = 0; i < nCows; i++) {
parityptrs[i] = parities[i];
}
int nCycles = 0;
for (int i = 0; i < nFences; i++) {
if (cycle[i] == -1) {
int j = i;
pair<int,int> last = fences[i].first;
do {
cycle[j] = nCycles;
last = fences[j].first == last ? fences[j].second : fences[j].first;
vector<int> const& v = pointMap[last];
j = (v[0] == j ? v[1] : v[0]);
} while (j != i);
nCycles++;
}
}
for (int i = 0; i < nCows; i++) {
int cowx, cowy;
scanf("%d", &cowx);
scanf("%d", &cowy);
for (int j = 0; j < nFences; j++) {
parities[i][cycle[j]] ^= (char)rayHits(cowx, cowy, fences[j].first.first, fences[j].first.second, fences[j].second.first, fences[j].second.second);
}
for (int j = 0; j < nCycles; j++) {
parities[i][j] = parities[i][j] ? '1' : '0';
}
parities[i][nCycles] = '\0';
}
sort(parityptrs, parityptrs + nCows, ptrcmp);
int maxans = 0;
int curcount = 0;
for (int i = 0; i < nCows; i++) {
if (i == 0 || strcmp(parityptrs[i], parityptrs[i-1]) != 0) {
curcount = 1;
} else {
curcount++;
}
maxans = max(maxans, curcount);
}
printf("%d\n", maxans);
}
原文地址:https://www.cnblogs.com/Nicoppa/p/11516378.html
- 零基础学编程015:画些有趣的图案
- Spring boot with Thymeleaf
- 零基础学编程014:小海龟做画
- Springboot @RequestBody 传递 List
- 零基础学编程013:import让你飞起来
- 【教程】利用Tensorflow目标检测API确定图像中目标的位置
- 零基础学编程012:画出复利曲线图
- OpenAI发布高度优化的GPU计算内核—块稀疏GPU内核
- SQL SERVER 原来还可以这样玩 FOR XML PATH
- 零基础学编程011:复利数据表问题(总结)
- 一个小程序引发的思考
- 深入内核:DUMP Block的数据读取与脏数据写入影响
- 零基础学编程010:最终可以输出完整的复利数据表了
- 在C#使用文件监控对象FileSystemWatcher 实现数据同步
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- c语言之条件编译
- python之使用魔术方法__getitem__和__len__
- B+Tree index structures in InnoDB(7.InnoDB中B+树的索引结构)
- Java基础
- 广度优先遍历--选课的智慧
- paddlepaddle目标检测之水果检测(yolov3_mobilenet_v1)
- 【每日一题】41. First Missing Positive
- springmvc之第一个springmvc程序
- python小例子(一)
- springmvc之RequestMapping注解既可以修饰类也可以修饰方法
- hadoop伪分布式之配置历史服务器
- 广度优先遍历--合法的括号
- hadoop伪分布式之配置日志聚集
- Kettle构建Hadoop ETL实践(二):安装与配置
- WKWebView加载沙盒HTML