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

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

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <bitset>
  4. #include <algorithm>
  5. using namespace std;
  6. typedef long long ll;
  7. const int N = 101;
  8. const int M = 1005;
  9. bitset<M> b1[N*N], b2[N*N];
  10. int x[N], y[N], px[M], py[M];
  11. bool check(int i, int j, int k) {
  12. if(x[i] != x[j]) {
  13. double yy = (double)(y[i] - y[j]) / (x[i] - x[j]) * (x[k] - x[i]) + y[i];
  14. if(y[k] >= yy) return true;
  15. else return false;
  16. } else {
  17. if(x[k] >= x[i])return true;
  18. else return false;
  19. }
  20. }
  21. void put(bitset<M> x) {
  22. for(int i = 0; i < M; i ++) {
  23. if(x[i]) printf("%d ", i);
  24. }puts("*");
  25. }
  26. int main() {
  27. int n, m, cas = 0;
  28. while(~scanf("%d%d", &n, &m)) {
  29. for(int i = 0; i < n; i ++) {
  30. scanf("%d%d", &x[i], &y[i]);
  31. }
  32. for(int i = 0; i < m; i ++) {
  33. scanf("%d%d", &px[i], &py[i]);
  34. }
  35.  
  36. for(int i = 0; i < n; i ++) {
  37. for(int j = i+1; j < n; j ++) {
  38. for(int k = 0; k < m; k ++) {
  39. // printf("%d %d ", i, j);
  40. if(x[i] != x[j]) {
  41. double yy = (double)(y[i] - y[j]) / (x[i] - x[j]) * (px[k] - x[i]) + y[i];
  42. if(py[k] == yy) {
  43. b1[i*n+j].set(k);
  44. b2[i*n+j].set(k);
  45. }else if(py[k] > yy) {
  46. b1[i*n+j].set(k);
  47. // printf("u1-%d", k);
  48. } else {
  49. b2[i*n+j].set(k);
  50. // printf("d1-%d", k);
  51. }
  52. } else {
  53. if(px[k] == x[i]) {
  54. b1[i*n+j].set(k);
  55. b2[i*n+j].set(k);
  56. }
  57. else if(px[k] > x[i]) {
  58. b1[i*n+j].set(k);
  59. // printf("u2-%d", k);
  60. } else {
  61. b2[i*n+j].set(k);
  62. // printf("d2-%d", k);
  63. }
  64. }
  65. // puts("");
  66. }
  67. // printf(" %d %d %d %d\n", i, j, b1[i*n+j].count(), b2[i*n+j].count());
  68. }
  69. }
  70. bitset<M> tmp(0);
  71. int ans = 0;
  72. for(int i = 0; i < n; i ++) {
  73. for(int j = i+1; j < n; j ++) {
  74. for(int k = j+1; k < n; k ++) {
  75. if(check(i, j, k)) {
  76. tmp = b1[i*n+j];
  77. // printf("UU1 ");
  78. // put(b1[i*n+j]);
  79. }
  80. else {
  81. tmp = b2[i*n+j];
  82. // put(b2[i*n+j]);
  83. }
  84.  
  85. if(check(i, k, j)) {
  86. tmp &= b1[i*n+k];
  87. // printf("UU2 ");
  88. // put(b1[i*n+k]);
  89. }
  90. else {
  91. tmp &= b2[i*n+k];
  92. // put(b2[i*n+k]);
  93. }
  94.  
  95. if(check(j, k, i)) {
  96. tmp &= b1[j*n+k];
  97. // printf("UU3 ");
  98. // put(b1[j*n+k]);
  99. }
  100. else {
  101. tmp &= b2[j*n+k];
  102. // put(b2[j*n+k]);
  103. }
  104.  
  105. // printf("***%d %d %d %d\n", i, j, k, tmp.count());
  106. if(tmp.count() & 1) ans ++;
  107. }
  108. }
  109. }
  110. printf("Case %d: %d\n", ++cas, ans);
  111.  
  112. for(int i = 0; i < n*n; i ++) {
  113. b1[i].reset();
  114. b2[i].reset();
  115. }
  116. }
  117. return 0;
  118. }
  119.  
  120. /*
  121. 3 1
  122. 0 0
  123. 0 100
  124. 100 0
  125. 0 0
  126.  
  127. 3 1
  128. 0 0
  129. 0 100
  130. 100 0
  131. 50 50
  132.  
  133. 3 1
  134. 0 0
  135. 0 100
  136. 100 0
  137. 100 0
  138.  
  139. 3 1
  140. 0 0
  141. 0 100
  142. 100 0
  143. 0 -1
  144.  
  145. 4 4
  146. 0 0
  147. 0 100
  148. 100 0
  149. -2 50
  150.  
  151. 0 0
  152. 0 100
  153. 100 0
  154. -1 50
  155.  
  156. */

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. 《Linux命令行与shell脚本编程大全》 第十八章 学习笔记

    第十八章:初识sed和gawk 文本处理 sed编辑器 sed编辑器可以基于输入到命令行的或是存储在命令文本文件中的命令来处理数据流中的数据. 它每次读取一行,用提供的编辑器命令匹配数据.按命令中指定 ...

  2. Network Panel说明

    Chrome Developer Tools:Network Panel说明   官方资料:Chrome Developer Tools: Network Panel 一.chrome Develop ...

  3. 混淆器:java程序保护如何知识产权,特别提供一个java 开发的java 源代码级的混淆器

    java程序保护如何知识产权,特别提供一个java 开发的java 源代码级的混淆器 下载地址:http://yunpan.cn/QXhEcGNYLgwTD 运行方式:java -jar Encryp ...

  4. MS Project 2007 工期、工时、资源、固定单位、固定工期、固定工时

    0. 基本概念 工期:指完成每项项目任务所经历的实际时间,及开始日期和结束时期之差.Project中,工期的默认单位是天. 工时:指将任务分配给资源后,每个资源执行任务的工作时间.Project中,工 ...

  5. navicat for mysql 如何将表ID排序重1开始?

    如果是自增字段,删除数据,他是根据原来的继续往后排的 1.你可以删除这个字段,重新建立个自增字段就可以了 2.好像也可以重新设置排序起始 alter table table_name AUTO_INC ...

  6. 程序猿的量化交易之路(29)--Cointrader之Tick实体(16)

    转载需注明出处:http://blog.csdn.net/minimicall,http://cloudtrade.top Tick:什么是Tick,在交易平台中很常见,事实上就 单笔交易时某仅仅证券 ...

  7. Codeforces 474B Worms 二分法(水

    主题链接:http://codeforces.com/contest/474/problem/B #include <iostream> #include <cmath> #i ...

  8. 解决CentOS无法显示中文字体 | 系统运维 | Web2.0

    解决CentOS无法显示中文字体 | 系统运维 | Web2.0 About Me    博客园    devops    前端    张家港水蜜桃 傍晚好! 2013年09月12日 17:56:08 ...

  9. STL学习总结

    STL就是Standard Template Library,标准模板库.这可能是一个历史上最令人兴奋的工具的最无聊的术语.从根本上说,STL是一些"容器"的集合.这些" ...

  10. Selenium: 空指针error

    Error 类型:空指针 可能原因一: 只是引用了该类,但是没有对该类进行实例化(即没有New 一下),即没有给该类分配内存,所以导致空指针: 类调用前注意要实例化,否则会导致空指针错误. 首先声明D ...