POJ 2528 Mayor's posters

因爲規模比較大,離散化+線段樹。

題目:http://poj.org/problem?id=2528

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>

#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1

using namespace std;
typedef long long ll;
const int maxn = 20005;
int poster[maxn];
int lo[maxn>>1],ro[maxn>>1];
int flag[maxn<<2];
int hash[maxn];
int ans;

void PushDown(int rt){
    if(flag[rt] != -1){
        flag[rt<<1] = flag[rt<<1|1] = flag[rt];
        flag[rt] = -1;
    }
}

void update(int L,int R,int p,int l,int r,int rt){
    if(L <= l && r <= R){
        flag[rt] = p;
        return;
    }
    PushDown(rt);
    int m = (l+r)>>1;
    if(L <= m)
        update(L, R, p, lson);
    if(R > m)
        update(L, R, p, rson);
}

void query(int l,int r,int rt){
    if(flag[rt] != -1){
        if(!hash[flag[rt]])
            ans++;
        hash[flag[rt]] = 1;
        return;
    }
    if(l == r)
        return;
    int m = (l + r)>>1;
    query(lson);
    query(rson);
}

int getlr(int x,int n){
    int l = 0,r = n;
    while(l <= r){
        int m = (l+r)>>1;
        if(poster[m] == x)
            return m;
        else if(x < poster[m])
            r = m - 1;
        else
            l = m + 1;
    }
    return -1;
}

int main(){
    int t,n;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        int h = 0;
        for(int i = 0;i < n;i++){
            scanf("%d%d",&lo[i],&ro[i]);
            poster[h++] = lo[i];
            poster[h++] = ro[i];
        }
        
        sort(poster,poster+h);
        int m = 1;
        for(int i = 1;i < h;i++)
            if(poster[i] != poster[i-1])
                poster[m++] = poster[i];
//        for(int i = 0;i < m;i++)
//            printf("%d ",poster[i]);
        
        memset(flag, -1, sizeof(flag));//建樹的初始化
        
        for(int i = 0;i < n;i++){
            int l = getlr(lo[i],m);
            int r = getlr(ro[i],m);
            //printf("%d %d\n",l,r);
            update(l, r, i, 0, m, 1);
        }
        
        ans = 0;
        memset(hash, 0, sizeof(hash));
        query(0,m,1);
        printf("%d\n",ans);
    }
    return 0;
}



發佈了229 篇原創文章 · 獲贊 12 · 訪問量 11萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章