枚举直线,对于直线的某个点在直线的左端还是右端,能够状压出一个数。用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. SilkTest Q&A 11

    101. 如何从其他的机器访问脚本? 答案:将包含脚本的文件夹共享出来…非常简单…你可以使用connect()在你本机运行脚本从而使得它们在其他的一些机器上执行…但是其他人无法访问这些脚本,除非你将它 ...

  2. 使用RNSwipeViewController类库进行视图切换

    如今很多应用已经不再局限于点击按钮触发事件来进行视图之间切换,为迎合给予用户更好体验,体现iOS系统极佳用户体验,使用手势来进行各个视图之间切换,用户至于一个大拇指在屏幕中央就可浏览到很多信息: 关于 ...

  3. VC/MFC 当鼠标移到控件上时显示提示信息

    VC/MFC 当鼠标移到控件上时显示提示信息 ToolTip是Win32中一个通用控件,MFC中为其生成了一个类CToolTipCtrl,总的说来其使用方法是较简单的,下面讲一下它的一般用法和高级用法 ...

  4. [置顶] dubbo管理控制台安装

    dubbo管理控制台开源部分主要包含:路由规则,动态配置,服务降级,访问控制,权重调整,负载均衡,等管理功能. 1.下载dubbo 地址:http://code.alibabatech.com/mvn ...

  5. ecshop 微信支付插件

    眼下已完毕支付測试,可以支付成功,支付逻辑自己实现.后台通知.发货通知.订单查询未測. 当中用到了redis 下载

  6. uva Matrix Decompressing (行列模型)

    Matrix Decompressing 题目:    给出一个矩阵的前i行,前j列的和.要求你求出满足的矩阵. 矩阵的数范围在[1,20].   一開始就坑在了这里.没读细致题目. 囧...   事 ...

  7. extern 使用方法具体解释

    在C语言中,修饰符extern用在变量或者函数的声明前,用来说明"此变量/函数是在别处定义的.要在此处引用".(extern能够置于变量或者函数前,以标示变量或者函数的定义在别的文 ...

  8. 打造你自己ajax上传图片

    今天,我们需要的图片上传插件,但是,互联网不提供符合他们的需要和易于使用的.所以我写了自己. 方法1,只使用jquery代码,.代码例如以下 <p> <label>上传图片&l ...

  9. 看来IT技术与军事技术都是相通的——都是对新事物极为敏感的领域

    这是读到这段时候的感想: 和海军中那些狂热的相信“皇军不可战胜”的大舰巨炮主义者们不同,山口对于与美国开战的主张是持坚定的反对态度的,和山本五十六都做过日本驻美武官的山口都认为一旦与美开战,日本或许能 ...

  10. C++ Primer 学习笔记_61_重载操作符与转换 --自增/自减操作符

    重载操作符与转换 --自增/自减操作符 引言: 自增,自减操作符常常由诸如迭代器这种类实现,这种类提供相似于指针的行为来訪问序列中的元素.比如,能够定义一个类,该类指向一个数组并为该数组中的元素提供訪 ...