"UVA 1455"왕국 "분리 된 세트 정비주기", "펜윅 나무"

먼저 당신이 지켜야 할 쓸모없는 X을 축이는 계산 기하학 준수하지 않는


그럼 당신은, 단지 그의 MINY 약 MAXY와 상태를 관찰해야 하기 때문에 긴 확실히 상태를 통해 갈 것이다이 범위에 있었다 라인이 다음과 같음

그래서 우리는 범위로 추상화 각 상태를 넣을 수 있습니다

수정 작업은 두 개의 분리 된 세트에서 B 병합, 업데이트 된 모양 MAXY, MINY 및 SZ을 넣어 들어, 펜윅 나무에 간격을 수정할 수

라인에 직접 질문과 대답, 당신은 세부 사항을 이해하기 위해 코드를 볼 수 있습니다

#include <bits/stdc++.h>

#define test(...) fprintf(stderr, __VA_ARGS__)
#define dbg(x) cerr << #x << " = " << x << '\n'

using namespace std;

typedef long long ll;
typedef pair <int, int> pii;
typedef vector <int> vi;
typedef unsigned int ui;
typedef vector <pair <int, int> > edges;

const int Limit = 2000010, N = 100010;
int n, m;
int miny[N], maxy[N], sz[N], par[N];
int find_par(int x) {
    return x == par[x] ? par[x] : par[x] = find_par(par[x]);
}
struct BIT {
int c[Limit], mmax;
void position_add(int x, int v) {
    for (; x <= mmax; x += (x & -x)) c[x] += v; 
}
void add(int l, int r, int v) {
    position_add(l, v);
    position_add(r, -v);
}
int qry(int x) {
    int ans = 0; 
    for (; x; x -= (x & -x)) ans += c[x];
    return ans; 
}
}states, city;
void solve() {
    scanf ("%d", &n);
    int mmax = 0;
    for (int i = 1; i <= n; ++i) {
        int x, y;
        scanf ("%d%d", &x, &y);
        y++;
        y *= 2; 
        mmax = max(mmax, y);
        miny[i] = y;
        maxy[i] = y;
        sz[i] = 1; 
        par[i] = i;
    } 
    states.mmax = city.mmax = mmax;
    scanf ("%d", &m);
    while (m--) {
        char s[5];
        int A, B, C;
        scanf ("%s", s);
        if (s[0] == 'r') {
            scanf ("%d%d", &A, &B);
            ++A, ++B;
            int xx = find_par(A), yy = find_par(B);
            if (xx != yy) {
                int L1 = miny[xx], R1 = maxy[xx];
                int L2 = miny[yy], R2 = maxy[yy];
                states.add(L1, R1, -1);
                states.add(L2, R2, -1);
                states.add(min(L1, L2), max(R1, R2), 1);
                city.add(L1, R1, -sz[xx]);
                city.add(L2, R2, -sz[yy]);
                city.add(min(L1, L2), max(R1, R2), sz[xx] + sz[yy]);
                par[xx] = yy;
                sz[yy] += sz[xx];
                maxy[yy] = max(maxy[yy], maxy[xx]);
                miny[yy] = min(miny[yy], miny[xx]);
            //  dbg("Here");
            }
        } else if (s[0] == 'l') {
            int extra;
            scanf ("%d.%d", &C, &extra);
            C++;
            C *= 2; C++;
            printf("%d %d\n", states.qry(C), city.qry(C));
        }
    }
    for (int i = 1; i <= n; ++i) {
        if (par[i] == i)
            states.add(miny[i], maxy[i], -1), 
            city.add(miny[i], maxy[i], -sz[i]);
    }
}

int main() {
#ifdef LOCAL
    freopen("sample.in", "r", stdin);
#endif
  int tests;
  scanf ("%d", &tests);
  while (tests--) solve();
  return 0;
}

추천

출처www.cnblogs.com/LiM-817/p/12340472.html