树状数组
struct Fenwt {
int n; ll sum[N];
void add(int x, int y) { if(x == 0) return sum[0] += y, void(); for(; x <= n; x += (x & -x)) sum[x] += y; }
ll qzh(int x) { ll res = sum[0]; for(; x; x -= (x & -x)) res += sum[x]; return res; }
} ;
P6186 [NOI Online #1 提高组]冒泡排序
首先蒟蒻先离散化,然后把他变成了正序对 \(x = n - x + 1\)。
每次冒泡排序会让在某个数前面的比他小的数少 \(1\)。(逆序对少 \(1\))
然后用树状数组统计即可。
CF650D Zip-line
直接统计一下严格最长上升子序列(树状数组统计)值 \(x\)。统计以每个节点开头和结束的严格最长上升子序列。
然后询问分两类:
第一类是统计经过查询的节点的答案。这个树状数组离线统计即可。
第二类是统计不经过查询的节点的答案。这个树状数组统计一下可以在严格最长上升子序列的节点 \(r\) 是由哪个节点更新的 (设为 \(l\))。那么 \(l + 1, r - 1\) 这段区间里面的数都是不必要的。差分统计即可。(查询中不必要的是 \(x\), 必要的是 \(x-1\))。
CF351D Jeff and Removing Periods
和 \(HH\) 的项链差不多。对于每一种颜色,维护上一个出现 i 的位置以及上上次出现这个差值的位置即可。