Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <vector>
- #include <algorithm>
- using namespace std;
- const int MAX = 2560;
- typedef unsigned int ui;
- ui s[MAX][MAX/32];
- inline ui popcount(ui x) {
- ui count;
- for (count=0; x; count++)
- x &= x-1;
- return count;
- }
- class TrianglesContainOrigin
- {
- public:
- long long count(vector <int> x, vector <int> y)
- {
- ui i, j, k, N = x.size();
- vector <pair <int, int> > p(N);
- for (i=0; i<N; i++)
- p[i] = make_pair(x[i], y[i]);
- sort(p.begin(), p.end());
- for (i=0; i<N; i++)
- for (j=i+1; j<N; j++)
- if (p[j].second * p[i].first > p[i].second * p[j].first)
- s[i][j>>5] |= (1 << (j&31));
- long long ans = 0;
- for (i=0; i<N-2; i++) {
- for (j=i+1; j<N-1; j++) {
- ui bit = (1<<(j&31));
- ui up = (s[i][j>>5] & bit);
- ui mask = 0xFFFFFFFF - (bit-1);
- for (k=j>>5; k<(N>>5)+1; k++) {
- ui t = up ? (s[j][k] & (s[i][k]^mask)) : (s[i][k] & (s[j][k]^mask));
- ans += popcount(t);
- mask = 0xFFFFFFFF;
- }
- }
- }
- return ans;
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement