poj2761Feed the dogs(划分树-区间K值)
这树着实不好理解啊
讲解http://www.cnblogs.com/pony1993/archive/2012/07/17/2594544.html
对于找K值 右区间的确定不是太理解。。先当模板贴着吧
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<stdlib.h>
using namespace std;
#define N 100010
int tree[][N],sum[][N];//每层的数 及每层截止到i会放进左子树的个数
int cu[N],xu[N];//原数据 及排序后的数据
void build(int c,int l,int r)
{
int i,m = (l+r)>>;
int o = m-l+,rp = m+,lp = l;
for(i = l ; i <= m ; i++)//左子树中与xu[m]相同的个数
if(xu[i]<xu[m])
o--;
for(i = l ; i <= r ; i++)
{
if(i==l)
sum[c][i] = ;
else
sum[c][i] = sum[c][i-];//维护一下 到I为止被分配到左子树中的个数
if(tree[c][i]==xu[m])
{
if(o)
{
sum[c][i]++;
o--;
tree[c+][lp++] = xu[m];//分配到左子树中
}
else
tree[c+][rp++] = tree[c][i];
}
else if(tree[c][i]<xu[m])
{
sum[c][i]++;
tree[c+][lp++] = tree[c][i];
}
else
tree[c+][rp++] = tree[c][i];//分配到右子树中
}
if(l==r) return ;
build(c+,l,m);
build(c+,m+,r);
}
int query(int a,int b,int k,int c,int l,int r)
{
if(l==r)
{
return tree[c][l];
}
int m = (l+r)>>;
int s,ss;
if(a==l)//这里特殊处理一下 sum没初始化 不然不处理应该也可以
{
s = ;
ss = sum[c][b];
}
else
{
s = sum[c][a-];
ss = sum[c][b]-s;
}
if(k<=ss)
{
return query(l+s,l+s+ss-,k,c+,l,m);
}
else
return query(m-l++a-s,m-l++b-s-ss,k-ss,c+,m+,r); }
int main()
{
int i,n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i = ; i <= n ; i++)
{
scanf("%d",&cu[i]);
tree[][i] = cu[i];
xu[i] = cu[i];
}
sort(xu+,xu+n+);
build(,,n);
while(m--)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
int ans = query(a,b,c,,,n);
printf("%d\n",ans);
}
}
return ;
}
poj2761Feed the dogs(划分树-区间K值)的更多相关文章
- poj2104 划分树 区间K大 在线 无修改
博主sbit....对于高级数据结构深感无力,然后这些东西在OI竟然烂大街了,不搞就整个人都不好了呢. 于是我勇猛的跳进了这个大坑 ——sbit 区间K大的裸题,在线,无修改. 可以用归并树(\(O( ...
- hdu2852KiKi's K-Number(区间K值)
http://acm.hdu.edu.cn/showproblem.php?pid=2852 区间K值写错了... #include <iostream> #include<cstd ...
- 【bzoj4695】最假女选手 线段树区间最值操作
题目描述 给定一个长度为 N 序列,编号从 1 到 N .要求支持下面几种操作:1.给一个区间[L,R] 加上一个数x 2.把一个区间[L,R] 里小于x 的数变成x 3.把一个区间[L,R] 里大于 ...
- 【bzoj4355】Play with sequence 线段树区间最值操作
题目描述 维护一个长度为N的序列a,现在有三种操作: 1)给出参数U,V,C,将a[U],a[U+1],...,a[V-1],a[V]都赋值为C. 2)给出参数U,V,C,对于区间[U,V]里的每个数 ...
- 【hdu5306】Gorgeous Sequence 线段树区间最值操作
题目描述 给你一个序列,支持三种操作: $0\ x\ y\ t$ :将 $[x,y]$ 内大于 $t$ 的数变为 $t$ :$1\ x\ y$ :求 $[x,y]$ 内所有数的最大值:$2\ x\ y ...
- HUD.2795 Billboard ( 线段树 区间最值 单点更新 单点查询 建树技巧)
HUD.2795 Billboard ( 线段树 区间最值 单点更新 单点查询 建树技巧) 题意分析 题目大意:一个h*w的公告牌,要在其上贴公告. 输入的是1*wi的w值,这些是公告的尺寸. 贴公告 ...
- HDU 4417 (划分树+区间小于k统计)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4417 题目大意:给定一个区间,以及一个k值,求该区间内小于等于k值的数的个数.注意区间是从0开始的 ...
- HDU-1754I Hate It 线段树区间最值
这道题比较基本,就是用线段树维护区间最值,可以算是模板吧-.. I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768 ...
- poj2104 主席树 区间K大 在线 无修改
关于主席树: 主席树(Chairman Tree)是一种离线数据结构,使用函数式线段树维护每一时刻离散之后的数字出现的次数,由于各历史版本的线段树结构一致,可以相减得出区间信息,即该区间内出现的数字和 ...
随机推荐
- Poj 1013 Counterfeit Dollar / OpenJudge 1013(2692) 假币问题
1.链接地址: http://poj.org/problem?id=1013 http://bailian.openjudge.cn/practice/2692 http://bailian.open ...
- Arrays 标准库算法
Binary Search public static int binarySearch0(Object[] a, int fromIndex, int toIndex, Object key) { ...
- wifidog编译到openwrt
首先敲一下 cd 命令,定位到自己的用户目录, 然后 mkdir openwrt 新建一个openwrt文件夹,然后开始装openwrt的编译用到的工具, sudo apt-get install g ...
- textarea限定字数提示效果
最近工作中要实现的一个效果是:在textarea中输入字符会提示剩余多少字符可输入.于是马不停蹄的开始查阅资料. HTML代码: <table> <colgroup> < ...
- javascript基础DOM操作
DOM 中的三个字母,D(文档)可以理解为整个 Web 加载的网页文档:O(对象)可以理解为类似 window 对象之类的东西,可以调用属性和方法,这里我们说的是 document对象:M(模型)可以 ...
- ubuntu 12 64 桌面版Oracle11g 安装
1.Creating the Oracle Inventory Group sudo groupadd oinstall sudo groupadd dba sudo groupadd oper su ...
- Python复杂多重排序
1. cmp函数是python自带的函数,用于比较两个参数哪个大哪个小 print cmp(2, 3) # -1 如果第一个参数比第二个小,就返回-1,两个元素相等,返回0,否则返回1 2.所以就可以 ...
- codeforce #339(div2)C Peter and Snow Blower
Peter and Snow Blower 题意:有n(3 <= n <= 100 000)个点的一个多边形,这个多边形绕一个顶点转动,问扫过的面积为多少? 思路:开始就认为是一个凸包的问 ...
- MVC-简单验证码制作
1.制作验证码: using System; using System.Collections.Generic; using System.Drawing; using System.Drawing. ...
- CODEVS 3943 数学奇才琪露诺
[题目描述 Description] 作为上白泽慧音老师的出色弟子,数学奇才琪露诺在算术方面有很深的造诣.今天,codevs有幸请到了这位数学界的奇葩作为本场考试的第一题主考官. 琪露诺喜欢0-9之间 ...