• 【树状数组】楼兰图腾


    241. 楼兰图腾 - AcWing题库

    题意:

    思路:

    计数问题,考虑贡献即可

    对于每一个V形端点,维护这个端点两端大于它的数的个数,那么这个点的贡献就是左边比它大的数*右边比它大的数,用树状数组维护即可

    这是树状数组的应用之一,用于维护左右两边比它大or小的数的个数

    对于维护左边的个数,我们可以从左到右扫描一遍,然后用树状数组去维护权值序列,权值序列记录的是值域,在扫描之前,权值序列所有数为0,每添加一个数就单点修改,同时树状数组也维护了前缀和的变化,然后查询就是查一下权值序列的前缀和就好了

    Code:

    1. #include
    2. #define low(x) (x&(-x))
    3. #define int long long
    4. using namespace std;
    5. const int mxn=2e5+10;
    6. int n;
    7. int a[mxn],upper[mxn],lower[mxn],tree[mxn];
    8. int sum(int x){
    9. int res=0;
    10. for(int i=x;i;i-=low(i)) res+=tree[i];
    11. return res;
    12. }
    13. void add(int x){
    14. for(int i=x;i<=n;i+=low(i)) tree[i]++;
    15. }
    16. signed main(){
    17. ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    18. cin>>n;
    19. for(int i=1;i<=n;i++) cin>>a[i];
    20. for(int i=1;i<=n;i++){
    21. lower[i]=sum(a[i]);
    22. upper[i]=sum(n)-sum(a[i]);
    23. add(a[i]);
    24. }
    25. memset(tree,0,sizeof(tree));
    26. int ans1=0,ans2=0;
    27. for(int i=n;i>=1;i--){
    28. ans1+=upper[i]*(sum(n)-sum(a[i]));
    29. ans2+=lower[i]*sum(a[i]);
    30. add(a[i]);
    31. }
    32. cout<" "<'\n';
    33. }

    因为树状数组的这种功能,它也能维护序列的逆序对个数:

    1. #include
    2. #define int long long
    3. #define low(x) (x&(-x))
    4. using namespace std;
    5. const int mxn=5e5+10;
    6. int n;
    7. int a[mxn],tree[mxn];
    8. void add(int x,int k){
    9. for(int i=x;i<=n;i+=low(i)) tree[i]+=k;
    10. }
    11. int sum(int x){
    12. int res=0;
    13. for(int i=x;i;i-=low(i)) res+=tree[i];
    14. return res;
    15. }
    16. signed main(){
    17. ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    18. memset(tree,0,sizeof(tree));
    19. cin>>n;
    20. for(int i=1;i<=n;i++) cin>>a[i];
    21. int ans=0;
    22. for(int i=1;i<=n;i++){
    23. ans+=sum(n)-sum(a[i]);
    24. add(a[i],1);
    25. }
    26. cout<'\n';
    27. return 0;
    28. }

    总结:

    树状数组的应用:用于维护左右两边比它大or小的数的个数,也可维护逆序对个数

  • 相关阅读:
    浅析Jetty与tomcat区别
    测试驱动的嵌入式C语言开发(TDD)(第1-3章)
    【Matplotlib绘制图像大全】(十):Matplotlib使用boxplot()绘制箱线图
    match-sorter 插件
    CSS Layout
    mp4文件修复
    CSS3 多列布局
    玩转Vue3之Composables
    c#中容易被忽视的foreach
    C++代码基本内存操作及原理
  • 原文地址:https://blog.csdn.net/weixin_62528401/article/details/127660649