关闭

树状数组,模板 注意事项

104人阅读 评论(0) 收藏 举报
分类:


记得按 for(int i = 1;i <= 10;i++)、


不要按 for(int i = 0;i < 10;i++)


加val的值 不是更新成val的值!!! 


不能有下标为0的下标 会TLE


</pre><pre>

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<stdlib.h>
#include<math.h>
using namespace std;

///////////////////记得按 for(int i = 1;i <= 10;i++)
///////////////////不要按 for(int i = 0;i < 10;i++)
///////////////////    ALL 


int c[500050];
int n;
int lowbit(int x)
{
	return x&(-x);
}

void update(int x,int val)//是加val的值 不是更新成val的值!!! 
{
	while(x<=n)
	{
		c[x]+=val;
		x+=lowbit(x);
	}
}

int getsum(int x)
{
	int ans=0;
	while(x>0)
	{
		ans+=c[x];
		x-=lowbit(x);
	}
	return ans;
}


//int Lowbit(int x) //2^k
//{
//    return x & (-x);
//}
//
//struct fenwick
//{
//	int fa[100100];
//	int fn;//数组大小          //一定要赋值 
//	void update(int t, int val)//位置,值 
//	{
//		for(int i = t;i <= fn ;i += Lowbit(i))
//		{
//			fa[i] += val;
//		}
//	}
//	int getsum(int x)
//	{
//		int ans=0;
//	    for(int i=x; i>0; i-=Lowbit(i))
//	        ans += fa[i];
//	    return ans;
//	}
//	 
//}fen;


//int n;//一共多少个数
//int c[110101];
//void Update(int t,int val)
//{
//    for(int i=t; i<=n; i+=Lowbit(i))
//        c[i] += val;
//}
//int getSum(int x)
//{
//    int ans=0;
//    for(int i=x; i>0; i-=Lowbit(i))
//        ans += c[i];
//    return ans;
//}

int main()
{
	n =10;
	for(int i = 1;i <= 10;i++)
	{
		update(i,1);
	}
	for(int i = 1;i <= 10;i++)
	{
		update(i,-1);
	}
	
	for(int i = 1;i <= 10;i++)
	{
		printf("!%d %d\n",i,getsum(i));
	}
	
 } </span>


<span style="font-size:32px;">
///////////////////记得按 for(int i = 1;i <= 10;i++)
///////////////////不要按 for(int i = 0;i < 10;i++)</span>
0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

树状数组(模板)

树状数组模板
  • u012860063
  • u012860063
  • 2014-04-30 20:54
  • 3050

树状数组求区间最大值

这个算法只支持单点修改和区间查询最值。每一次维护和查询的时间复杂度都是O((logn)^2),但这是满打满算的时间复杂度。 假设是要维护和查询区间的最大值(最小值将max改成min 就好了) 这个算法...
  • mosquito_zm
  • mosquito_zm
  • 2017-07-31 11:02
  • 284

C++树状数组详解

引入 如果给你n个数,然后进行q次询问,每次询问一个区间[x,y]的和,你会怎么做? 第一种方法:最简单的方法,用数组存起来,每次枚举x-y,ans加起来就可以,时间复杂度O(qn),十分慢。 ...
  • C20190102
  • C20190102
  • 2017-04-28 13:32
  • 1335

树状数组模板

链接:http://www.cnblogs.com/nanke/archive/2012/02/27/2370512.html int lowbit(int x){ return x & (-x...
  • idealistic
  • idealistic
  • 2016-08-16 20:43
  • 842

poj 1195 二维树状数组 及二维树状数组模板

http://poj.org/problem?id=1195 求矩阵和的时候,下标弄错WA了一次... 求矩形(x1,y1) (x2,y2)的sum |sum=sum(x2,y2)-sum(x1...
  • u011026968
  • u011026968
  • 2014-08-13 10:45
  • 779

【树状数组】专题+模板

先放模板。。。 #define lowbit(x) (x) & (-x) const int N=1005; const int M=1e9+7; int dp[N][N],c[N][N]; int...
  • cacyth
  • cacyth
  • 2015-12-02 20:07
  • 665

【模板】树状数组 区间修改,区间求和 (模板题:洛谷P3368树状数组2)

题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的和 输入输出格式 输入格式: 第一行包含两个整数N、M,分别表示...
  • zj_yuneng
  • zj_yuneng
  • 2017-05-26 14:50
  • 116

树状数组(单点修改区间查询、区间修改单点查询、区间修改区间查询)

Description如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加上x 2.求出某区间每一个数的和Input第一行包含两个整数N、M,分别表示该数列数字的个数和操作的总个数。 ...
  • zars19
  • zars19
  • 2017-01-19 22:28
  • 825

离散化+树状数组求逆序数

题目:POJ2299   离散化是一种常用的技巧,有时数据范围太大,可以用来放缩到我们能处理的范围 因为其中需排序的数的范围0---999 999 999;显然数组不肯能这么 大;而N的最大范围是50...
  • ACdreamers
  • ACdreamers
  • 2013-01-19 14:52
  • 4137

poj 2299 Ultra-QuickSort(树状数组求逆序数+离散化)

转自:http://www.cnblogs.com/shenshuyang/archive/2012/07/14/2591859.html 这里说的很好,把求逆序的步骤说的很明白,我...
  • u012860063
  • u012860063
  • 2015-05-03 20:03
  • 510
    个人资料
    • 访问:8007次
    • 积分:461
    • 等级:
    • 排名:千里之外
    • 原创:37篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条