算法提高之楼兰图腾(树状数组)

news2024/11/19 17:27:19

楼兰图腾(树状数组)

  • 核心算法:树状数组

    • 将下标转化为二进制 例如11100100 父节点下标x 子节点下标i
      • 由下图可知 每一个数都可以由其子节点**(如果有)**求和得到
      • **由父节点找子节点:**每个子节点下标 –> x – 1 – lowbit(x – 1)
      • 由子节点找父节点: i + lowbit(i)
    • 在这里插入图片描述
  •   #include <cstdio>
      #include <cstring>
      #include <iostream>
      #include <algorithm>
      
      using namespace std;
      typedef long long LL;
      const int N = 200010;
      
      int Greater[N],lower[N];
      int a[N];
      int tr[N];
      int n;
      
      int lowbit(int x)
      {
          return x&-x;  //取最后一位1
      }
      
      void add(int x,int c)
      {
          for(int i=x;i<=n;i += lowbit(i)) tr[i] += c;  //在每一个父节点上都加上c
      } 
      
      int sum(int x)
      {
          int res=0;
          for(int i=x;i;i -= lowbit(i)) res+=tr[i];  //所有子节点求和
          return res;
      }
      
      int main()
      {
          cin>>n;
          for(int i=1;i<=n;i++) cin>>a[i];
          
          for(int i=1;i<=n;i++)
          {
              int y = a[i];
              Greater[i] = sum(n) - sum(y);  //前缀和 求值为y-n的个数
              lower[i] = sum(y-1);  //0-(y-1)的个数
              //解释:大小为y的有1个
              add(y,1);  //值作为下标 个数作为值 存入树状数组
          }
          //清空之前的树
          memset(tr,0,sizeof tr);
          LL res1=0,res2=0;
          for(int i=n;i;i--)
          {
              int y = a[i];
              //Greater里面存的是左边大的 再求一个右边大的
              res1 += Greater[i] * (LL)(sum(n) - sum(y));  
              res2 += lower[i] * (LL)(sum(y-1));
              //一样的操作建树
              add(y,1);
          }
          cout<<res1<<" "<<res2;
      }
    

参考题解:https://www.acwing.com/solution/content/110791/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1514463.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

19.创建帖子

文章目录 一、建立路由二、开发CreatePostHandler三、编写logic四、编写dao层五、编译测试运行 一、建立路由 这里要稍微注意的是&#xff1a;需要登录后才可以发表帖子&#xff0c;所以需要用到我们之前写的鉴权中间件。中间件对用户携带的token解析成功后&#xff0c;便会将…

深度解析Nginx正向代理的原理与实现

目录 前言 1. 什么是正向代理 2. Nginx正向代理的配置 3. Nginx正向代理的实现原理 4. 示例代码 5. 总结 前言 Nginx是一个高性能的Web服务器和反向代理服务器&#xff0c;但它也可以用作正向代理服务器。本文将深入解析Nginx正向代理的原理和实现&#xff0c;并提供相关…

排序算法之快速排序算法介绍

目录 快速排序介绍 时间复杂度和稳定性 代码实现 C语言实现 c实现 java实现 快速排序介绍 快速排序(Quick Sort)使用分治法策略。 它的基本思想是&#xff1a;选择一个基准数&#xff0c;通过一趟排序将要排序的数据分割成独立的两部分&#xff1b;其中一部分的所有数据…

市场复盘总结 20240313

仅用于记录当天的市场情况&#xff0c;用于统计交易策略的适用情况&#xff0c;以便程序回测 短线核心&#xff1a;不参与任何级别的调整&#xff0c;采用龙空龙模式 一支股票 10%的时候可以操作&#xff0c; 90%的时间适合空仓等待 昨天选出的个股&#xff0c;今日涨6.87% 二…

Vue+SpringBoot打造创意工坊双创管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 管理员端2.2 Web 端2.3 移动端 三、系统展示四、核心代码4.1 查询项目4.2 移动端新增团队4.3 查询讲座4.4 讲座收藏4.5 小程序登录 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的创意工坊双创管理…

JUC之JMM

Java内存模型JMM JMM三大特性&#xff1a;可见性、有序性、原子性 可见性 原子性&#xff1a;指一个操作是不可打断的&#xff0c;即多线程的环境下&#xff0c;操作不能被其他线程干扰 有序性 处理器在进行重排序时&#xff0c;必须要考虑指令之间的数据依赖性。多线程环境…

一款开箱即用的 Vue3 中后台管理系统框架

概述 Fantastic-admin是一个基于Vue.js技术栈的后台管理框架&#xff0c;设计用于提升开发效率和优化用户界面。它通常包括了一套完整的前端解决方案&#xff0c;如用户界面组件、工具和库&#xff0c;以支持快速开发高质量的后台产品。这个框架可能强调易用性、灵活性和高性能…

思科网络中如何进行动态NAT配置

