「树状数组」楼兰图腾
楼兰图腾 原题链接: 楼兰图腾 题目大意 给你 \(n\) 个数,再给你两种限制条件,问你在符合这两种限制条件的情况,每种限制最多有多少个数 题目题解 这个题可以拓展到一些需要用到离散化的题 这个题很简单,两个限制条件,可以这么认为 限制条件1:枚举所有的数,然后找左边比它大的,找右边比它大的 限制条件2:枚举所有的书,然后处理方式与上面相反 当然方式可以更简单一点,只用计算一种即可,另外一种肯定是左右剩下的数组成(不懂?不懂可以看看代码),那么剩下怎么办呢?很简单,直接用 \(l_i \times r_i\) 就可以了(想想,为什么?答案很显然) 答案会爆int 这里要开long long 代码如下 //#define fre yes #include <cstdio> const int N = 200005; int arr[N], r[N], l[N], c[N]; namespace BIT { int c[N]; int lowbit(int x) { return x & (-x); } inline void init(int n) { for (int i = 1; i <= n; i++) { c[i] = 0; } } int ask(int x) { int res = 0; while(x) { res += c[x]; x -= lowbit(x); }