poj 2528 Mayor's posters

区间更新查询算法
本文介绍了一种基于线段树的数据结构实现,用于处理区间更新和单点查询的问题。该算法可以高效地解决区间覆盖和查询操作,适用于动态规划、算法竞赛等场景。文章通过具体的代码实现了构建线段树、区间更新及查询等功能。
#include<iostream>
#include<stdio.h>
using namespace std;
#define MAX  40002
int a[MAX],b[MAX],flag[MAX],stl[MAX*250];
struct node{
  int l,r,c;
};
struct node tree[MAX*4];
#define Mid(idx)  (tree[idx].l+tree[idx].r)/2
void buildTree(int idx,int l,int r){
     tree[idx].l=l;
     tree[idx].r=r;
     tree[idx].c=0;
     if(r!=l){
     int mid=(l+r)>>1;
     buildTree(idx<<1,l,mid);
     buildTree(idx<<1|1,mid+1,r);
     }
     return ;
}
void Insert(int idx,int l,int r,int c){
    // if(tree[idx].c==c) return ;
     if(tree[idx].l==l&&tree[idx].r==r) {
       tree[idx].c=c;return ;
     }
     if(tree[idx].c>0){
        tree[idx<<1].c=tree[idx<<1|1].c=tree[idx].c;
        tree[idx].c=0;
     }
     int mid=Mid(idx);
     if(mid>=r) Insert(idx<<1,l,r,c);
     else if(l>mid) Insert(idx<<1|1,l,r,c);
     else {
        Insert(idx<<1,l,mid,c);
        Insert(idx<<1|1,mid+1,r,c);
     }
}
int querySum(int idx){
    int count=0;
   if (tree[idx].c>0){
        if(!flag[tree[idx].c]){
            flag[tree[idx].c]=1;
            count=1;
        }
        return count;
    }
    return count=querySum(idx<<1)+querySum(idx<<1|1);
}
int main(){
   int T,n,i,j,k,t,l,r,tmp[MAX*2];
   scanf("%d",&T);
   while(T--){
     scanf("%d",&n);
     memset(flag,0,sizeof(flag));
     for(i=1,j=n+1;i<=n;j++,i++){
       scanf("%d%d",&a[i],&b[i]);
        tmp[i]=a[i];tmp[j]=b[i];
     }
     sort(tmp+1,tmp+2*n+1);
     t=1;stl[tmp[1]]=t;k=2*n;
     for(i=2; i<=k; i++){
            if(tmp[i]!=tmp[i-1]) stl[tmp[i]]=++t;
     }
      buildTree(1,1,t);
     for(i=1;i<=n;i++){
       Insert(1,stl[a[i]],stl[b[i]],i);
     }
     cout<<querySum(1)<<endl;
   }
   return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值