一、什么是动态NAT&#xff1f;动态NAT与静态NAT的区别是什么&#xff1f; &#xff08;1&#xff09;动态NAT&#xff08;Network Address Translation&#xff09;是一种网络地址转换技术&#xff0c;它会动态地将内部私有网络中的局域网IP地址映射为公共IP地址&#xff0c;…

String、StringBuilder、StringBuffer 有什么区别?

1、典型回答 String、StringBuilder 和 StringBuffer 都是 Java 语言中&#xff0c;用于操作字符串的类&#xff0c;但它们在性能、可变性和线程安全性方面有一些区别 1、String&#xff1a;不可变字符串类&#xff0c;也就是说一旦创建&#xff0c;它的值就不可变。每次对 S…

基于java+springboot+vue实现的停车场管理系统(文末源码+Lw)23-258

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统停车场管理系统信息管理难度大&#xff0c;容错率低&…

HarmonyOS NEXT应用开发之深色跑马灯案例

介绍 本示例介绍了文本宽度过宽时&#xff0c;如何实现文本首尾相接循环滚动并显示在可视区&#xff0c;以及每循环滚动一次之后会停滞一段时间后再滚动。 效果图预览 使用说明&#xff1a; 1.进入页面&#xff0c;检票口文本处&#xff0c;实现文本首尾相接循环滚动&#x…

创建空的Numpy数组

参考&#xff1a;Creating Empty Numpy Array Numpy 是一个开源的 Python 扩展库&#xff0c;用于科学计算和数据分析。它提供了高性能的多维数组对象&#xff0c;以及在这些数组上进行的各种操作。 在 Numpy 中&#xff0c;可以使用 numpy 模块的 empty 函数来创建一个空的 …

Vue3全家桶 - Vue3 - 【1】前置准备和介绍(VsCode插件 + 组合式API和选项式API的比较)

一、前言 Vue2.7是当前、同时也是最后一个 Vue2.x 的次级版本更新。Vue2.7 会以其发布日期&#xff0c;即2022年7月1日开始计算&#xff0c;提供18个月的长期技术支持。在此期间&#xff0c;Vue2将会提供必要的bug修复和安全修复。但不再提供新特性。Vue2的终止支持时间是2023…

C++ 有边数限制的最短路 Bellman_ford算法(带负权边)

给定一个 n 个点 m 条边的有向图&#xff0c;图中可能存在重边和自环&#xff0c; 边权可能为负数。 请你求出从 1 号点到 n 号点的最多经过 k 条边的最短距离&#xff0c;如果无法从 1 号点走到 n 号点&#xff0c;输出 impossible。 注意&#xff1a;图中可能 存在负权回路…

算法刷题Day4 | 24. 两两交换链表中的节点、19.删除链表的倒数第N个节点、面试题 02.07. 链表相交、142.环形链表II

目录 0 引言1 两两交换链表中的节点1.1 我的解题1.2 注意事项 2 删除链表的倒数第N个节点2.1 我的代码2.2 报错原因分析 3 链表相交3.1 我的解题 4 环形链表II4.1 我的解题 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;算法专栏&#x1f4a5; 标…

10个让你事半功倍的工作效率技巧,让你成为高效率的现代人!

作为现代人&#xff0c;我们每天都在面对各种各样的任务和工作&#xff0c;有时候会因为繁忙而感到力不从心&#xff0c;导致效率变得非常低下。所以&#xff0c;在这篇文章中&#xff0c;我将分享10个能够帮助你提高工作效率的技巧&#xff0c;让你的工作事半功倍。 1. 制定计…

labview中6种机械动作的区别

1.单击时转换&#xff1a;单击时转换&#xff0c;需要手动转换或者赋值回复原来状态&#xff1b; 2.释放时转换&#xff1a;释放时时转换&#xff0c;需要手动转换或者赋值回复原来状态&#xff1b; 3.单击时转换保持到鼠标释放&#xff1a;触发两次&#xff0c;自动恢复原来状…

ppocr ERROR: When parsing line KeyError: None

训练百度飞桨 paddleOCR模型。 数据集没有问题&#xff0c;但报以上错误。 发现是手欠&#xff0c;多按了下回车&#xff0c;多了个 - 删掉就好了。

map和set的介绍和使用

文章目录 map和set关联式容器键值对set介绍模板参数 map介绍模板参数为什么map支持下标访问 multiset介绍 multimap map和set 关联式容器 我们在之前讲过STL的一些基础容器&#xff0c;例如vector&#xff0c;list&#xff0c;deque&#xff0c;forward_list等 这些其实统一…

Script标签中 defer 和 async 属性的区别

script 标签中 defer & async 属性 如果我们注意过 html 中的 <script> 标签&#xff0c;就会发现在有的加载 JavaScript 文件的 <script src"https://code.jquery.com/jquery-3.7.1.min.js" defer></script>这里就探讨一下 script 标签上的…