2016寒假训练——树状数组
2016-02-24 17:51
225 查看
来源:POJ2352
虽然说有ACMer的前辈和我说树状数组不是用的太多,而且线段树的东西可以完全代替,不过如此渣的我,还是。。。学一下好。。。
其实就是说,当我要去记数组的前缀和的时候,用一个树的结构来记录,类似于小学奥数的断环付费问题。具体理论回头找时间写吧!
就是说我们出去所有的2,就是我这个节点的高度,这里的图我就不画了,然后看这一题。
题意就是给出星星的位置,以数学中常用的坐标,然后来计算左边和不高于它的星星的个数。为了节约时间我们用树状数组。。。
在代码里分析。。。
虽然说有ACMer的前辈和我说树状数组不是用的太多,而且线段树的东西可以完全代替,不过如此渣的我,还是。。。学一下好。。。
其实就是说,当我要去记数组的前缀和的时候,用一个树的结构来记录,类似于小学奥数的断环付费问题。具体理论回头找时间写吧!
就是说我们出去所有的2,就是我这个节点的高度,这里的图我就不画了,然后看这一题。
题意就是给出星星的位置,以数学中常用的坐标,然后来计算左边和不高于它的星星的个数。为了节约时间我们用树状数组。。。
在代码里分析。。。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int MAXN=50000;//据说这个数要在30000以上 int c[MAXN],total[MAXN]; int Lowbit(int t){对于树状数组有C =C[N-1]+2^(n-1),这个式子就是在求2^k return t&(t^(t-1)); } int query(int n){//询问,就是一个一个2的幂减去。。。 int sum=0; while(n>0){ sum+=c ; n=n-Lowbit(n); } return sum; } void update(int i,int x){//更新就是不断加入2的幂 while(i<=MAXN){ c[i]+=x; i+=Lowbit(i); } }//上面三个参见模板吧,这里不讲 int main(){ int n,x,y; memset(c,0,sizeof(c)); memset(total,0,sizeof(total)); scanf("%d",&n); for(int i=0;i<n;i++) { scanf("%d%d",&x,&y); update(x+1,1);//这里不考虑y是因为题目中对于y的顺序已经有了规定 total[query(x+1)-1]++; } for(int i=0;i<n;i++) printf("%d\n",total[i]); return 0; }
相关文章推荐
- Servlet
- Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)和 Dubbo架构设计详解
- 404 Not Found The requested URL * was not found on this server
- WebService的介绍概念 收藏
- 《STL源码剖析》中关于set_new_handler的理解
- The Swift Programming Language学习笔记(十六)——析构过程
- eclipse+svn:遇到tree-conflict导致代码无法提交
- java生成一维码图片(2种方式)
- 指引列表弹框
- C/C++ 中嵌入 arm 汇编
- ArrayBlockingQueue和LinkedBlockingQueue
- YII2配置多语言
- github常见操作和常见错误!错误提示:fatal: remote origin already exists.
- xamarian studio 创建asp.net mvc razor project 报错:Could not locate Razor Host Factory type: System.We
- The Swift Programming Language学习笔记(十五)——构造过程
- 同等尺寸下为何android压缩出来的图片质量不如iphone
- solr查询语法
- Swift学习笔记八:枚举
- php计算两个日期相差 年 月 日
- 通过反射创建运行时类对象