枚举直线,对于直线的某个点在直线的左端还是右端,能够状压出一个数。用bitset记录。

然后三角形就是3个bitset&一下

#include <cstdio>
#include <cstring>
#include <bitset>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 101;
const int M = 1005;
bitset<M> b1[N*N], b2[N*N];
int x[N], y[N], px[M], py[M];
bool check(int i, int j, int k) {
if(x[i] != x[j]) {
double yy = (double)(y[i] - y[j]) / (x[i] - x[j]) * (x[k] - x[i]) + y[i];
if(y[k] >= yy) return true;
else return false;
} else {
if(x[k] >= x[i])return true;
else return false;
}
}
void put(bitset<M> x) {
for(int i = 0; i < M; i ++) {
if(x[i]) printf("%d ", i);
}puts("*");
}
int main() {
int n, m, cas = 0;
while(~scanf("%d%d", &n, &m)) {
for(int i = 0; i < n; i ++) {
scanf("%d%d", &x[i], &y[i]);
}
for(int i = 0; i < m; i ++) {
scanf("%d%d", &px[i], &py[i]);
} for(int i = 0; i < n; i ++) {
for(int j = i+1; j < n; j ++) {
for(int k = 0; k < m; k ++) {
// printf("%d %d ", i, j);
if(x[i] != x[j]) {
double yy = (double)(y[i] - y[j]) / (x[i] - x[j]) * (px[k] - x[i]) + y[i];
if(py[k] == yy) {
b1[i*n+j].set(k);
b2[i*n+j].set(k);
}else if(py[k] > yy) {
b1[i*n+j].set(k);
// printf("u1-%d", k);
} else {
b2[i*n+j].set(k);
// printf("d1-%d", k);
}
} else {
if(px[k] == x[i]) {
b1[i*n+j].set(k);
b2[i*n+j].set(k);
}
else if(px[k] > x[i]) {
b1[i*n+j].set(k);
// printf("u2-%d", k);
} else {
b2[i*n+j].set(k);
// printf("d2-%d", k);
}
}
// puts("");
}
// printf(" %d %d %d %d\n", i, j, b1[i*n+j].count(), b2[i*n+j].count());
}
}
bitset<M> tmp(0);
int ans = 0;
for(int i = 0; i < n; i ++) {
for(int j = i+1; j < n; j ++) {
for(int k = j+1; k < n; k ++) {
if(check(i, j, k)) {
tmp = b1[i*n+j];
// printf("UU1 ");
// put(b1[i*n+j]);
}
else {
tmp = b2[i*n+j];
// put(b2[i*n+j]);
} if(check(i, k, j)) {
tmp &= b1[i*n+k];
// printf("UU2 ");
// put(b1[i*n+k]);
}
else {
tmp &= b2[i*n+k];
// put(b2[i*n+k]);
} if(check(j, k, i)) {
tmp &= b1[j*n+k];
// printf("UU3 ");
// put(b1[j*n+k]);
}
else {
tmp &= b2[j*n+k];
// put(b2[j*n+k]);
} // printf("***%d %d %d %d\n", i, j, k, tmp.count());
if(tmp.count() & 1) ans ++;
}
}
}
printf("Case %d: %d\n", ++cas, ans); for(int i = 0; i < n*n; i ++) {
b1[i].reset();
b2[i].reset();
}
}
return 0;
} /*
3 1
0 0
0 100
100 0
0 0 3 1
0 0
0 100
100 0
50 50 3 1
0 0
0 100
100 0
100 0 3 1
0 0
0 100
100 0
0 -1 4 4
0 0
0 100
100 0
-2 50 0 0
0 100
100 0
-1 50 */

