Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include "bits/stdc++.h"
- //#include "geometry.h"
- //#include "data_structure.h"
- using namespace std;
- using namespace chrono;
- #define all(a) a.begin(), a.end()
- #define allr(a) a.rbegin(), a.rend()
- #define sqrt(x) sqrtl(x)
- mt19937 rnd(std::chrono::high_resolution_clock::now().time_since_epoch().count());
- typedef long long ll;
- typedef double ld;
- struct dsu {
- vector<ll> p, siz;
- dsu(ll n) {
- p.resize(n), siz.resize(n);
- for (ll i = 0; i < n; i++) {
- p[i] = i;
- siz[i] = 1;
- }
- }
- ll find(ll v) {
- if (v == p[v]) {
- return v;
- }
- return p[v] = find(p[v]);
- }
- void union_set(ll a, ll b) {
- a = find(a);
- b = find(b);
- if (a == b) {
- return;
- }
- else {
- if (siz[a] < siz[b]) {
- swap(a, b);
- }
- p[b] = a;
- siz[a] += siz[b];
- }
- }
- };
- vector<pair<ll,ll>> merge(dsu &U,vector<pair<ll,ll>> a, vector<pair<ll,ll>> b) {
- vector<pair<ll,ll>> res;
- ll i = 0;
- ll j = 0;
- while (i < a.size() && j < b.size()) {
- if (a[i].first <= b[j].first) {
- res.push_back(a[i++]);
- }
- else {
- for (ll k = i; k < a.size(); k++) {
- U.union_set(a[k].second, b[j].second);
- }
- res.push_back(b[j++]);
- }
- }
- while (i < a.size())
- res.push_back(a[i++]);
- while (j < b.size())
- res.push_back(b[j++]);
- return res;
- }
- vector<pair<ll,ll>> msort(dsu &U,vector<pair<ll,ll>> a) {
- if (a.size() <= 1)
- return a;
- ll k = a.size() / 2;
- return merge(U,
- msort(U,vector<pair<ll,ll>>(a.begin(), a.begin() + k)),
- msort(U,vector<pair<ll,ll>>(a.begin() + k, a.end())));
- }
- signed main() {
- #ifdef _DEBUG
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #endif
- srand(time(NULL));
- ios_base::sync_with_stdio(false);
- cin.tie(nullptr);
- cout.tie(nullptr);
- ll t;
- cin >> t;
- while (t--) {
- ll n;
- cin >> n;
- vector<pair<ll,ll>> a(n);
- dsu U(n);
- for (ll i = 0; i < n; i++) {
- cin >> a[i].first;
- a[i].second = i;
- }
- msort(U, a);
- set<ll> f;
- for (ll i = 0; i < n; i++) {
- f.insert(U.find(i));
- }
- cout << f.size() << endl;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement