日常算法刷题整理
一、字符串处理
二、数学
三、数据结构
1、区间问题
1.1、树状数组
板子:
#include<iostream>
#include<vector>
#define type int
using namespace std;
// n:元素个数,m:操作次数
int n, m;
vector<type> a, c; // a是原数组,c是树状数组
int lowbit(int x)
{
return x&(-x);
}
void update(int i, int x)
{
while(i <= n) {
c[i] += x;
i += lowbit(i);
}
}
int getSum(int i) // 求a[1]+..a[i]的合
{
int ans = 0;
while(i) {
ans += c[i];
i -= lowbit(i);
}
return ans;
}
int main()
{
cin >> n >> m;
a.resize(n + 1);
c.resize(n + 1);
for(int i = 1; i <= n; ++i) {
cin >> a[i];
update(i, a[i]);
}
while(m--) {
// 操作
}
return 0;
}
例题:洛谷P3373、洛谷P3368