HDU 4325 - Flowers(线段树区间更新+离散化)

题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4325

【题意】
n n 朵花,已经给出每朵花的开花时间 [ s i , e i ] [s_i, e_i] ,现在有 m m 次查询,对查询值 x x ,输出在时间点 x x 开花的个数( n , m < = 1 0 5 , s i , e i < = 1 0 9 n,m<=10^5,s_i,e_i<=10^9

【思路】
将区间点和查询点离散化,然后线段树区间更新,单点求和即可

#include<bits/stdc++.h>
#define node tree[id]
#define lson tree[id<<1]
#define rson tree[id<<1|1]
using namespace std;

const int maxn=100005;

struct Tree{
    int left,right;
    int lazy;
}tree[maxn<<3];

int n,m;
int x[maxn],y[maxn],q[maxn];
vector<int> p;

void pushdown(int id){
    if(node.lazy && node.left!=node.right){
        lson.lazy+=node.lazy;
        rson.lazy+=node.lazy;
        node.lazy=0;
    }
}

void build(int id,int le,int ri){
    node.left=le;
    node.right=ri;
    node.lazy=0;
    if(le==ri) return;
    int mid=(le+ri)>>1;
    build(id<<1,le,mid);
    build(id<<1|1,mid+1,ri);
}

void update(int id,int le,int ri){
    if(node.left==le && node.right==ri){
        node.lazy+=1;
        return;
    }
    pushdown(id);
    int mid=(node.left+node.right)>>1;
    if(ri<=mid) update(id<<1,le,ri);
    else if(le>mid) update(id<<1|1,le,ri);
    else{
        update(id<<1,le,mid);
        update(id<<1|1,mid+1,ri);
    }
}

int query(int id,int pos){
    if(node.left==node.right){
        return node.lazy;
    }
    pushdown(id);
    int mid=(node.left+node.right)>>1;
    if(pos<=mid) return query(id<<1,pos);
    else return query(id<<1|1,pos);
}

int main(){
    int T;
    scanf("%d",&T);
    for(int kase=1;kase<=T;++kase){
        scanf("%d%d",&n,&m);
        p.clear();
        for(int i=0;i<n;++i){
            scanf("%d%d",&x[i],&y[i]);
            p.push_back(x[i]);
            p.push_back(y[i]);
        }
        for(int i=0;i<m;++i){
            scanf("%d",&q[i]);
            p.push_back(q[i]);
        }
        sort(p.begin(),p.end());
        p.erase(unique(p.begin(),p.end()),p.end());
        build(1,0,p.size()-1);
        for(int i=0;i<n;++i){
            int le=lower_bound(p.begin(),p.end(),x[i])-p.begin();
            int ri=lower_bound(p.begin(),p.end(),y[i])-p.begin();
            update(1,le,ri);
        }

        printf("Case #%d:\n",kase);
        for(int i=0;i<m;++i){
            int a=lower_bound(p.begin(),p.end(),q[i])-p.begin();
            printf("%d\n",query(1,a));
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/xiao_k666/article/details/82973632