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

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
}
相关推荐
Steve lu1 小时前
回归任务损失函数对比曲线
人工智能·pytorch·深度学习·神经网络·算法·回归·原力计划
蒙奇D索大2 小时前
【数据结构】图论核心算法解析:深度优先搜索(DFS)的纵深遍历与生成树实战指南
数据结构·算法·深度优先·图论·图搜索算法
让我们一起加油好吗2 小时前
【基础算法】高精度(加、减、乘、除)
c++·算法·高精度·洛谷
不会敲代码的灵长类2 小时前
机器学习算法-k-means
算法·机器学习·kmeans
Studying 开龙wu2 小时前
机器学习有监督学习sklearn实战二:六种算法对鸢尾花(Iris)数据集进行分类和特征可视化
学习·算法·机器学习
鑫鑫向栄2 小时前
[蓝桥杯]缩位求和
数据结构·c++·算法·职场和发展·蓝桥杯
Tony__Ferguson2 小时前
简述八大排序(Sort)
数据结构·算法·排序算法
stormsha2 小时前
MCP架构全解析:从核心原理到企业级实践
服务器·c++·架构
梁下轻语的秋缘2 小时前
每日c/c++题 备战蓝桥杯(P1204 [USACO1.2] 挤牛奶 Milking Cows)
c语言·c++·蓝桥杯
芜湖xin2 小时前
【题解-洛谷】P9422 [蓝桥杯 2023 国 B] 合并数列
算法·队列