1. 程式人生 > >hdoj 4325 Flowers 線段樹+離散化

hdoj 4325 Flowers 線段樹+離散化

string 註意 stream date void href pre sca include

hdoj 4325 Flowers

題目鏈接:

http://acm.hdu.edu.cn/showproblem.php?pid=4325

思路:

直接線段樹,按照花的開放區間的大小建樹,要註意雖然花的周期數據可能會達到1e9,這樣的話線段樹開四倍時不可能的。但是我們可以看到一共可能的數據時N行,那麽每行兩個數,再開4倍的區間。計算下來,在離散化的幫助下,我們只需要開8*N被的線段樹即可。
另外詢問的數據也需要放入離散化的範圍,如果不這樣做,有可能在詢問時使用lower_bound函數會導致數據的改變,詢問的原數據發生變化。
eg:1~3 7~10 詢問6,結果應該時0,但因為lower_bound的原因詢問時使用7,得到結果1。etc.

代碼:

#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <string.h>
#include <math.h>
using namespace std;
const int maxn = 1e5+5;
struct node {
    int l,r,sum,lazy;
    inline void update(int val) {
        lazy+=val;
        sum+=val;
    }
} tr[maxn*8
]; int a[maxn],b[maxn],c[maxn<<1],d[maxn]; inline void push_down(int s) { int lazyval = tr[s].lazy; if(!lazyval) return; tr[s<<1].update(lazyval); tr[s<<1|1].update(lazyval); tr[s].lazy=0; } void build(int s, int l, int r) { tr[s].l=l;tr[s].r=r; tr[s].lazy=tr
[s].sum=0; if(l==r) return; int mid = (l+r)>>1; build(s<<1,l,mid); build(s<<1|1,mid+1,r); } void update(int s, int l, int r) { if(tr[s].l==l&&tr[s].r==r) { tr[s].update(1); return; } push_down(s); int mid = (tr[s].l+tr[s].r)>>1; if(r<=mid) update(s<<1,l,r); else if(l>mid) update(s<<1|1,l,r); else { update(s<<1,l,mid); update(s<<1|1,mid+1,r); } } int query(int s, int l, int r) { if(tr[s].l==l&&tr[s].r==r) { return tr[s].sum; } push_down(s); int mid=(tr[s].l+tr[s].r)>>1; if(r<=mid) return query(s<<1,l,r); else return query(s<<1|1,l,r); } int main() { int t,n,m,tot; scanf("%d",&t); for(int j=1;j<=t;++j) { scanf("%d %d",&n,&m); tot=1; for(int i=1;i<=n;++i) { scanf("%d %d",&a[i],&b[i]); c[tot++]=a[i];c[tot++]=b[i]; } for(int i=1;i<=m;++i) { scanf("%d",&d[i]); c[tot++]=d[i]; } sort(c+1,c+tot); tot=unique(c+1,c+tot)-(c+1); build(1,1,tot); for(int i=1;i<=n;++i) { a[i]=lower_bound(c+1,c+tot,a[i])-c; b[i]=lower_bound(c+1,c+tot,b[i])-c; update(1,a[i],b[i]); } printf("Case #%d:\n",j); for(int i=1;i<=m;++i) { d[i]=lower_bound(c+1,c+tot,d[i])-c; printf("%d\n",query(1,d[i],d[i])); } } return 0; }

hdoj 4325 Flowers 線段樹+離散化