fork download
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. int mx = 100000;
  6.  
  7. typedef long long ll;
  8.  
  9. #define pii pair<int,int>
  10. #define F first
  11. #define S second
  12. #define mp make_pair
  13.  
  14. vector<pair<ll,ll> > vec;
  15. bool isLeftFromPositiveDiag[1005];
  16. bool isLeftFromNegativeDiag[1005];
  17.  
  18. bool isCounterClockwise(ll x1, ll y1, ll x2 , ll y2) {
  19. ll val = x1*y2 - x2*y1;
  20. if(val == 0) {
  21. assert(0);
  22. }
  23. return val>0;
  24. }
  25.  
  26. int main() {
  27. int test;
  28. scanf("%d",&test);
  29. while(test--) {
  30. vec.clear();
  31. ll blX,blY,trX,trY;
  32. scanf("%lld %lld %lld %lld",&blX,&blY,&trX,&trY);
  33.  
  34. int n;
  35. scanf("%d",&n);
  36. if(n > 1000) {
  37. assert(0);
  38. }
  39. for(int i = 0 ; i < n ; i++) {
  40. ll x,y;
  41. scanf("%lld %lld",&x,&y);
  42. if(x <= 0 || y <= 0 || x >= mx || y >= mx) {
  43. assert(0);
  44. }
  45. vec.push_back(mp(x,y));
  46. isLeftFromPositiveDiag[i] = false;
  47. isLeftFromNegativeDiag[i] = false;
  48. }
  49. // ref point is blX,blY
  50. // ref line is blX,blY to trX,trY
  51. for(int i = 0 ; i < n ; i++) {
  52. ll x1,y1,x2,y2;
  53. x1 = trX-blX;
  54. y1 = trY-blY;
  55. x2 = vec[i].F - blX;
  56. y2 = vec[i].S - blY;
  57. isLeftFromPositiveDiag[i] = isCounterClockwise(x1,y1,x2,y2);
  58. }
  59. // ref point is trX,blY
  60. // ref line is trX,blY to blX,trY
  61. for(int i = 0 ; i < n ; i++) {
  62. ll x1,y1,x2,y2;
  63. x1 = blX-trX;
  64. y1 = trY-blY;
  65. x2 = vec[i].F - trX;
  66. y2 = vec[i].S - blY;
  67. isLeftFromNegativeDiag[i] = isCounterClockwise(x1,y1,x2,y2);
  68. }
  69. int lft, up , rht , down;
  70. lft = up = rht = down = 0;
  71.  
  72. for(int i = 0 ; i < n ; i++) {
  73. if (isLeftFromPositiveDiag[i] == true && isLeftFromNegativeDiag[i] == true ) {
  74. lft++;
  75. }
  76. else if (isLeftFromPositiveDiag[i] == true && isLeftFromNegativeDiag[i] == false ) {
  77. up++;
  78. }
  79. else if (isLeftFromPositiveDiag[i] == false && isLeftFromNegativeDiag[i] == false ) {
  80. rht++;
  81. }
  82. else {
  83. down++;
  84. }
  85. }
  86. assert(lft+up+rht+down == n);
  87. printf("%d %d %d %d\n",lft,up,rht,down);
  88. }
  89. }
  90.  
Success #stdin #stdout 0.01s 5476KB
stdin
1
0 0 20 10
6
3 6
10 3
12 5
14 6
1 2
19 6
stdout
2 0 3 1