hdu3473 线段树 划分树
//Accepted 28904 KB 781 ms
//划分树
//所求x即为l,r区间排序后的中位数t
//然后求出小于t的数的和sum1,这个可以用划分树做
//求出整个区间的和sum,可以用O(1)的数组做
//ans=(k-1)*t-sum1+sum-sum1-(l-r+1-k+1)*t
#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
#include <cmath>
#include <algorithm>
using namespace std;
/**
* This is a documentation comment block
* 如果有一天你坚持不下去了,就想想你为什么走到这儿!
* @authr songt
*/
;
struct node
{
int val[imax_n];
int num[imax_n];
__int64 sum[imax_n];
}f[];
int a[imax_n];
__int64 all[imax_n];
int sorted[imax_n];
int n;
void build(int t,int l,int r)
{
if (l==r) return ;
;
;
;
for (int i=l;i<=r;i++)
{
if (f[t].val[i]<sorted[mid]) isame--;
}
int ln=l;
;
for (int i=l;i<=r;i++)
{
if (i==l)
{
f[t].num[i]=;
f[t].sum[i]=;
}
else
{
f[t].sum[i]=f[t].sum[i-];
f[t].num[i]=f[t].num[i-];
}
if (f[t].val[i]<sorted[mid])
{
f[t].num[i]++;
f[t].sum[i]+=f[t].val[i];
f[t+].val[ln++]=f[t].val[i];
}
else if (f[t].val[i]>sorted[mid])
{
f[t+].val[rn++]=f[t].val[i];
}
else
{
if (same<isame)
{
same++;
f[t].num[i]++;
f[t].sum[i]+=f[t].val[i];
f[t+].val[ln++]=f[t].val[i];
}
else
{
f[t+].val[rn++]=f[t].val[i];
}
}
}
build(t+,l,mid);
build(t+,mid+,r);
}
__int64 sum=;
int lnum;
int query(int t,int l,int r,int a,int b,int k)
{
int s,ss;
if (l==r) return f[t].val[l];
;
__int64 tsum=;
if (a==l)
{
ss=;
s=f[t].num[b];
tsum=f[t].sum[b];
}
else
{
ss=f[t].num[a-];
s=f[t].num[b]-ss;
tsum=f[t].sum[b]-f[t].sum[a-];
}
if (s>=k)
{
a=l+ss;
b=l+ss+s-;
,l,mid,a,b,k);
}
else
{
//lnum+=s;
int b1=a-l-ss;
-s;
a=mid++b1;
b=mid+b1+b2;
sum+=tsum;
,mid+,r,a,b,k-s);
}
}
int Q;
int x,y;
void slove()
{
build(,,n);
scanf("%d",&Q);
;i<=Q;i++)
{
scanf("%d%d",&x,&y);
x++;
y++;
__int64 sum1=all[y]-all[x-];
//printf("sum1=%I64d\n",sum1);
sum=;
//lnum=0;
//printf("sum=%I64d\n",sum);
-x+;
,,n,x,y,k);
//printf("t=%d\n",t);
lnum=k-;
__int64 ans=-sum+sum1-sum-(__int64 )(y-x+-lnum-lnum)*t;
printf("%I64d\n",ans);
}
}
int main()
{
int T;
;
scanf("%d",&T);
while (T--)
{
scanf("%d",&n);
all[]=;
;i<=n;i++)
{
scanf("%d",&a[i]);
f[].val[i]=sorted[i]=a[i];
all[i]=all[i-]+a[i];
}
printf("Case #%d:\n",++t);
sort(sorted+,sorted+n+);
slove();
printf("\n");
}
;
}
hdu3473 线段树 划分树的更多相关文章
- 归并树 划分树 可持久化线段树(主席树) 入门题 hdu 2665
如果题目给出1e5的数据范围,,以前只会用n*log(n)的方法去想 今天学了一下两三种n*n*log(n)的数据结构 他们就是大名鼎鼎的 归并树 划分树 主席树,,,, 首先来说两个问题,,区间第k ...
- poj2104 线段树 划分树
学习:http://www.cnblogs.com/pony1993/archive/2012/07/17/2594544.html 划分树的build: 划分树是分层构建的,在构建的t层时,我们可以 ...
- poj2104&&poj2761 (主席树&&划分树)主席树静态区间第k大模板
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 43315 Accepted: 14296 Ca ...
- POJ 题目2761 Feed the dogs(主席树||划分树)
Feed the dogs Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 16860 Accepted: 5273 De ...
- poj 2104 K-th Number (划分树入门 或者 主席树入门)
题意:给n个数,m次询问,每次询问L到R中第k小的数是哪个 算法1:划分树 #include<cstdio> #include<cstring> #include<alg ...
- sdut 2610:Boring Counting(第四届山东省省赛原题,划分树 + 二分)
Boring Counting Time Limit: 3000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 In this problem you a ...
- 学习笔记--函数式线段树(主席树)(动态维护第K极值(树状数组套主席树))
函数式线段树..资瓷 区间第K极值查询 似乎不过似乎划分树的效率更优于它,但是如果主席树套树状数组后,可以处理动态的第K极值.即资瓷插入删除,划分树则不同- 那么原理也比较易懂: 建造一棵线段树(权值 ...
- HDU 4417 (划分树+区间小于k统计)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4417 题目大意:给定一个区间,以及一个k值,求该区间内小于等于k值的数的个数.注意区间是从0开始的 ...
- POJ2104 k-th number 划分树
又是不带修改的区间第k大,这次用的是一个不同的方法,划分树,划分树感觉上是模拟了快速排序的过程,依照pivot不断地往下划分,然后每一层多存一个toleft[i]数组,就可以知道在这一层里从0到i里有 ...
随机推荐
- 显示win7桌面网络.reg
显示win7桌面网络.reg Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\C ...
- div contenteditable placeholder
contenteditable型的编辑框,实现placeholder的方式有两种 第一种,Css的实现方式: <!DOCTYPE html> <html lang="en& ...
- IE和主流浏览器
1.添加事件 addEventListener 主流 attachEvent IE 2.移除事件 removeEventListener detachEvent 3.获取事件对象 event ...
- 解决requestAnimationFrame的兼容问题
写法: window.requestAnimFrame = (function () { return window.requestAnimationFrame || window.webkitReq ...
- lrzsz在CentOS7的安装
在超级用户下打一句命令: yum install lrzsz 或者,在普通用户打一句命令,需要输入超级用户密码: sudo yum install lrzsz 然后使用Xshell 5建立连接即可
- Windows上模拟Linux环境
有两种方法,一直是 MinGW http://jingyan.baidu.com/article/8cdccae985cf7c315413cd35.html 另外可以用 cygwin http://j ...
- 使用2个MR计算
转载:http://www.cnblogs.com/sharpxiajun/p/5205496.html 最近做了一个小的mapreduce程序,主要目的是计算环比值最高的前5名,本来打算使用spar ...
- VBA SQLServer 基本操作
读取MS SQL Server数据表数据,并将它保存到excel工作表中 Sub ReturnSQLrecord() 'sht 为excel工作表对象变量,指向某一工作表 Dim i As Int ...
- Android第三方开源对话消息提示框:SweetAlertDialog(sweet-alert-dialog)
Android第三方开源对话消息提示框:SweetAlertDialog(sweet-alert-dialog) Android第三方开源对话消息提示框:SweetAlertDialog(sweet- ...
- ionicModal中的监听事件
//添加监听事件angular.module('MyApp').directive('gotTapped', ['$ionicGesture', function($ionicGesture) { r ...