연속 세그먼트 세그먼트 트리의 문제에 codedecision (ρm2) 범위 솔루션

설명 제목 : https://www.cnblogs.com/problems/p/P1112.html
항목 링크 : http://codedecision.com/problem/1112
세그먼트 트리 동작 범위에있어서, 세 점 정보에 대응하는 각각의 세그먼트 :

  • \ (L의 \)가 이 간격의 좌측의 점의 값을 나타내고;
  • \ (연구 \)가 이 간격의 우측의 점의 값을 나타내고;
  • \ (CNT \) :이 부분은 많은 값이이 범위를 나타냅니다.

합병의 시간 :

  • 루트 \ (L의 \)의 좌측 아들 노드 같다 \ (L의 \) 값;
  • 루트 \ (R & 중위 \)의 오른쪽 아들 노드 같다 \ (R & 중위 \) 값;
  • 루트 \ (CNT \) 값 아들의 왼쪽 달려 \ (연구 \) 값과 오른쪽 아들 \ (리터 \) 값은 동등
    1. 그런 다음, 동일한 경우 : 왼쪽 아들 \ (CNT \) + 마우스 오른쪽 아들 \ (CNT \) - (1)
    2. 그렇지 않은 경우는 다음과 같습니다 왼쪽 아들 \ (CNT \) + 마우스 오른쪽 아들 \ (CNT \)

갱신 된 경우,이주기 간격은 노드 섹션의 전체 범위를 나타내는 경우,
그 노드 \ (L의 \)\ (R & 중위 \) 업데이트 될 값으로 설정되고, 노드 (\ CNT \) 세트 1.

이 간격 작업을 포함하기 때문에, 당신은 지연 작업을 사용합니다.
다음 코드는 다음과 같습니다

#include <bits/stdc++.h>
using namespace std;
const int maxn = 100100;
struct Node {
    int l, r, cnt;
    Node () {}
    Node (int _l, int _r, int _cnt) { l = _l; r = _r; cnt = _cnt; }
} tree[maxn<<2];
int n, lazy[maxn<<2];
#define lson l, mid, rt<<1
#define rson mid+1, r, rt<<1|1
void push_up(int rt) {
    tree[rt].l = tree[rt<<1].l;
    tree[rt].r = tree[rt<<1|1].r;
    tree[rt].cnt = tree[rt<<1].cnt + tree[rt<<1|1].cnt - (tree[rt<<1].r == tree[rt<<1|1].l ? 1 : 0);
}
void push_down(int rt) {
    if (lazy[rt]) {
        lazy[rt<<1] = lazy[rt<<1|1] = lazy[rt];
        tree[rt<<1].cnt = tree[rt<<1|1].cnt = 1;
        tree[rt<<1].l = tree[rt<<1].r = tree[rt<<1|1].l = tree[rt<<1|1].r = lazy[rt];
        lazy[rt] = 0;
    }
}
void build(int l, int r, int rt) {
    if (l == r) {
        tree[rt] = Node(0, 0, 1);
        return;
    }
    int mid = (l + r) / 2;
    build(lson);
    build(rson);
    push_up(rt);
}
void update(int L, int R, int v, int l, int r, int rt) {
    if (l > r) {
        printf("fuck %d > %d (%d)\n", l, r, rt);
        return;
    }
    if (rt >= maxn*2) {
        printf("fuck rt big %d , %d (%d)\n", l, r, rt);
        return;
    }
    if (L <= l && r <= R) {
        tree[rt] = Node(v, v, 1);
        lazy[rt] = v;
        return;
    }
    push_down(rt);
    int mid = (l + r) / 2;
    if (L <= mid) update(L, R, v, lson);
    if (R > mid) update(L, R, v, rson);
    push_up(rt);
}
Node query(int L, int R, int l, int r, int rt) {
    if (L <= l && r <= R) return tree[rt];
    push_down(rt);
    int mid = (l + r) / 2;
    if (L > mid) return query(L, R, rson);
    else if (R <= mid) return query(L, R, lson);
    else {
        Node a = query(L, R, lson);
        Node b = query(L, R, rson);
        return Node(a.l, b.r, a.cnt + b.cnt - (a.r == b.l ? 1 : 0));
    }
}
int m, x, y, a;
string op;
int main() {
    cin >> n >> m;
    build(1, n, 1);
    while (m --) {
        cin >> op;
        if (op == "update") {
            cin >> x >> y >> a;
            update(x, y, a, 1, n, 1);
        }
        else {
            cin >> x >> y;
            cout << query(x, y, 1, n, 1).cnt << endl;
        }
    }
    return 0;
}

추천

출처www.cnblogs.com/codedecision/p/11785168.html