hdu 3473 裸的划分树
思路:
用Sum[dep][i]记录从tree[po].l到i中进入左子树的和。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define Maxn 100010
#define inf 0x7fffffff
#define lowbit(x) (x&(-x))
#define lson(x) (x<<1)
#define rson(x) ((x<<1)|1)
#define mid ((tree[po].l+tree[po].r)>>1)
using namespace std;
struct Tree{
int l,r;
}tree[Maxn*];
__int64 Sum[][Maxn],sum[Maxn];
__int64 lnum,lsum;
int sorted[Maxn];
int val[][Maxn],toLeft[][Maxn],n;
void BuildTree(int l,int r,int dep,int po)
{
tree[po].l=l,tree[po].r=r;
if(l==r) return ;
int same=mid-l+,i;
for(i=l;i<=r;i++)
if(val[dep][i]<sorted[mid])
same--;
int lpos=l,rpos=mid+;
for(i=l;i<=r;i++)
{
if(i==l)
toLeft[dep][i]=;
else
toLeft[dep][i]=toLeft[dep][i-];
Sum[dep][i]=Sum[dep][i-];
if(val[dep][i]<sorted[mid])
Sum[dep][i]+=(__int64)val[dep][i],toLeft[dep][i]++,val[dep+][lpos++]=val[dep][i];
else
if(val[dep][i]>sorted[mid])
val[dep+][rpos++]=val[dep][i];
else
if(same)
Sum[dep][i]+=(__int64)val[dep][i],toLeft[dep][i]++,val[dep+][lpos++]=val[dep][i],same--;
else
val[dep+][rpos++]=val[dep][i];
}
BuildTree(l,mid,dep+,lson(po));
BuildTree(mid+,r,dep+,rson(po));
}
int query(int l,int r,int k,int dep,int po)
{
if(l==r)
return val[dep][l];
int vd,invd;
if(l==tree[po].l)
vd=toLeft[dep][r],invd=;
else
vd=toLeft[dep][r]-toLeft[dep][l-],invd=toLeft[dep][l-];
if(vd>=k){
int newl=tree[po].l+invd;
int newr=tree[po].l+vd+invd-;
return query(newl,newr,k,dep+,lson(po));
}
else{
int ss=l-tree[po].l-invd;
int s=r-l+-vd;
int newl=mid+ss+;
int newr=mid+ss+s;
lnum+=vd;
lsum+=Sum[dep][r]-Sum[dep][l-];
return query(newl,newr,k-vd,dep+,rson(po));
}
}
int main()
{
int m,i,j,k,s,t,T,Case=;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(i=;i<=n;i++)
{
scanf("%d",&val[][i]);
sorted[i]=val[][i];
sum[i]=sum[i-]+(__int64)val[][i];
}
sort(sorted+,sorted++n);
BuildTree(,n,,);
__int64 temp;
__int64 ans=;
scanf("%d",&m);
printf("Case #%d:\n",++Case);
for(i=;i<=m;i++)
{
scanf("%d%d",&s,&t);
s++,t++;
lnum=lsum=;
k=(t-s+)/;
temp=(__int64)query(s,t,k,,);
//cout<<lnum<<" "<<temp<<" "<<lsum<<" "<<sum[t]<<" "<<k<<" "<<sum[s-1]<<endl;
ans=lnum*temp-lsum+sum[t]-sum[s-]-lsum-(t-s+-k)*temp;
printf("%I64d\n",ans);
}
printf("\n");
}
return ;
}
hdu 3473 裸的划分树的更多相关文章
- HDU 3473 Minimum Sum 划分树,数据结构 难度:1
http://acm.hdu.edu.cn/showproblem.php?pid=3473 划分树模板题目,需要注意的是划分树的k是由1开始的 划分树: 参考:http://blog.csdn.ne ...
- HDU 3473 Minimum Sum 划分树
题意: 给出一个长度为\(n(1 \leq n \leq 10^5)\)的序列\(a\) 有若干次查询l r:找到一个\(x\)使得\(\sum \limits_{l \leq i \leq r} \ ...
- hdu 2665 Kth number(划分树模板)
http://acm.hdu.edu.cn/showproblem.php?pid=2665 [ poj 2104 2761 ] 改变一下输入就可以过 http://poj.org/problem? ...
- HDU 2665 Kth number(划分树)
Kth number Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- HDU 4417 - Super Mario ( 划分树+二分 / 树状数组+离线处理+离散化)
题意:给一个数组,每次询问输出在区间[L,R]之间小于H的数字的个数. 此题可以使用划分树在线解决. 划分树可以快速查询区间第K小个数字.逆向思考,判断小于H的最大的一个数字是区间第几小数,即是答案. ...
- hdu 2665 Kth number_划分树
题意:求区间[a,b]的第k大 因为多次询问要用到划分树 #include <iostream> #include<cstdio> #include<algorithm& ...
- HDU 4417 Super Mario(划分树)
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- hdu 4417,poj 2104 划分树(模版)归并树(模版)
这次是彻底把划分树搞明确了,与此同一时候发现了模版的重要性.敲代码一个字符都不能错啊~~~ 划分树具体解释:点击打开链接 题意:求一组数列中随意区间不大于h的个数. 这个题的做法是用二分查询 求给定 ...
- HDU 1251 裸的字典树、入门题
裸的字典树还是挺简单的. 四个基本操作建立.查找.插入.删除 建立新结点我是用的c++中 new操作.当然也可以用malloc,都方便 不过指针阿.地址阿.这其中关系什么的我貌似还不是很清楚阿. 因为 ...
随机推荐
- Foreach与Random
[记忆贴] 1)foreach语句可以用于数据或者其他任何Iterable,但是并不意味着数组肯定也是一个Iterable,而任何自动包装也不会自动发生. package thinking.in.ja ...
- HTTP协议状态码详解
HTTP状态码,我都是现查现用. 我以前记得几个常用的状态码,比如200,302,304,404, 503. 一般来说我也只需要了解这些常用的状态码就可以了. 如果是做AJAX,REST,网络爬虫, ...
- 《解剖PetShop》系列转载
1 <解剖PetShop>系列之六 PetShop之表示层设计 http://ityup.com/showtopic-8.html 2 <解剖PetShop>系列之五 ...
- cocos2d-x 缓动曲线
转自:http://blog.csdn.net/cocos2der/article/details/7261808 在实现运动中,我们常常需要实现一些加速度或者减速度的效果,cocos2d-x引擎为我 ...
- Java中单例设计模式总结
两种单例常见的实现方式: 1:懒汉的设计模式,在第一次调用的时候才完成相关的初始化操作 懒汉式是典型的时间换空间,就是每次获取实例都会进行判断,看是否需要创建实例,浪费判断的时间.当然,如果一直没有人 ...
- 权限检查联系人ProfileProvider
每日一贴,今天的内容关键字为权限检查 ProfileProvider继承自AbstractContyactsProvider. 源代码请自行下载 每日一道理 书籍好比一架梯子,它能引领人们登上 ...
- 极域电子教室 e-Learning Class V4 2010专业版 学生机 卸载方法
学校的机房一般都会装教师机远程控制学生机的软件.比如我们学校装的就是"极域电子教室 e-Learning Class V4 2010专业版",上课的时候直接强制全屏远控,卸载又提示 ...
- confirm使用方法
定义和使用方法 confirm() 方法用于显示一个带有指定消息和 OK 及取消button的对话框. 语法 confirm(message) 參数 描写叙述 message 要在 window 上弹 ...
- 解决MySQL不允许从远程访问的方法
mysql -u root -p mysql>use mysql; mysql>select 'host' from user where user='root'; mysql>up ...
- TOJ 4325 RMQ with Shifts / 线段树单点更新
RMQ with Shifts 时间限制(普通/Java):1000MS/3000MS 运行内存限制:65536KByte 描述 In the traditional RMQ (Range M ...