树状数组重(jiao)新(wo)理(zuo)解(ren)

POJ-2352  加加加都给我加

  输入是一行一行按照x从小到大给出的,所以对于每个点,要考虑的只是x比它小的点的个数。即记录各个x的情况,并且对于一个特定的x要把它前面的x求和。

  噔噔噔,树状数组可以较优地实现改点、求和(而且好写)。

  cin无法承受这么大的输入并t了,关同步也不行,只能用scanf

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int ma = ;
int n;
int x, y;
int ans[ma], a[ma]; int lb(int k) { return k & (-k); } int q(int x)
{
int ans = ;
for (int i = x; i > ; i -= lb(i))ans += a[i];
return ans;
} void add(int x)
{
for (int i = x; i < ma; i += lb(i))a[i]++;
} int main()
{
cin >> n;
for(int i=;i<n;i++) {
scanf("%d%d",&x,&y);
x++;
ans[q(x)]++;
add(x);
}
for (int i = ; i < n; i++)cout << ans[i] << endl;
return ;
}

POJ-2352

  对了,我发现不删掉system(“pause”)交上去也可以,诶嘿

  ++x是因为题目给的x是可以等于零的,而如果add(0)就会爆炸

  先查后加,查询当前点之前符合条件的点的个数,然后使这个level的点的数量++,并把当前点加入x套餐(不是

  

POJ-3067  逆序数对&逆序对数&逆序数@_@

  只有背板子能力的红小豆在发现线段树/树状数组和逆序对数有关系的时候整颗豆都是懵的

  原理:将数与其位置对应,按照数的大小将位置sort,接着求当前位置前有几个位置数是比当前位置数小,再用i减去个数,得到比当前位置数大的位置数的个数,即逆序对数。

  e.g. 数:1 4 3 2   位置:1 2 3 4  sort  数:1 2 3 4   位置数:1 4 3 2

  以树状数组作为实现,即利用query求和,再用add把一系列树组+1

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int t, n, m, k;
int l[], r[],nu[];
int a[]; bool cmp(int i, int j) { if (l[i] == l[j])return r[i] < r[j]; return l[i] < l[j]; } int lb(int k) { return k & (-k); } int q(int x)
{
int ans = ;
for (int i = x; i > ; i -= lb(i))ans += a[i];
return ans;
} void add(int x)
{
for (int i = x; i < ; i+=lb(i))a[i]++;
} int main()
{
cin >> t;
int co = ;
while (t--) {
++co;
memset(a, , sizeof(a));
cin >> n >> m >> k;
for (int i = ; i <= k; i++) {
scanf("%d%d",&l[i],&r[i]);
nu[i] = i;
}
sort(nu + , nu + + k, cmp);
long long ans = ;
for (int i = ; i <= k; i++) {
ans += i - q(r[nu[i]])-;
add(r[nu[i]]);
}
cout << "Test case " << co << ": " << ans << endl; }
return ;
}

POJ-3067

  对了,要纠正一件事,memset还是比单纯for要快一些的。

  神仙用pair存的左右序号,毕竟它自带先按first从小到大再按second来sort

  蒟蒻想起了间接排序法就这么实行了,除了括号有点多,好像没什么问题 

  因为又从1开始了,所以ans+=i-...-1

什么时候。  

  

  

[树组BIT]训练两题重新理解ver.的更多相关文章

  1. 【BZOJ-1396&2865】识别子串&字符串识别 后缀自动机/后缀树组 + 线段树

    1396: 识别子串 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 312  Solved: 193[Submit][Status][Discuss] ...

  2. poj 3321:Apple Tree(树状数组,提高题)

    Apple Tree Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 18623   Accepted: 5629 Descr ...

  3. HDU 5877 dfs+ 线段树(或+树状树组)

    1.HDU 5877  Weak Pair 2.总结:有多种做法,这里写了dfs+线段树(或+树状树组),还可用主席树或平衡树,但还不会这两个 3.思路:利用dfs遍历子节点,同时对于每个子节点au, ...

  4. 【BZOJ3244】【NOI2013】树的计数(神仙题)

    [BZOJ3244][NOI2013]树的计数(神仙题) 题面 BZOJ 这题有点假,\(bzoj\)上如果要交的话请输出\(ans-0.001,ans,ans+0.001\) 题解 数的形态和编号没 ...

  5. 2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告

    2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告 勘误1:第6题第4个 if最后一个条件粗心写错了,答案应为1580. 条件应为abs(a[3]-a[7])!=1,宝宝心理苦啊.!感谢zzh ...

  6. 【LeetCode】线段树 segment-tree(共9题)+ 树状数组 binary-indexed-tree(共5题)

    第一部分---线段树:https://leetcode.com/tag/segment-tree/ [218]The Skyline Problem [307]Range Sum Query - Mu ...

  7. 第十届蓝桥杯JavaB组省赛真题

    试题 A: 组队 本题总分:5 分 [问题描述] 作为篮球队教练,你需要从以下名单中选出 1 号位至 5 号位各一名球员, 组成球队的首发阵容. 每位球员担任 1 号位至 5 号位时的评分如下表所示. ...

  8. jquery: json树组数据输出到表格Dom树的处理方法

    项目背景 项目中需要把表格重排显示 处理方法 思路主要是用历遍Json数组把json数据一个个append到5个表格里,还要给每个单元格绑定个单击弹出自定义对话框,表格分了单双行,第一行最后还要改ro ...

  9. hdu 1541/poj 2352:Stars(树状数组,经典题)

    Stars Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

随机推荐

  1. @Autowired注入报错

    在用  @Autowired  注入多个类时,出现的错误 因为@Autowired 是按照类型注入,当找不到对应类型类时,才会去按照名称去找. 这时添加注解@Qualifier(“service”), ...

  2. 关于SQL优化的一点建议

    前段时间一直在做关于性能优化相关的工作,结合自己的实际工作经验,只针对SQL层面提一些优化的规范和建议. 针对SQL编写 1.单条SQL长度不宜超过100行: 2.SQL子查询不宜嵌套3层: 子查询嵌 ...

  3. ajax错误类型大全

    https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html ajax错误类型大全

  4. android TextView描边

    前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要重写了onDraw方法. 这一边讲一个进阶功能,实现textView的描边效果. 上效果图. 上代码: public class St ...

  5. 【用户权限】MongoDB用户权限

    一.数据库用户角色: read:允许用户读取指定数据库readWrite:允许用户读写指定数据库 二.数据库管理角色:dbAdmin.dbOwner.userAdmin: dbAdmin:允许用户在指 ...

  6. foreach循环里不能remove/add元素的原理

    foreach循环 ​    foreach循环(Foreach loop)是计算机编程语言中的一种控制流程语句,通常用来循环遍历数组或集合中的元素.Java语言从JDK 1.5.0开始引入forea ...

  7. CSS3 3D图片立方体旋转

    html <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <titl ...

  8. 用Spark完成复杂TopN计算的两种逻辑

    如果有商品品类的数据pairRDD(categoryId,clickCount_orderCount_payCount),用Spark完成Top5,你会怎么做? 这里假设使用Java语言进行编写,那么 ...

  9. 雷林鹏分享:jQuery EasyUI 数据网格 - 自定义排序

    jQuery EasyUI 数据网格 - 自定义排序 如果默认的排序行为不满足您的需求,您可以自定义数据网格(datagrid)的排序行为. 最基础的,用户可以在列上定义一个排序函数,函数名是 sor ...

  10. Oracle解决ora-01653 无法通过1024扩展

    综合上述检查结果,可断定遇到的问题是因为可能性1—表空间不足导致.解决办法也就是扩大表空间 扩大表空间的四种方法: 1.增加数据文件 ALTER TABLESPACE ***_TRD ADD DATA ...