划分树---Feed the dogs
Description
Wind loves pretty dogs very much, and she has n pet dogs. So Jiajia has to feed the dogs every day for Wind. Jiajia loves Wind, but not the dogs, so Jiajia use a special way to feed the dogs. At lunchtime, the dogs will stand on one line, numbered from 1 to n, the leftmost one is 1, the second one is 2, and so on. In each feeding, Jiajia choose an inteval[i,j], select the k-th pretty dog to feed. Of course Jiajia has his own way of deciding the pretty value of each dog. It should be noted that Jiajia do not want to feed any position too much, because it may cause some death of dogs. If so, Wind will be angry and the aftereffect will be serious. Hence any feeding inteval will not contain another completely, though the intervals may intersect with each other.
Input
Each of following m lines contain three integer i,j,k, it means that Jiajia feed the k-th pretty dog in this feeding.
You can assume that n<100001 and m<50001.
Output
Sample Input
7 2
1 5 2 6 3 7 4
1 5 3
2 7 1
Sample Output
3
2 题意:给了一个数列,求某个区间的第k大数。 思路:使用划分树算法,方便多次查询指定区间的第k大数。 代码如下:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn=;
int sor[maxn]; struct node
{
int num[maxn];
int cnt[maxn];
}tree[]; void buildtree(int l, int r, int d)
{
if (l == r)
{
return;
}
int mid = (l+r)>>;
int oplift = l, opright = mid+; ///对左右子树的操作位置的初始化
int same_as_mid = ;
///用来计算在mid左边有多少个和sor[mid]相同的数(包括mid),这些都要放到左子树
for (int i = mid; i > ; i--)
{
if (sor[i] == sor[mid])
same_as_mid++;
else
break;
}
int cnt_lift = ;
for (int i = l; i <= r; i++)
{
if (tree[d].num[i] < sor[mid])
{
tree[d+].num[oplift++] = tree[d].num[i];
cnt_lift++;
tree[d].cnt[i] = cnt_lift;
}
else if(tree[d].num[i] == sor[mid] && same_as_mid)
{
tree[d+].num[oplift++] = tree[d].num[i];
cnt_lift++;
tree[d].cnt[i] = cnt_lift;
same_as_mid--;
}
else
{
tree[d].cnt[i] = cnt_lift;
tree[d+].num[opright++] = tree[d].num[i];
}
}
buildtree(l, mid, d+);
buildtree(mid+, r, d+);
} int query(int l, int r, int d, int ql, int qr, int k)
{
if (l == r)
return tree[d].num[l];
int mid = (l+r)>>;
int sum_in_lift, lift;
if (ql == l)
{
sum_in_lift = tree[d].cnt[qr];
lift = ;
}
else
{
sum_in_lift = tree[d].cnt[qr] - tree[d].cnt[ql-];
/// 区间进入左子树的总和
lift = tree[d].cnt[ql-];
}
if (sum_in_lift >= k)
///证明要找的点在左子树
{
int new_ql = l+lift;
int new_qr = l+lift+sum_in_lift-;
return query(l, mid, d+, new_ql, new_qr, k);
///这里有必要解释一下,我们要确定下一步询问的位置,如果在ql的左边有i个进入左子树,
///那么ql到qr中第一个进入左子树的必定在l+i的位置
}
else
{
int a = ql - l - lift;
int b = qr - ql + - sum_in_lift;
int new_ql = mid + a + ;
int new_qr = mid + a + b;
return query(mid+, r, d+, new_ql, new_qr, k - sum_in_lift);
}
} int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(int i=;i<=n;i++)
{
scanf("%d",&tree[].num[i]);
sor[i]=tree[].num[i];
}
sort(sor+,sor+n+);
buildtree(,n,);
while(m--)
{
int l,r,k;
scanf("%d%d%d",&l,&r,&k);
int ans=query(,n,,l,r,k);
printf("%d\n",ans);
}
}
}
划分树---Feed the dogs的更多相关文章
- POJ 2761 Feed the dogs(平衡树or划分树or主席树)
Description Wind loves pretty dogs very much, and she has n pet dogs. So Jiajia has to feed the dogs ...
- POJ 题目2761 Feed the dogs(主席树||划分树)
Feed the dogs Time Limit: 6000MS Memory Limit: 65536K Total Submissions: 16860 Accepted: 5273 De ...
- POJ 2761 Feed the dogs (主席树)(K-th 值)
Feed the dogs Time Limit: 6000MS Memor ...
- poj 2761 Feed the dogs (treap树)
/************************************************************* 题目: Feed the dogs(poj 2761) 链接: http: ...
- [划分树] POJ 2104 K-th Number
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 51732 Accepted: 17722 Ca ...
- poj 2104 K-th Number (划分树入门 或者 主席树入门)
题意:给n个数,m次询问,每次询问L到R中第k小的数是哪个 算法1:划分树 #include<cstdio> #include<cstring> #include<alg ...
- hdu2665 && poj2104划分树
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 47066 Accepted: 15743 Ca ...
- poj 2104:K-th Number(划分树,经典题)
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 35653 Accepted: 11382 Ca ...
- sdut 2610:Boring Counting(第四届山东省省赛原题,划分树 + 二分)
Boring Counting Time Limit: 3000ms Memory limit: 65536K 有疑问?点这里^_^ 题目描述 In this problem you a ...
随机推荐
- Xcode编译错误集锦
1.在将ios项目进行Archive打包时,Xcode提示以下错误: [BEROR]CodeSign error: Certificate identity ‘iPhone Distribution: ...
- Windows 8.1 Preview 开发资源汇总
Microsoft Build 2013开发者大会已经结束,从Session安排上看主要以Windows 8.1为主.我相信大家有已经或多或少的体验过Windows 8.1 Preview了,关于操作 ...
- wireshark解密本地https流量笔记
此方式支持firefox,chrome 建立path变量 SSLKEYLOGFILE=c:\ssl.key 重启firefox chrome,访问https网站会自动生成ssl session key ...
- C、C++编译,链接,extern链接
//b.cpp #inlcude <iostream> void b() { std::cout<<"fun b"; } //a.cpp extern vo ...
- IOS的启动画面的适配问题
iPhone4,iPhone4s 分辨率960*640 长宽比1.5iPhone5,iPhone5s 分辨率1136*640 长宽比1.775iPhone6 分辨率1334*750 长宽比1.778i ...
- 【转】ORATOP工具使用说明
文章转自:http://lintzyuan.blogspot.jp/2014/07/oratop.html ORATOP 前言:隨著PC Server的規格及速度愈來愈快,大多數的公司摒棄大型主機 ...
- mysql安装出现error Nr.1045 (转)
http://www.cnblogs.com/Ivan-j2ee/archive/2012/09/22/2698278.html 我们在windows下安装mysql时会出现Access denied ...
- 进阶学习js中的执行上下文
在js中的执行上下文,菜鸟入门基础 这篇文章中我们简单的讲解了js中的上下文,今天我们就更进一步的讲解js中的执行上下文. 1.当遇到变量名和函数名相同的问题. var a = 10; functio ...
- Sass学习之路:Sass、Compass安装与命令行
导言 CSS不是一门真正意义上的编程语言,很多编程语言理所当然的特性(比如变量),都不被支持.同时再开发模块化的web项目的时候,也要避免相互干扰.为了弥补CSS的这些不足,就产生了CSS预处理器,S ...
- get新技能: 如何设置元素高度与宽度成特定比例。宽度改变,高度自动按比例改变。 例如设置宽高比16:9。
设置宽高比在很多时候是有用的. 下面的栗子,我们设置一个容器的宽高比为16:9 //HTML代码片段 <div class="container"> <div c ...