1. 程式人生 > >HDU 4325 Flowers(樹狀數組+離散化)

HDU 4325 Flowers(樹狀數組+離散化)

sort pro query 維護 %d pac stream n) ons

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

題意:
給出n個區間和m個詢問,每個詢問為一個x,問有多少個區間包含了x。

思路:

因為數據量比較多,所以需要離散化。區間的離散化需要註意一下,如果端點不連續的話,需要額外插點。

區間情況就用樹狀數組來維護。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 const
int maxn = 2*1e5+5; 7 8 int n, m, tot; 9 int a[maxn+1000],c[maxn]; 10 11 struct node 12 { 13 int l,r; 14 }query[maxn/2]; 15 16 int lowbit(int x) 17 { 18 return x&-x; 19 } 20 21 int sum(int x) 22 { 23 int ret = 0; 24 while(x>0) 25 { 26 ret+=c[x];
27 x-=lowbit(x); 28 } 29 return ret; 30 } 31 32 void add(int x, int d) 33 { 34 while(x<=maxn) 35 { 36 c[x]+=d; 37 x+=lowbit(x); 38 } 39 } 40 41 int main() 42 { 43 //freopen("in.txt","r",stdin); 44 int T; 45 int kase = 0; 46 scanf("
%d",&T); 47 while(T--) 48 { 49 tot = 0; 50 memset(c,0,sizeof(c)); 51 scanf("%d%d",&n,&m); 52 for(int i=1;i<=n;i++) 53 { 54 scanf("%d%d",&query[i].l,&query[i].r); 55 a[tot++] = query[i].l; 56 a[tot++] = query[i].r; 57 } 58 a[tot++] = 0; 59 sort(a,a+tot); 60 int tmp = tot; 61 for(int i=1;i<tmp;i++) 62 if(a[i]-a[i-1]>1) a[tot++] = a[i]-1; 63 sort(a,a+tot); 64 int num = unique(a,a+tot)-a; 65 for(int i=1;i<=n;i++) 66 { 67 int l = lower_bound(a,a+tot,query[i].l)-a; 68 int r = lower_bound(a,a+tot,query[i].r)-a; 69 add(l,1); 70 add(r+1,-1); 71 } 72 printf("Case #%d:\n",++kase); 73 while(m--) 74 { 75 int x; scanf("%d",&x); 76 x = lower_bound(a,a+tot,x)-a; 77 printf("%d\n",sum(x)); 78 } 79 } 80 return 0; 81 }

HDU 4325 Flowers(樹狀數組+離散化)