Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <cstring>
- #include <cstdlib>
- #include <cmath>
- #include <ctime>
- #include <cctype>
- #include <algorithm>
- #include <random>
- #include <bitset>
- #include <queue>
- #include <functional>
- #include <set>
- #include <map>
- #include <vector>
- #include <chrono>
- #include <iostream>
- #include <limits>
- #include <numeric>
- #define LOG(FMT...) fprintf(stderr, FMT)
- using namespace std;
- typedef long long ll;
- typedef unsigned long long ull;
- // mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
- template<class T>
- istream &operator>>(istream &is, vector<T> &v) {
- for (T &x : v)
- is >> x;
- return is;
- }
- template<class T>
- ostream &operator<<(ostream &os, const vector<T> &v) {
- if (!v.empty()) {
- os << v.front();
- for (int i = 1; i < v.size(); ++i)
- os << ' ' << v[i];
- }
- return os;
- }
- typedef pair<ll, ll> pii;
- #define x first
- #define y second
- pii operator+(const pii &lhs, const pii &rhs) { return pii(lhs.x + rhs.x, lhs.y + rhs.y); }
- pii operator-(const pii &lhs, const pii &rhs) { return pii(lhs.x - rhs.x, lhs.y - rhs.y); }
- ll operator^(const pii &lhs, const pii &rhs) { return lhs.x * rhs.x + lhs.y * rhs.y; }
- ll operator*(const pii &lhs, const pii &rhs) { return lhs.x * rhs.y - lhs.y * rhs.x; }
- int main() {
- #ifdef ELEGIA
- freopen("test.in", "r", stdin);
- int nol_cl = clock();
- #endif
- ios::sync_with_stdio(false);
- cin.tie(nullptr);
- int T;
- cin >> T;
- while (T--) {
- int n;
- cin >> n;
- vector<pii> t(n);
- for (int i = 0; i < n; ++i)
- cin >> t[i].x >> t[i].y;
- sort(t.begin(), t.end());
- vector<pii> stk;
- vector<int> vs;
- for (int i = 0; i < n; ++i) {
- if (!stk.empty() && stk.back() == t[i]) {
- vs.back() = 0;
- continue;
- }
- while (!stk.empty() && stk.back().x == t[i].x) {
- stk.pop_back();
- vs.pop_back();
- }
- while (stk.size() >= 2 && ((stk.back() - stk[stk.size() - 2]) * (t[i] - stk.back())) >= 0) {
- stk.pop_back();
- vs.pop_back();
- }
- stk.push_back(t[i]);
- vs.push_back(1);
- }
- int i = 0;
- int ans = 0;
- while (i + 1 < stk.size() && stk[i + 1].y >= stk[i].y) ++i;
- for (int j = i; j < stk.size(); ++j) ans += vs[j];
- //for (int j = i; j < stk.size(); ++j) cerr << "TAKE " << stk[j].x << ' ' << stk[j].y << '\n';
- cout << ans << '\n';
- }
- #ifdef ELEGIA
- LOG("Time: %dms\n", int ((clock()
- -nol_cl) / (double)CLOCKS_PER_SEC * 1000));
- #endif
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment