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)是一种离线数据结构,使用函数式线段树维护每一时刻离散之后的数字出现的次数,由于各历史版本的线段树结构一致,可以相减得出区间信息,即该区间内出现的数字和 ...
随机推荐
- 【开发】Form Validate 表单验证 扩展应用
目录: ★.文本输入框(easyui-textbox) ★.数字框(easyui-numberbox) ★.时间(easyui-datebox) ★.文本域(easyui-textbox easyui ...
- nodejs-fs使用
(1)读取文本文件时须添加上'encoding'才能输出可读的内容. 02.txt hello,world! nodejs_readfile.js var fs = require('fs'); fs ...
- 程序员面试题精选100题(16)-O(logn)求Fibonacci数列[算法]
作者:何海涛 出处:http://zhedahht.blog.163.com/ 题目:定义Fibonacci数列如下: / 0 n=0 f(n)= ...
- Java Web开发之详解JSP
JSP作为Java Web开发中比较重要的技术,一般当作视图(View)的技术所使用,即用来展现页面.Servlet由于其本身不适合作为表现层技术,所以一般被当作控制器(Controller)所使用, ...
- centos用yum安装mysql-server
1.安装:#yum -y install mysql-server 2.修改配置:#vi /etc/my.cnf 暂时修改一下编码(添加在密码下方添加): default-character-set ...
- Centos系统mysql 忘记root用户的密码
Centos系统mysql 忘记root用户的密码: 第一步:(停掉正在运行的mysql) [root@maomao ~]# /etc/init.d/mysqld stop Stopping MySQ ...
- 【python】Python 3 +pycharm中文支持解决方案
使用环境:window10 + python 3.5.1 方法:在代码前端增加代码:# -*-coding:gbk-*-
- 如何在dapper中获取刚插入行的ID
二话不说: 1.先建立个表 CREATE TABLE [dbo].[UserInfo]( [ID] [int] IDENTITY(1,1) NOT NULL, [UserName] [nc ...
- Substring的简单使用
string myString = "测试一下函数Substring()是怎么用的"; //Substring()在C#中有两个重载函数 //分别如下示例 //如果参数为一个长整数 ...
- chrome extension/plugin path
C:\Users\Administrator\AppData\Local\Google\Chrome\User Data\Default\Extensions