2^k求法

int lowbit(int x)
{
return x&(-x);
}

lowbit()的返回值就是 2^k 次方的值。

基本树形数组的模板

import java.util.*;
public class Main1{
static int N=;
static int n,x,ans;
static int c[] = new int [N];
static int a[] = new int [N];
public static int sum(int n){
int sum=;
while(n>){
sum+=c[n];
n-=n&(-n);
}
return sum;
}
public static void add(int i ,int x,int n){
while(i<=n){
c[i]+=x;
i+=i&(-i);
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
for(int i=;i<=n;i++){
a[i]= sc.nextInt();
add(i,a[i],n);
}
ans=sum(n);
System.out.println(ans);
}
}

例题:

hihocoder1524

树形数组求逆序对,用树形数组可以快速统计出ai>aj对的数量,时间复杂度可以很好的提升,先感慨一个大小为a的最大值的数组c,每当读入一个数时,我们可以用桶排序思想,将c[a[i]]加1,然后我们 统计c[1]~c[a[i]]

的和,ans-1(除去这个数本身)就是在这个数前面有多少个数比它小,我们只需要用i-ans就可以计算出前面有多少个数比他大,也就是逆序对的数量

    给定一个1-N的排列A1, A2, ... AN,如果Ai和Aj满足i < j且Ai > Aj,我们就称(Ai, Aj)是一个逆序对。  

    求A1, A2 ... AN中所有逆序对的数目。
public class Main1{
static int N = ;
static int n,x,ans=; static int c[]= new int [N];
public static int sum(int n){
int sum=;
while(n>){
sum+=c[n];
n-=n&(-n);
}
return sum;
}
public static void add(int i,int x){
while(i<=n){
c[i]+=x;
i+=i&(-i);
}
}
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
n = sc.nextInt();
for(int i=;i<=n;i++){
x=sc.nextInt();
add(x,);
ans+=(i-sum(x)); }
System.out.println(ans); }
}

树形数组 java的更多相关文章

  1. PHP 发布两个不用递归的树形数组构造函数(转)

    <?php/** *创建父节点树形数组 * 参数 $ar 数组,邻接列表方式组织的数据 $id 数组中作为主键的下标或关联键名 $pid 数组中作为父键的下标或关联键名 * 返回 多维数组 ** ...

  2. ACM 树形数组

    树状数组(Binary Indexed Tree(BIT), Fenwick Tree)是一个查询和修改复杂度都为log(n)的数据结构.主要用于查询任意两位之间的所有元素之和,但是每次只能修改一个元 ...

  3. 一维数组、二维数组——Java

    一. 一维数组 1.  数组是相同类型数据的有序集合 相同类型的若干个数据,按照一定先后次序排列组合而成 每个数组元素可以通过一个下标来访问它们 其中,每一个数据称作一个数组元素 2. 数组特点: 其 ...

  4. 线性表(存储结构数组)--Java 实现

    /*线性表的数组实现 *特点:插入删除慢需要平均移动一半的数据,查找较快 *注意:有重复和无重复的数据对应的操作会有些不同 *注意数组一旦创建其大小就固定了 *Java集合长度可变是由于创建新的数组将 ...

  5. 流程控制与数组——Java疯狂讲义

    顺序结构 if分支语句      if{} 可以有多个else if{} else{} 可以省略 switch分支语句 while循环 do while循环 for循环 嵌套循环 控制循环结构 理解数 ...

  6. ACM-ICPC北京赛区(2017)网络赛2【后缀数组+Java//不会】

    #1579 : Reverse Suffix Array 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 There is a strong data structure ...

  7. 2015年第六届蓝桥杯省赛T10 生命之树(树形dp+Java模拟vector)

    生命之树 在X森林里,上帝创建了生命之树. 他给每棵树的每个节点(叶子也称为一个节点)上,都标了一个整数,代表这个点的和谐值. 上帝要在这棵树内选出一个非空节点集S,使得对于S中的任意两个点a,b,都 ...

  8. 合并K个有序数组-Java

    package com.rao.algorithm; import java.util.Arrays; /** * @author Srao * @className MergeK * @date 2 ...

  9. 多线程循环打印数组 -- Java笔记

    问题描述: 现有多个长度相同的数组,现要求使用多线程将数组内的数交替打印. 如: int[] ai = {1,2,3,4,5,6,7}; String[] ac = {"A",&q ...

随机推荐

  1. GoLang-Rpc编程

    Rpc定义: RPC(Remote Procedure Call,远程过程调用)是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络细节的应用程序通信协议. RPC协议构建于TCP或UDP, ...

  2. python之shelve模块详解

    一.定义 Shelve是对象持久化保存方法,将对象保存到文件里面,缺省(即默认)的数据存储文件是二进制的. 二.用途 可以作为一个简单的数据存储方案. 三.用法 使用时,只需要使用open函数获取一个 ...

  3. ACM-ICPC 2018 徐州赛区网络预赛 A Hard to prepare(递推)

    https://nanti.jisuanke.com/t/31453 题目 有n个格子拉成一个环,给你k,你能使用任意个数的0 ~ 2^k - 1,规定操作 i XNOR j 为~(i  ^  j), ...

  4. 第三节:总结.Net下后端的几种请求方式(WebClient、WebRequest、HttpClient)

    一. 前言 前端调用有Form表单提交,ajax提交,ajax一般是用Jquery的简化写法,在这里不再过多介绍: 后端调用大约有这些:WebCient.WebRequest.Httpclient.W ...

  5. mysql中使用enum,如何获取所有可能的值

    SELECT column_type FROM information_schema. COLUMNS WHERE TABLE_SCHEMA = "数据库名" AND DATA_T ...

  6. “Django用户认证系统”学习资料收集

    首推追梦人物——Django用户认证系统 待续……

  7. UDP核心API讲解

  8. 快速查看linux命令的用法----------TLDR

    之前我们如果用一个命令,但是忘了具体的参数是什么的时候,通常会用man,比如 man tar 但是man有时候特别的冗长,你要找到想要的例子非常困难,所以tldr命令就是一个很好的补充,里边会有经常用 ...

  9. day 15 - 1 内置函数

    内置函数 作用域相关 locals() globals() #这两组开始容易搞混 print(locals()) #返回本地作用域中的所有名字 print(globals()) #返回全局作用域中的所 ...

  10. 401AM 随笔~ 322~330 的总结

    web简介:html:超文本标记语言css:层叠样式表 或者css样式JavaScript:一门脚本语言前端:html css javascript<!---->:注释段落与文字p.b加粗 ...