Advertisement
Guest User

SRM641 Div1 250

a guest
Dec 11th, 2014
307
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.08 KB | None | 0 0
  1. #include <vector>
  2. #include <algorithm>
  3. using namespace std;
  4.  
  5. const int MAX = 2560;
  6. typedef unsigned int ui;
  7. ui s[MAX][MAX/32];
  8.  
  9. inline ui popcount(ui x) {
  10.     ui count;
  11.     for (count=0; x; count++)
  12.         x &= x-1;
  13.     return count;
  14. }
  15.  
  16. class TrianglesContainOrigin
  17. {
  18. public:
  19.   long long count(vector <int> x, vector <int> y)
  20.   {
  21.     ui i, j, k, N = x.size();
  22.     vector <pair <int, int> > p(N);
  23.     for (i=0; i<N; i++)
  24.       p[i] = make_pair(x[i], y[i]);
  25.     sort(p.begin(), p.end());
  26.  
  27.     for (i=0; i<N; i++)
  28.       for (j=i+1; j<N; j++)
  29.         if (p[j].second * p[i].first > p[i].second * p[j].first)
  30.            s[i][j>>5] |= (1 << (j&31));
  31.  
  32.     long long ans = 0;
  33.     for (i=0; i<N-2; i++) {
  34.       for (j=i+1; j<N-1; j++) {
  35.         ui bit = (1<<(j&31));
  36.         ui up = (s[i][j>>5] & bit);
  37.         ui mask = 0xFFFFFFFF - (bit-1);
  38.         for (k=j>>5; k<(N>>5)+1; k++) {
  39.           ui t = up ? (s[j][k] & (s[i][k]^mask)) : (s[i][k] & (s[j][k]^mask));
  40.           ans += popcount(t);
  41.           mask = 0xFFFFFFFF;
  42.         }
  43.       }
  44.     }
  45.     return ans;
  46.   }
  47. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement