poj2528 Mayor's posters (segment tree + discretization)

Well, this interval is quite large and needs to be discretized. If TLE, also need to optimize the constant.

AC code

#include <stdio.h>
#include <string.h>
#include <map>
#include <set>
#include <algorithm>
using namespace std;
const int maxn = 40000+5;
typedef pair<int, int> Pii;
Pii a[10000 + 5];
int b[maxn], vis[10000+5], c[maxn];

int setv[maxn << 2];

void buildTree(int o, int l, int r) {
    setv[o] = -1;
    if(l < r) {
        int m = (l+r) / 2;
        buildTree(o*2, l, m);
        buildTree(o*2+1, m+1, r);
    }
}

void pushDown(int o) {
    int lc = o*2, rc = o*2+1;
    if(setv[o] != -1) {
        setv[lc] = setv[rc] = setv[o];
    }
    setv[o] = -1;
}

int ul, ur;
void update(int o, int l, int r, int v) {
    if(ul <= l && r <= ur) {
        setv[o] = v;
    } else {
        pushDown(o);
        int m = (l+r) / 2;
        if(ul <= m)
            update(o*2, l, m, v);
        if(m < ur)
            update(o*2+1, m+1, r, v);
    }
}

void query(int o) {
    if(setv[o] != -1) {
        vis [setv [o]] = 1 ;
        return ;
    }
    query(o * 2 );
    query(o * 2 + 1 );
}

int main() {
    int T, n;
    scanf("%d", &T);
    while(T--) {
        scanf("%d", &n);
        for(int i = 0; i < n; i++) {
            scanf("%d%d", &a[i].first, &a[i].second);
            b[i*2] = a[i].first;
            b[i*2+1] = a[i].second;
        }
        sort(b, b+2*n);
        int cnt = 0;
        c[0] = b[0];
        cnt = 1;
        for(int i = 1; i < 2*n; i++) {
            if(b[i] == b[i-1]) continue;
            if(b[i] - b[i-1] > 1) 
                c[cnt++] = b[i-1] + 1;
            c[cnt++] = b[i];
        }
        buildTree(1, 1, cnt);
        for(int i = 0; i < n; i++) {
            ul = lower_bound(c, c+cnt, a[i].first) - c + 1;
            ur = lower_bound(c, c+cnt, a[i].second) - c + 1;
            update(1, 1, cnt, i);
        }
        memset(vis, 0, sizeof(vis));
        query(1);
        int ans = 0;
        for(int i = 0; i < n; i++) {
            years += vis[i];
        }
        printf("%d\n", ans);
    }
    return 0;
}

 

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=324524076&siteId=291194637