HDU4325--Flowers--树状数组,离散化
2016-09-17 22:06
218 查看
Description
As is known to all, the blooming time and duration varies between different kinds of flowers. Now there is a garden planted full of flowers. The gardener wants to know how many flowers will bloom in the garden in a specific time. But there are too many flowers in the garden, so he wants you to help him.Input
The first line contains a single integer t (1 <= t <= 10), the number of test cases.For each case, the first line contains two integer N and M, where N (1 <= N <= 10^5) is the number of flowers, and M (1 <= M <= 10^5) is the query times.
In the next N lines, each line contains two integer S i and T i (1 <= S i <= T i <= 10^9), means i-th flower will be blooming at time [S i, T i].
In the next M lines, each line contains an integer T i, means the time of i-th query.
Output
For each case, output the case number as shown and then print M lines. Each line contains an integer, meaning the number of blooming flowers.Sample outputs are available for more details.
Sample Input
21 1
5 10
4
2 3
1 4
4 8
1
4
6
Sample Output
Case #1:0
Case #2:
1
2
1
很简单的一道树状数组的改段求点的模版题,基本思想是:tree[]为树状数组,N个元素,tree[i]存放的是i至N被加了多少,
所以,修改[l,r]区间值的操作就变为了,
update(l,1);
update(r+1,-1);
查询某点的操作就变为了查询此点的前缀和
需要注意的是,此题目的数据范围太大,需要进行离散化1 <= S i <= T i <= 10^9(关于离散化,会再写一篇博客)
#include<iostream> #include<string.h> #include<vector> #include<stdio.h> #include<map> using namespace std; const int M=100100; int tree[M]; int q[M]; int N=0; map<int,int> ls; struct node { int le; int ri; }a[M]; int lowbits(int x) { return x&(-x); } void update(int i,int val) { for(;i<=N;i+=lowbits(i)){ tree[i]+=val; } } int getsum(int i) { int sum=0; for(;i>0;i-=lowbits(i)){ sum+=tree[i]; } return sum; } void init() { memset(tree,0,sizeof(tree)); ls.clear(); } int main() { freopen("data.in","r",stdin); int m,n; int t; int l,r; int tem; int casn=1; cin>>t; while(t--){ cout<<"Case #"<<casn++<<":"<<endl; init(); cin>>n>>m; for(int i=0;i<n;i++){ cin>>l>>r; if(ls.find(l)==ls.end()) ls.insert(make_pair(l,1)); if(ls.find(r)==ls.end()) ls.insert(make_pair(r,1)); a[i].le=l;a[i].ri=r; } for(int i=0;i<m;i++){ cin>>l; if(ls.find(l)==ls.end()) ls.insert(make_pair(l,1)); q[i]=l; } int i=1; for(map<int,int>::iterator ite=ls.begin();ite!=ls.end();ite++){ ite->second=i++; } N=i-1; for(int i=0;i<n;i++){ update(ls[a[i].le],1); update(ls[a[i].ri]+1,-1); } for(int i=0;i<m;i++){ cout<<getsum(ls[q[i]])<<endl; } } }
相关文章推荐
- hdu4325 Flowers【树状数组区间更新单点求值 离散化】
- Flowers--(树状数组,离散化)
- [HDOJ4325]Flowers(树状数组 离散化)
- HDU 4325 Flowers(树状数组+离散化)
- hdu 4325 Flowers (树状数组+离散化)
- HDU 4325 Flowers(树状数组+离散化)
- Flowers&&树状数组+离散化
- HDU OJ 4325 Flowers 【树状数组离散化】
- HDU - 5792 树状数组 + 离散化
- sgu 180. Inversions (树状数组+离散化,第一道需要改模板的题目,好题)
- (POJ 2299)Ultra-QuickSort 树状数组求逆序对数 + 离散化
- poj-2299-Ultra-QuickSort-(树状数组and离散化)
- hdu 5489 Removed Interval 2015合肥网络赛 树状数组 dp 离散化/dp
- poj 2528 Mayor's posters(树状数组+离散化)
- POJ 2299 Ultra-QuickSort(树状数组+离散化处理)
- HDU5877 Weak Pair dfs + 线段树/树状数组 + 离散化
- 【离散化树状数组】Nordic Collegiate Programming Contest G.Galactic Collegiate Programming Contest
- ZSTU 3113 - Interval Challenge (树状数组 + 离散化)
- hdu 3743 Frosh Week (树状数组的离散化)
- HDU 5862 Counting Intersections(树状数组+离散化+扫描线)