zoukankan      html  css  js  c++  java
  • HDU4325--Flowers--树状数组,离散化

    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

    2
    1 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
    (关于离散化,会再写一篇博客) ```c++ #include #include #include #include #include using namespace std; const int M=100100; int tree[M]; int q[M]; int N=0; map 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 #"<>n>>m; for(int i=0;i>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>l; if(ls.find(l)==ls.end()) ls.insert(make_pair(l,1)); q[i]=l; } int i=1; for(map::iterator ite=ls.begin();ite!=ls.end();ite++){ ite->second=i++; } N=i-1; for(int i=0;i
  • 相关阅读:
    Tornado-Lesson06-ORM、SQLAlchemy连接数据库、Module和增删改查
    Tornado-Lesson04-模版、模版转义、静态文件的引用
    Tornado-Lesson05-模版继承、函数和类导入、ui_methods和ui_modules
    博弈论
    给图片添加水印
    Apsara Clouder专项技能认证:实现调用API接口
    好用的工具
    书写是为了更好的思考
    使用与破解ExcelVBA密码
    一款可以直接下载浏览器sources资源的Chrome插件
  • 原文地址:https://www.cnblogs.com/liuzhanshan/p/5879858.html
Copyright © 2011-2022 走看看