Par4.1 数据结构-树状数组
A序列操作
单点修改,区间查询,模板题
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1000010;
int n, q;
ll tr[N], a[N];
int lowbit(int x)
{
return x & -x;
}
void add(int x, int v)
{
for (; x <= n; x += lowbit(x)) tr[x] += v;
}
ll ask(int x)
{
ll ans = 0;
for (; x; x -= lowbit(x)) ans += tr[x];
return ans;
}
int main()
{
scanf("%d%d", &n, &q);
for (int i = 1; i <= n; i ++ )
{
int x; scanf("%d", &x);
add(i, x);
}
while (q -- )
{
int op, x, y; scanf("%d%d%d", &op, &x, &y);
if (op == 1)
{
add(x, y);
}
else
{
ll ans = ask(y) - ask(x - 1);
printf("%lld\n", ans);
}
}
return 0;
}
数星星 Stars
我们只要看x就可以了,不需要考虑y。
因为,y是递增的,同时x也是递增的。
我们 在同一行时,记录左侧个数就得到当前等级。
而y时递增的,所以,保证了,其他数据一定在自己同行或者下面。
两者结合,我们就知道了,我们直接查询,就得到的是左下方的星星数。
#include <bits/stdc++.h>
using namespace std;
const int N = 1000010;
int n;
int tr[N];
int cnt[N * 2];
int lowbit(int x)
{
return x & -x;
}
void add(int x, int v)
{
for (; x <= 32010; x += lowbit(x)) tr[x] += v;
}
int ask(int x)
{
int ans = 0;
for (; x; x -= lowbit(x)) ans += tr[x];
return ans;
}
int main()
{
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> n;
for (int i = 0; i < n; i ++ )
{
int x, y; cin >> x >> y;
x ++;
int t = ask(x);
// cout << t << endl;
add(x, 1);
cnt[t] ++;
}
for (int i = 0; i < n; i ++ )
cout << cnt[i] << endl;
return 0;
}