目录

提高课:数据结构之树状数组

1,楼兰图腾

cpp 复制代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>

using namespace std;

typedef long long LL;

const int  N = 200010;

int n;
int a[N];
int tr[N];
int Greater[N], lower[N];

int lowbit(int x)
{
	return x & -x;
}
void add(int x, int c)
{
	for (int i = x; i <= n; i = i + lowbit(i)) tr[i] = tr[i] + c;
}
int sum(int x)
{
	int res = 0;
	for (int i = x; i; i = i - lowbit(i))res = res + tr[i];
	return res;
}
int main()
{
	cin >> n;

	for (int i = 1; i <= n; i++)cin >> a[i];

	for (int i=1; i <= n; i++)
	{
		int y = a[i];
		Greater[i] = sum(n) - sum(y);
		lower[i] = sum(y - 1);
		add(y, 1);
	}
	memset(tr, 0, sizeof(tr));
	LL res1 = 0, res2 = 0;
	for (int i = n; i; i--)
	{
		int y = a[i];
		res1 += Greater[i] * (LL)(sum(n) - sum(y));
		res2 += lower[i] * (LL)(sum(y-1));
		add(y, 1);
	}

	cout << res1 << " " << res2 << endl;
	return 0;
	//5
	//1 5 3 2 4
	//3 4
	
}
cpp 复制代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>

using namespace std;

typedef long long LL;

const int  N = 1e5 + 10;
int n;
int a[N];
long long tr[N];//表示区间总和//也相当于N代表方块
int G[N];

int lowbit(int x)
{
	return x & (-x);
}//查找子叶个数

void add(int x, int c)
{
	for (int i = x; i <= n; i += lowbit(i)) tr[i] += c;

}//如上

long long sum(int x)//前x项的和
{
	long long res = 0;
	for (int i = x; i; i -= lowbit(i)) res += tr[i];
	return res;
}//如上

int main()
{
	cin >> n;

	for (int i = 1; i <= n; i++)cin >> a[i];

	for (int i = 1; i <= n; i++)
	{

		for (int k = 0; k <= n + 1; k++)
		{
			cout << tr[k];
		}
		cout << endl;

		for (int k = 0; k <= n + 1; k++)
		{
			cout << G[k];
		}
		cout << endl;

		int y = a[i];
		G[i] = sum(n) - sum(y);
		add(y, 1);
	}

		for (int k = 0; k <= n+1; k++)
		{
			cout << tr[k];
		}
		cout << endl;

		for (int k = 0; k <= n+1; k++)
		{
			cout << G[k];
		}
		cout << endl;

	memset(tr, 0, sizeof tr);
	cout << "--------------" << endl;
	LL res1 = 0;
	for (int i = n; i; i--)
	{
		int y = a[i];
		res1 += G[i] * (LL)(sum(n) - sum(y));
		add(y, 1);

		for (int k = 0; k <= n; k++)
		{
			cout << tr[i];
		}
		cout << endl;

		for (int k = 0; k <= n; k++)
		{
			cout << G[i];
		}
		cout << endl;

	}
	cout << res1 << endl;
	return 0;
}
cpp 复制代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>

using namespace std;

const int  N = 1e5 + 10;
int n;
int a[N];
long long tr[N];//表示区间总和

int lowbit(int x)
{
	return x & (-x);
}//查找子叶个数

void add(int x, int c)
{
	for (int i = x; i <= n; i += lowbit(i)) tr[i] += c;

}//如上

long long sum(int x)
{
	long long res = 0;
	for (int i = x; i; i -= lowbit(i)) res += tr[i];
	return res;
}//如上

int main()
{
	while (cin>>n)
	{
		if (!n)break;
		//memset(a,0,sizeof(a));
		memset(tr, 0, sizeof(tr));
		for (int k = 1; k <= n; k++)
		{
			int l, r;
			
			cin >> l >> r;

			//		for(int i=l;i<=r;i++)
			//		{
			//			
			//		}
			//int yy = l - r + 1;
			add(l, 1);
			add(r + 1, -1);
		}

		for (int i = 1; i < n; i++)
		{
			cout << sum(i) << " ";
		}
		cout<< sum(n) << endl;

	}
	return 0;
}
cpp 复制代码
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>

