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

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
}
相关推荐
AlenTech6 分钟前
141. 环形链表 - 力扣(LeetCode)
数据结构·leetcode·链表
DpHard7 分钟前
现代 C++ 中 push 接口为何提供 const T& 与 T&& 两个重载
c++
U-52184F6928 分钟前
深入理解“隐式共享”与“写时复制”:从性能魔法到内存深坑
java·数据库·算法
pp起床1 小时前
Part02:基本概念以及基本要素
大数据·人工智能·算法
lzh200409191 小时前
红黑树详解
算法
U-52184F691 小时前
深度解析:从 Qt 的 Q_D 宏说起,C++ 工业级 SDK 是如何保证 ABI 稳定性的
数据库·c++·qt
迈巴赫车主1 小时前
蓝桥杯20560逃离高塔
java·开发语言·数据结构·算法·职场和发展·蓝桥杯
泯仲1 小时前
Ragent项目7种设计模式深度解析:从源码看设计模式落地实践
java·算法·设计模式·agent
dulu~dulu1 小时前
算法---寻找和为K的子数组
笔记·python·算法·leetcode
moonsea02031 小时前
【无标题】
算法