POJ 题目2761 Feed the dogs(主席树||划分树)
Time Limit: 6000MS | Memory Limit: 65536K | |
Total Submissions: 16860 | Accepted: 5273 |
Description
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 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
Sample Input
7 2
1 5 2 6 3 7 4
1 5 3
2 7 1
Sample Output
3
2
Source
POJ Monthly--2006.02.26,zgl & twb
求区间第k大值
ac代码
主席树版本号
Problem: 2761 User: kxh1995
Memory: 24508K Time: 2813MS
Language: C++ Result: Accepted
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
int a[100010],t[100010];
int T[100010*30],lson[100010*30],rson[100010*30],c[100010*30];
int n,m,cnt,tot;
void init_hash()
{
int i;
for(i=1;i<=n;i++)
t[i]=a[i];
sort(t+1,t+1+n);
cnt=unique(t+1,t+1+n)-t-1;
}
int build(int l,int r)
{
int root=tot++;
c[root]=0;
if(l!=r)
{
int mid=(l+r)>>1;
lson[root]=build(l,mid);
rson[root]=build(mid+1,r);
}
return root;
}
int hash(int x)
{
return lower_bound(t+1,t+1+cnt,x)-t;
}
int update(int root,int pos,int val)
{
int newroot=tot++;
int temp=newroot;
c[newroot]=c[root]+val;
int l=1,r=cnt;
while(l<r)
{
int mid=(l+r)>>1;
if(pos<=mid)
{
lson[newroot]=tot++;
rson[newroot]=rson[root];
newroot=lson[newroot];
root=lson[root];
r=mid;
}
else
{
rson[newroot]=tot++;
lson[newroot]=lson[root];
newroot=rson[newroot];
root=rson[root];
l=mid+1;
}
c[newroot]=c[root]+val;
}
return temp;
}
int query(int l_root,int r_root,int k)
{
int l=1,r=cnt;
while(l<r)
{
int mid=(l+r)>>1;
if(c[lson[l_root]]-c[lson[r_root]]>=k)
{
r=mid;
l_root=lson[l_root];
r_root=lson[r_root];
}
else
{
l=mid+1;
k-=c[lson[l_root]]-c[lson[r_root]];
l_root=rson[l_root];
r_root=rson[r_root];
}
}
return l;
}
int main()
{
//int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
int i;
tot=0;
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
init_hash();
T[n+1]=build(1,cnt);
for(i=n;i>0;i--)
{
int pos=hash(a[i]);
T[i]=update(T[i+1],pos,1);
}
while(m--)
{
int l,r,k;
scanf("%d%d%d",&l,&r,&k);
printf("%d\n",t[query(T[l],T[r+1],k)]);
}
}
}
划分树版本号
Problem: 2761 User: kxh1995
Memory: 18988K Time: 2000MS
Language: C++ Result: Accepted
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int tree[30][100100],sorted[100010],toleft[30][100010];
int cmp(const void *a,const void *b)
{
return *(int *)a-*(int *)b;
}
void build(int l,int r,int dep)
{
if(l==r)
{
return;
}
int mid=(l+r)>>1;
int same=mid-l+1;
int i;
for(i=l;i<=r;i++)
if(tree[dep][i]<sorted[mid])
same--;
int lpos=l;
int rpos=mid+1;
for(i=l;i<=r;i++)
{
if(tree[dep][i]<sorted[mid])
{
tree[dep+1][lpos++]=tree[dep][i];
}
else
if(tree[dep][i]==sorted[mid]&&same>0)
{
tree[dep+1][lpos++]=tree[dep][i];
same--;
}
else
tree[dep+1][rpos++]=tree[dep][i];
toleft[dep][i]=toleft[dep][l-1]+lpos-l;
}
build(l,mid,dep+1);
build(mid+1,r,dep+1);
}
int query(int L,int R,int l,int r,int dep,int k)
{
if(l==r)
{
return tree[dep][l];
}
int mid=(L+R)>>1;
int cnt=toleft[dep][r]-toleft[dep][l-1];
if(cnt>=k)
{
int newl=L+toleft[dep][l-1]-toleft[dep][L-1];
int newr=newl+cnt-1;
return query(L,mid,newl,newr,dep+1,k);
}
else
{
int newr=r+toleft[dep][R]-toleft[dep][r];
int newl=newr-(r-l-cnt);
return query(mid+1,R,newl,newr,dep+1,k-cnt);
}
}
int main()
{
int n,m;
int i;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(tree,0,sizeof(tree));
for(i=1;i<=n;i++)
{
scanf("%d",&tree[0][i]);
sorted[i]=tree[0][i];
}
qsort(sorted+1,n,sizeof(sorted[1]),cmp);
build(1,n,0);
while(m--)
{
int a,b,k;
scanf("%d%d%d",&a,&b,&k);
int ans=query(1,n,a,b,0,k);
printf("%d\n",ans);
}
}
}
POJ 题目2761 Feed the dogs(主席树||划分树)的更多相关文章
- poj 2761 Feed the dogs (treap树)
/************************************************************* 题目: Feed the dogs(poj 2761) 链接: http: ...
- 归并树 划分树 可持久化线段树(主席树) 入门题 hdu 2665
如果题目给出1e5的数据范围,,以前只会用n*log(n)的方法去想 今天学了一下两三种n*n*log(n)的数据结构 他们就是大名鼎鼎的 归并树 划分树 主席树,,,, 首先来说两个问题,,区间第k ...
- 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 (主席树)(K-th 值)
Feed the dogs Time Limit: 6000MS Memor ...
- poj2104&&poj2761 (主席树&&划分树)主席树静态区间第k大模板
K-th Number Time Limit: 20000MS Memory Limit: 65536K Total Submissions: 43315 Accepted: 14296 Ca ...
- hdu3473 线段树 划分树
//Accepted 28904 KB 781 ms //划分树 //所求x即为l,r区间排序后的中位数t //然后求出小于t的数的和sum1,这个可以用划分树做 //求出整个区间的和sum,可以用O ...
- poj2104 线段树 划分树
学习:http://www.cnblogs.com/pony1993/archive/2012/07/17/2594544.html 划分树的build: 划分树是分层构建的,在构建的t层时,我们可以 ...
- POJ 2761 Feed the dogs
主席树,区间第$k$大. #pragma comment(linker, "/STACK:1024000000,1024000000") #include<cstdio> ...
- 划分树---Feed the dogs
POJ 2761 Description Wind loves pretty dogs very much, and she has n pet dogs. So Jiajia has to fee ...
随机推荐
- JS高级——弹出框的美化
替换原有的alert方法,window.alert=function(){} https://blog.csdn.net/kirsten_z/article/details/76242286 http ...
- Android(java)学习笔记205:JNI之编写jni程序适配所有处理器型号
1. 还是以"02_两个数相加"为例,你会发现这个jni程序只能在ARM处理器下运行,如下: 如果我们让上面的程序运行在x86模拟器上,处理平台不对应,报如下错误: 03-29 ...
- java基础学习之内存分析(栈、堆、方法区)
栈存放:会为每个方法(包括构造函数)开辟一个栈指针,方法执行完毕后,会自动退出,并释放空间,主要每个方法中的存放局部变量 局部变量 先进后出 自下而上存储 方法执行完毕 自动释放空间 堆: 存放n ...
- ANNOTATION and analyse hello1.java
一.What is annotation? annotation的中文意思就是注解,注释的意思.注解也属于一种类型.它是在 Java SE 5.0 版本中开始引入的概念.它的形式跟接口很类似,不过前面 ...
- 以POST方式推送JSON数据,并接收返回的服务器消息
private static string GetResult(string jsonString, string type) { string url = GetUrl(type); string ...
- oracle关闭
Alert log 要每天查看 abort 关闭冷备会无法使用
- python3 http.server备忘
python3英文的 打印出来应该不错: https://docs.python.org/3/library/http.server.html#module-http.server python2.7 ...
- Liunx学习笔记(三) 文件权限
一.文件权限 1.查看文件权限 (1)文件权限 在 Linux 中对于文件有四种访问权限,列举如下: 可读取:r,Readable 可写入:w,Writable 可执行:x,Execute 无权限:- ...
- 通过response对象的sendRedirect方法重定向网页
通过response对象的sendRedirect方法重定向网页 制作人:全心全意 使用response对象提供的sendRedirect()方法可以将网页重定向到另一个页面.重定向操作支持将地址重定 ...
- MySQL Insert数据量过大导致报错 MySQL server has gone away
接手了同事的项目,其中有一个功能是保存邮件模板(包含图片),同事之前的做法是把图片进行base64编码然后存在mysql数据库中(字段类型为mediumtext)然后保存三张图片(大概400k)的时候 ...