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)是一种离线数据结构,使用函数式线段树维护每一时刻离散之后的数字出现的次数,由于各历史版本的线段树结构一致,可以相减得出区间信息,即该区间内出现的数字和 ...
随机推荐
- 英语中的 姓氏/Surname
.Chomsky (Belarusian: Хомскі, Russian: Хомский, Ukrainian: Хомський, Hebrew: חומסקי, "from (V ...
- php 工作模式
PHP运行模式 1.cgi通用网关接口 (少用)2.fast-cgi常驻型的 cgi [ngixn常用]3.cli命令运行 (命令行用得多)4.web模块模式(apache等web服务器的运行模式)[ ...
- asp.net <% %>,<%# %>,<%= %>,<%$ %>区别大集合
前台页面 <div><%--可以执行服务器代码,相当于在后台写代码,Render%><%=取后台变量或方法值,只能绑定客户端控件,绑定服务器控件时后来必须调用databi ...
- normalize.css介绍
Normalize.css 只是一个很小的CSS文件,但它在默认的HTML元素样式上提供了跨浏览器的高度一致性.相比于传统的CSS reset,Normalize.css是一种现代的.为HTML5准备 ...
- 在SQL中导入Excel数据时强制以文本类型导入
Excel不是关系型数据库,在导入到sql中时对于数值型,sql有时int型会处理成float,有时数字文本混排的列,sql会认为是数值型,导入的结果有的数据变成了null,但是用sql导出excel ...
- 从Windows远程Ubuntu
关键字:Windows,Ubuntu,Putty,WinSCP OS:Windows 7,Ubuntu. 1.下载Putty:http://www.putty.org/. 2.双击运行putty.ex ...
- 2014年辛星完全解读Javascript第一节
***************概述*************** 1.Javascript是一种原型化继承的基于对象的动态类型的脚本语言,它区分大小写,主要运行在客户端,用户即使响应用户的操作并进行数 ...
- 在使用Fake framework的时候,为什么有一些函数没有生产mock呢?
在使用Visual studio 2012 的Fake framework 做单元测试的时候,你会发现有一些函数没有生产Stub 或者 Shim的版本,这可能是由于Fake的一些限制导致的,但如何知道 ...
- 时钟周期、振荡周期、机器周期、CPU周期、状态周期、指令周期、总线周期、任务周期
http://blog.csdn.net/yangtalent1206/article/details/5853017 计算机系统有一系列的“周期”概念,区别.联系地理解这些概念至关重要.以下对时钟周 ...
- android打造万能的适配器(转)
荒废了两天,今天与大家分享一个ListView的适配器 前段时间在学习慕课网的视频,觉得这种实现方式较好,便记录了下来,最近的项目中也使用了多次,节省了大量的代码,特此拿来与大家分享一下. 还是先看图 ...