HDU1556 【树状数组】(改段求点)

#include<cstdio>
#include<algorithm>
#include<cstring>
#define maxn 100050
using namespace std;

int b[maxn];
int n;
int lowbit(int x)
{
    return x&(-x);
}

void ADD(int x, int c)    //向下查询
{
    for (int i=x; i>0; i-=i&(-i))
    b[i] += c;
}
int SUM(int x)     //向上统计
{
    int s = 0;
    for (int i=x; i<=n; i+=i&(-i))
    s += b[i];
    return s;
}

int main()
{
    while(scanf("%d",&n)&&n)
    {
        int x,y;
        memset(b,0,sizeof b);
        for(int i=0; i<n; i++)
        {
            scanf("%d%d",&x,&y);
            ADD(y,1);
            ADD(x-1,-1);
        }
        for(int i=1; i<n; i++)
        {
            printf("%d ",SUM(i));
        }
        printf("%d\n",SUM(n));
    }
    return 0;
}

心得体会

树状数组主要就分为3种类型。针对这3种类型,我已经转载了一篇文章,里面有3种类型的模板。

做题的时候,只要分清楚是考查哪种类型,然后套模板就可以了。

针对这道题,还有几点要注意的地方。

(1) 不要忘了对数组b进行初始化。

(2)输入   while(scanf("%d",&n)&&n)   的运用,既完成了输入,同时判断了n 是否为0.

(3)输出中的小细节。

前n个数之间存在空格,最后一个数后面不输出空格,直接换行。

注意细节~~~~~

HDU1556 【树状数组】(改段求点)

时间: 2024-10-09 22:45:32

HDU1556 【树状数组】(改段求点)的相关文章

Codeforces 390E Inna and Large Sweet Matrix 树状数组改段求段

题目链接:点击打开链接 题意:给定n*m的二维平面 w个操作 1.0 (x1,y1) (x2,y2) value for i : x1 to x2 for j : y1 to y2 mp[i][j] += value; 2.1 (x1, y1) (x2 y2) ans1 = 纵坐标在 y1,y2间的总数 ans2 = 横坐标不在x1,x2间的总数 puts(ans1-ans2); 因为n最大是4e6, 所以用树状数组改段求段代替线段树 #include <stdio.h> #include &

HDU 1556 数据结构-树状数组-改段求点

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1556 解题思路:树状数组,只要了解树状数组的原理就不用死记模板了,总之树状数组管理的就是前缀和,高度越高的的结点管理的范围越广 所以要是改点求段:更改一个点就要向上传递 所以要是改段求点:更改一个点就要向下传递 代码: #include <cstdio> #include <iostream> #include <cstring> using namespace std;

CodeForces 390E Inna and Large Sweet Matrix(树状数组改段求段)

树状数组只能实现线段树区间修改和区间查询的功能,可以代替不需要lazy tag的线段树,且代码量和常数较小 首先定义一个数组 int c[N]; 并清空 memset(c, 0, sizeof c); 1.单点修改 : c[x] += y; 对应的函数是 change(x, y); 2.求前缀和 :  对应的函数是 int sum(x) 两种操作的复杂度都是O(logn) 模板如下: int c[N], maxn; inline int Lowbit(int x){return x&(-x);}

树状数组改点求段

#include<stdio.h> int a[20],n; int lowbit(int x) { return x&(-x); } void add(int x,int c) { int i; for(i=x; i<=n; i+=lowbit(i))a[i]+=c; } int sum(int x) { int s=0,i; for(i=x; i; i-=lowbit(i))s+=a[i]; return s; } int main() { scanf("%d&qu

树状数组成段更新——POJ 3468

A Simple Problem with IntegersCrawling in process... Crawling failed Time Limit:5000MS     Memory Limit:131072KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 3468 Description You have N integers, A1, A2, ... , AN. You need to deal wit

【树状数组】段修改,点查询

利用差分,先得到一个差分序列(如:(1,2,3,5)的差分序列为(1,1,1,2)) 当[i,j]段中所有数均加上数m时,在差分序列的i位置加上m,在j+1位置减去m即可 求和利用树状数组 以下是pascal程序: var a,fai:array[0..1000] of longint; c:char; n,i,x,y,f,m:longint; function lowbit(x:longint):longint; begin lowbit:=x and (-x); end; procedure

【初识——树状数组】 区间求最值

说树状数组其实是一个索引表,但是是一个特殊的,树状的索引表,它利用了二进制的一些特性. 就区间求和的要求来说: 首先我们用a[]数组来存储原始数据.然后在a[]之上构造c[]数组来作为树状数组. 如图 这个图表示,当i为奇数时,c[i]中保存的都是a[i]本身.然后,c[2]中保存了a[1], a[2],共2个,c[4]中保存的是a[1], a[2], a[3], a[4],c[6]又是保存两个,c[5]和c[6].c[8]保存8个,c[1], c[2], c[3], c[4], c[5], c

HDU1556(树状数组)

Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 17044    Accepted Submission(s): 8513 Problem Description N个气球排成一排,从左到右依次编号为1,2,3....N.每次给定2个整数a b(a <= b),lele便为骑上他的“小飞鸽"牌电动车从气

POJ 2299 Ultra-QuickSort (求逆序数:离散化+树状数组或者归并排序求逆序数)

Ultra-QuickSort Time Limit: 7000MS   Memory Limit: 65536K Total Submissions: 55048   Accepted: 20256 Description In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a sequence of n distinct integers by swappin

hdu-1556 树状数组嘤嘤嘤

题目出处 http://acm.hdu.edu.cn/showproblem.php?pid=1556 #include <iostream> #include <cstdio> #include <cstring> using namespace std; #define MAXN 100048 int c[MAXN]; int n,t; inline int Lowbit(int x)//求lowbit { return x&(-x); } void upd