POJ  2761

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.

Your task is to help Jiajia calculate which dog ate the food after each feeding. 

Input

The first line contains n and m, indicates the number of dogs and the number of feedings. 
The second line contains n integers, describe the pretty value of each dog from left to right. You should notice that the dog with lower pretty value is prettier.

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

Output file has m lines. The i-th line should contain the pretty value of the dog who got the food in the i-th feeding.

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的更多相关文章

  1. 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 ...

  2. POJ 题目2761 Feed the dogs(主席树||划分树)

    Feed the dogs Time Limit: 6000MS   Memory Limit: 65536K Total Submissions: 16860   Accepted: 5273 De ...

  3. POJ 2761 Feed the dogs (主席树)(K-th 值)

                                                                Feed the dogs Time Limit: 6000MS   Memor ...

  4. poj 2761 Feed the dogs (treap树)

    /************************************************************* 题目: Feed the dogs(poj 2761) 链接: http: ...

  5. [划分树] POJ 2104 K-th Number

    K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 51732   Accepted: 17722 Ca ...

  6. poj 2104 K-th Number (划分树入门 或者 主席树入门)

    题意:给n个数,m次询问,每次询问L到R中第k小的数是哪个 算法1:划分树 #include<cstdio> #include<cstring> #include<alg ...

  7. hdu2665 && poj2104划分树

    K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 47066   Accepted: 15743 Ca ...

  8. poj 2104:K-th Number(划分树,经典题)

    K-th Number Time Limit: 20000MS   Memory Limit: 65536K Total Submissions: 35653   Accepted: 11382 Ca ...

  9. sdut 2610:Boring Counting(第四届山东省省赛原题,划分树 + 二分)

    Boring Counting Time Limit: 3000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述     In this problem you a ...

随机推荐

  1. sql 查询 – left join on

      1. 问题引入   主要是为了查询在一个表中出现,而不在另一个表中出现的数据,具体来说: 如下图所示, 有A.B两个表,其中B表的Aid字段参照A表的主键id,为了查询在A表中出现,却没有被B表引 ...

  2. boost 1.56.0 编译及使用

    boost的编译和使用,经过搜集资料和总结,记录成文.感谢文后所列参考资料的作者. 1 下载 地址:http://sourceforge.net/projects/boost/files/boost/ ...

  3. Ranorex入门指南

    Ranorex入门指南 http://automationqa.com/forum.php?mod=viewthread&tid=2766&fromuid=29

  4. Day One studying english

    I start study english lately,but the is no basis for english.Only i use baidu translation,google tra ...

  5. [PaPaPa][需求说明书][V2.0]

    前   言 大家好,我是“今晚打老虎”. 什么? 你问我为什么这次亮字号了? 还不是因为哥太出名了,即使我不亮你们也知道是我写的了. 自从发布了V1.0版本之后.群里又进来好多人.30K大大分发的任务 ...

  6. oracle create table(转)

    //建测试表 create table dept( deptno number(3) primary key, dname varchar2(10), loc varchar2(13) ); crea ...

  7. php 类文件加载 Autoloader

    做习惯了编译语言,转到php 使用 php的面向对象开发时候遇见一个挺别扭的问题.在Php中引入对象 后 在调用过程中还需要将对象所在的php文件 require 到当前php文件 目前代码结构 in ...

  8. 如何复制DataRow(dataTabel中的行)

    由于需要对dataTabel中的行进行上移和下移操作: row 1      行号0 row2       行号1 row3       行号2 例如将row3上移一行,即row2和row3对调位置. ...

  9. java基本加密算法

    简单的java加密算法有: BASE64 严格地说,属于编码格式,而非加密算法 MD5(Message Digest algorithm 5,信息摘要算法) SHA(Secure Hash Algor ...

  10. windows下mysql开启远程访问权限

    1.mysql -u root -p 2.use mysql 3.GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '密码' WITH G ...