using namespace std;

const int  N = 1e6 + 5;
int n,m;
int a[N];
long long tr[N];//表示区间总和

int lowbit(int x)
{
	return x & (-x);
}//查找子叶个数

void add(int x, int c)
{
	for (int i = x; i <= n; i += lowbit(i)) tr[i] += c;
}//如上

long long sum(int x)
{
	long long res = 0;
	for (int i = x; i ; i -= lowbit(i)) res += tr[i];
	return res;
}//如上

int main()
{
	scanf("%d %d", &n, &m);
	for (int i = 1; i <= n; i++)
	{
		scanf("%d", &a[i]);
		add(i, a[i]);//传参
	}
	while (m--)
	{
		int x, y, z;
		scanf("%d %d %d", &x, &y, &z);
		if (x == 1)
		{
			add(y, z);
		}
		if (x == 2)
		{
			long long sum1 = sum(y - 1);
			long long sum2 = sum(z);
			printf("%lld\n", sum2 - sum1);//前缀和公式
		}
	}
	return 0;
	//5
	//1 5 3 2 4
	//3 4
	
}
cpp 复制代码
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;

typedef long long LL;

const int N = 100010;

int n, m;
int a[N];
int tr11[N];
int tr2[N];

int lowbit(int x)
{
	return x & -x;
}

void add(int tr[], int x, LL c)
{
	for (int i = x; i <= n; i += lowbit(i))tr[i] += c;

}

LL sum(int tr[], int x)
{
	LL res = 0;
	for (int i = x; i; i -= lowbit(i))res += tr[i];
	return res;
}

LL prefix_sum(int x)
{
	return sum(tr11, x) * (x + 1) - sum(tr2, x);
}
int main()
{
	cin >> n >> m;
	for (int i = 1; i <= n; i++)cin >> a[i];
	for (int i = 1; i <= n; i++)
	{
		int b = a[i] - a[i - 1];
		add(tr11, i, b);
		add(tr2, i, (LL)b*i);
	}
	while (m--)
	{
		char op[2];
		int l, r, d;
		cin >> op >> l >> r;
		if (*op == 'Q')
		{
			cout << prefix_sum(r) - prefix_sum(l - 1) << endl;
		}
		else
		{
			cin >> d;
			add(tr11, l, d), add(tr2, l, l * d);
			add(tr11, r + 1, -d), add(tr2, r + 1, (r + 1) * -d);
		}
	}
	return 0;
	//10 5
	//1 2 3 4 5 6 7 8 9 10
	//Q 4 4
	//Q 1 10
	//Q 2 4
	//C 3 6 3
	//Q 2 4

	//4
	//55
	//9
	//15
}
本文是转载文章,点击查看原文
如有侵权,请联系 xyy@jishuzhan.net 删除
相关推荐
微臣愚钝5 分钟前
图论-BFS搜索图/树-最短路径问题的解决
算法·图论·宽度优先
别来无恙2028 分钟前
数据结构(4)
数据结构·c++
南玖yy24 分钟前
排序算法复杂度及稳定性全解析(八种排序)
数据结构·算法·排序算法
Run1.27 分钟前
深入解析C++引用:安全高效的别名机制及其与指针的对比
开发语言·c++
小_t_同学32 分钟前
C语言自定义类型详解一:结构体(内存对齐)
数据结构
飞川撸码35 分钟前
【LeetCode 热题100】二叉树构造题精讲:前序 + 中序建树 & 有序数组构造 BST(力扣105 / 108)(Go语言版)
数据结构·leetcode·golang·二叉树
雾里看山1 小时前
算法思想之位运算(一)
算法·leetcode·推荐算法
柯西梦回黄鹤楼1 小时前
《ADVANCING MATHEMATICAL REASONING IN LAN- GUAGE MODELS》全文阅读
人工智能·算法·机器学习
GOTXX1 小时前
【Qt】Qt 信号与槽机制全解析
开发语言·数据库·c++·qt·多线程·用户界面
似水এ᭄往昔1 小时前
【初阶数据结构】——算法复杂度
数据结构