Mayor's posters poj2528 线段树

来源:互联网 发布:端口占用解决方法 编辑:程序博客网 时间:2024/06/06 05:11

Description


给定一些区间和这些区间的标号,新的区间会覆盖旧的,求最多看见多少不同的区间

Solution


嗯我也搞不懂为什么要刷水题但是就是刷了

Code


#include <stdio.h>#include <string.h>#include <vector>#include <algorithm>#define rep(i, st, ed) for (int i = st; i <= ed; i += 1)#define fill(x, t) memset(x, t, sizeof(x))#define N 100001struct node{int l, r, c;}t[N * 5 + 1];struct data{int x, index;};int bct[N], q[N];inline int read(){    int x = 0, v = 1;    char ch = getchar();    while (ch < '0' || ch > '9'){        if (ch == '-'){            v = -1;        }        ch = getchar();    }    while (ch >= '0' && ch <= '9'){        x = (x << 1) + (x << 3) + ch - '0';        ch = getchar();    }    return x * v;}inline void modify(int now, int l, int r, int v){    if (l == t[now].l && r == t[now].r){        t[now].c = v;    }else{        if (t[now].c){            t[now * 2].c = t[now * 2 + 1].c = t[now].c;            t[now].c = 0;        }        int mid = (t[now].l + t[now].r) >> 1;        if (r <= mid){            modify(now * 2, l, r, v);        }else if (l > mid){            modify(now * 2 + 1, l, r, v);        }else{            modify(now * 2, l, mid, v);            modify(now * 2 + 1, mid + 1, r, v);        }    }}inline void query(int now){    if (t[now].c){        bct[t[now].c] = 1;    }else{        if (t[now].l == t[now].r){            return;        }        query(now * 2);        query(now * 2 + 1);    }}inline void build(int now, int l, int r){    t[now] = (node){l, r};    if (l == r){        return;    }    int mid = (t[now].l + t[now].r) >> 1;    build(now * 2, l, mid);    build(now * 2 + 1, mid + 1, r);}inline int cmp(data a, data b){    return a.x < b.x;}using std:: vector;int main(void){    int T = read();    while (T --){        vector<data> v;        int n = read();        rep(i, 1, n){            int l = read(), r = read();            v.push_back((data){l, i * 2 - 1});            v.push_back((data){r, i * 2});        }        std:: sort(v.begin(), v.end(), cmp);        int cnt = 1;        q[v[0].index] = 1;        rep(i, 1, v.size() - 1){            if (v[i].x != v[i - 1].x){                cnt += 1;            }            q[v[i].index] = cnt;        }        build(1, 1, v.size());        rep(i, 1, n){            modify(1, q[i * 2 - 1], q[i * 2], i);        }        fill(bct, 0);        query(1);        int ans = 0;        rep(i, 1, n){            if (bct[i]){                ans += 1;            }        }        printf("%d\n", ans);    }    return 0;}
1 0
原创粉丝点击