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

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1556

解题思路:树状数组,只要了解树状数组的原理就不用死记模板了,总之树状数组管理的就是前缀和,高度越高的的结点管理的范围越广

      所以要是改点求段:更改一个点就要向上传递

      所以要是改段求点:更改一个点就要向下传递

代码:

#include <cstdio>
#include <iostream>
#include <cstring>

using namespace std;
const int MAXN = 1e5 + 7;

int a[MAXN];
int t;

int low_bit(int k) {
    return k & -k;
}
void update(int i, int val) {
    while(i > 0) {
        a[i] += val;
        i -= low_bit(i);
    }
}
int sum(int k) {
    int ret = 0;
    while(k <= t) {
        ret += a[k];
        k += low_bit(k);
    }
    return ret;
}
int main() {
    //freopen("in.txt","r",stdin);
    while(~scanf("%d", &t) && t) {
        memset(a, 0, sizeof(a));
        int b, c;
        int temp = t;
        while(temp--) {
            scanf("%d%d", &b, &c);
            // cout << "b: " << b << " c: " << c << endl;
            update(c, 1);
            if(b > 1) update(b-1, -1);
        }
        printf("%d", sum(1));
        for(int i = 2; i <= t; i++) {
            printf(" %d", sum(i));
        }
        printf("\n");
    }
    return 0;
}

思考:今年2019了呀!我向来都是唯果论,不问过程,只看结果。数据结构这种东西如果只掌握模板还有什么意思,只有了解其中的原理才能够更好的用模板。

原文地址:https://www.cnblogs.com/FriskyPuppy/p/10204192.html

时间: 2024-10-10 08:34:15

HDU 1556 数据结构-树状数组-改段求点的相关文章

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 &

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

数据结构——树状数组

我们今天来讲一个应用比较广泛的数据结构——树状数组 它可以在O(nlogn)的复杂度下进行单点修改区间查询,下面我会分成三个模块对树状数组进行详细的解说,分别是树状数组基本操作.树状数组区间修改单点查询的实现.树状数组查询最值的实现 一. 树状数组一般分为三种操作,初始化.修改.查询 在讲基本操作之前,我们先来看一张图 这张图就是树状数组的存储方式,对于没有接触过树状数组的人来说看懂上面这张图可能有些困难,上图的A数组就是我们的原数组,C数组则是我们需要维护的数组,这样存储能干什么呢,比如我们在

HDU Cow Sorting (树状数组)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2838 Cow Sorting Problem Description Sherlock's N (1 ≤ N ≤ 100,000) cows are lined up to be milked in the evening. Each cow has a unique "grumpiness" level in the range 1...100,000. Since grumpy cow

树状数组成段更新——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

hdu 5193 分块 树状数组 逆序对

题意: 给出n个数,a1,a2,a3,...,an,给出m个修改,每个修改往数组的某个位置后面插入一个数,或者把某个位置上的数移除.求每次修改后逆序对的个数. 限制: 1 <= n,m <= 20000; 1 <= ai <= n 思路: 插入和删除用分块来处理,块与块之间用双向链表来维护,每一块用树状数组来求小于某个数的数有多少个. 外层可以使用分块维护下标,这样添加和删除元素的时候,也很方便,直接暴力.查找权值个数时,使用树状数组比较方便.内层通过树状数组维护权值. 每次更新即

hdu 3584 三维树状数组

/**************************************************************************************************** 题意:在一个三维长方体里把0元素改成1或者把1改成0或者询问某个位置是0还是1. 分析: 非树状数组莫属,其他数据结构都太帅了,用不着. 先说说一维上的树状数组,什么问题都得成最简单的开始,理解后才能推广到多维或复杂的. 把对某个方体的修改操作看做是对某个方体的操作数+1,那一个位置操作数的奇偶

hdu 4031(树状数组+辅助数组)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4031 Attack Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65768/65768 K (Java/Others) Total Submission(s): 1890    Accepted Submission(s): 554 Problem Description Today is the 10th Annual of "S