HDU 4380 Farmer Greedy 计算几何+bitset的更多相关文章

  1. HDU 4380 Farmer Greedy(叉积和三角形知识的综合应用)

    题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=115760#problem/A 题目意思大致为由n个点(n小于100)和m个金矿 ...

  2. HDU 5130 Signal Interference(计算几何 + 模板)

    HDU 5130 Signal Interference(计算几何 + 模板) 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5130 Descripti ...

  3. HDU 5979 Convex【计算几何】 (2016ACM/ICPC亚洲区大连站)

    Convex Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Subm ...

  4. HDU 4063 Aircraft(计算几何)(The 36th ACM/ICPC Asia Regional Fuzhou Site —— Online Contest)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4063 Description You are playing a flying game. In th ...

  5. hdu 1348:Wall(计算几何,求凸包周长)

    Wall Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  6. hdu 1174:爆头(计算几何,三维叉积求点到线的距离)

    爆头 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submissi ...

  7. 2017多校第5场 HDU 6085 Rikka with Candies bitset

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6085 题意:存在两个长度为n,m的数组A,B.有q个询问,每个询问有一个数字k,可以得到Ai%Bj=k ...

  8. HDU 4920 Matrix multiplication(bitset)

    HDU 4920 Matrix multiplication 题目链接 题意:给定两个矩阵,求这两个矩阵相乘mod 3 思路:没什么好的想法,就把0的位置不考虑.结果就过了.然后看了官方题解,上面是用 ...

  9. hdu 4631Sad Love Story<计算几何>

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=4631 题意:依次给你n个点,每次求出当前点中的最近点对,输出所有最近点对的和: 思路:按照x排序,然后用s ...

随机推荐

  1. 【Demo 0003】Android 事件

    本章学习要点:        1.  了解Android中资源用途:        2.  掌握资源使用通用规则:        3.  掌握具体资源使用方法;

  2. ie 64bit调用activex控件

    1,首先,这是可能的.不要被网上一堆ie64调不了activex控件的文章误导了.flash就是一个现成的例子,flash支持ie64. 2,ie64只能调用64bit的activex控件.网上那些说 ...

  3. Swift - 列表项尾部附件点击响应(感叹号,箭头等)

    列表单元格尾部可以添加各种样式的附件,如感叹号,三角箭头等.而且点击内容区域与点击附件的这两个响应事件是不同的,这样可以方便我们实现不同的功能(比如点击内容则查看详情,点击感叹号则编辑) 1 2 3 ...

  4. ThinkPhp学习05

    原文:ThinkPhp学习05 一.ThinkPHP 3 的CURD介绍  (了解)二.ThinkPHP 3 读取数据    (重点) 对数据的读取 Read $m=new Model('User') ...

  5. PropertyPlaceholderConfigurer类的使用注意

    如果你在spring的applicationcontext.xml中需要使用属性配置文件,那PropertyPlaceholderConfigurer这个类就是必须的. <bean class= ...

  6. linux串口编程总结

    串口本身.标准和硬件 † 串口是计算机上的串行通讯的物理接口.计算机历史上,串口以前被广泛用于连接计算机和终端设备和各种外部设备.尽管以太网接口和USB接口也是以一个串行流进行数据传送的.可是串口连接 ...

  7. html浏览器兼容性的 JavaScript语法

    1.      在FireFox中能够使用与HTML节点对象ID属性值同样的JS变量名称.可是IE中不行. 解决的方法:在命名上区分HTML节点对象ID属性值和JS变量 2.      IE不支持JS ...

  8. uva 1151 - Buy or Build poj 2784 Buy or Build(最小生成树)

    最小生成树算法简单 只是增加了一些新的东西,对于需要最小生成树算法 和中 并检查使用的一系列 还有一些更深入的了解. 方法的一些复杂问题 #include<cstdio> #include ...

  9. jvm调优经验分享

    当Java程序申请内存,超出VM可分配内纯的时候,VM首先可能会GC,假设GC完还是不够,或者申请的直接超够VM可能有的,就会抛出内 存溢出异常.从VM规范中我们能够得到,一下几种异常. java.l ...

  10. Android万能适配器base-adapter-helper的源代码分析

    项目地址:https://github.com/JoanZapata/base-adapter-helper 1. 功能介绍 1.1. base-adapter-helper base-adapter ...