poj 2528 Mayor's posters

离散话和区间修改:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAXN= 100010;
int t[MAXN][2],s[MAXN<<3];
struct tree{
    int l,r;
    int color;
}a[MAXN<<3];
int ans=0;
int vis[MAXN<<3];
void Build(int l,int r,int k){
    a[k].l=l,a[k].r=r,a[k].color=0;
    if(l == r){
        return ;
    }
    else{
        int mid=(a[k].l+a[k].r)>>1;
        Build(l,mid,k<<1);
        Build(mid+1,r,k<<1|1);
    }
}
void pushdown(int k){
    if(a[k].color){
        a[k<<1].color=a[k].color;
        a[k<<1|1].color=a[k].color;
        a[k].color=0;
    }
}
void insertp(int l,int r,int col,int k){
    if(s[a[k].l]==l && s[a[k].r]==r){
        a[k].color=col;
        return ;
    }
    else{
        pushdown(k);
        int mid=(a[k].l+a[k].r)>>1;
        if(r<=s[mid]){
            insertp(l,r,col,k<<1);
        }
        else if(l>s[mid]){
            insertp(l,r,col,k<<1|1);
        }
        else{
            insertp(l,s[mid],col,k<<1);
            insertp(s[mid+1],r,col,k<<1|1);
        }
    }
}
void query(int k){
    if(a[k].color){
        if(!vis[a[k].color]){
            vis[a[k].color]=1;
            ans++;
        }
        return ;
    }
    query(k<<1);
    query(k<<1|1);
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--){
        int n;
        scanf("%d",&n);
        int counter=0;
        for(int i=1;i<=n;i++){
            scanf("%d%d",&t[i][0],&t[i][1]);
            s[counter++]=t[i][0];
            s[counter++]=t[i][1];
        }
        sort(s,s+counter);
        counter=unique(s,s+counter)-s;
        Build(0,counter-1,1);
        for(int i=1;i<=n;i++){
            insertp(t[i][0],t[i][1],i,1);
        }
        memset(vis,0,sizeof(vis));
        ans=0;
        query(1);
        printf("%d\n",ans);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值