HDU - 6278 Just $h$-index主席树+二分

HDU - 6278 Just hhh-index
【题目描述】
在这里插入图片描述
【题目分析】
题目要求在区间[l,r][l,r][l,r]内大于h的数不少于h个,对于这种最大化问题,我们应该想到二分。
最小情况显然是1.最大情况显然是r−l+1r-l+1rl+1,对于一个hhh,我们如何判断能否满足条件呢?
我们可以用主席树方便的求出区间第h大,如果区间第h大大于等于h,那么就能满足条件
比较伤心的是我虽然一开始就想到了正确的思路但是区间第k大却写错了。因为之前一直写的是将所有数据都放在结构体中,所以一个赋值就讲所有数据复制了,但是这次我想写简单一点,就将计数的数组放在了外面,然后在创建新节点的时候却忘记了复制,导致疯狂wa,还一直找不到为什么,啊啊啊,最终还是调试找到了
【AC代码】(没有借鉴其他人的,嘿嘿)

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#include<climits>
#include<string>
#include<cmath>
#include<cstdlib>using namespace std;const int MAXN=100005;
int a[MAXN];
int n,m;
struct node
{int ls,rs;
}tree[MAXN*40];
int root[MAXN*40];
int cnt[MAXN*40];
int top;void Insert(int &k,int x,int l,int r)
{tree[++top]=tree[k]; cnt[top]=cnt[k];cnt[top]++; k=top;//printf("l=%d r=%d x=%d cnt[%d]=%d\n",l,r,x,k,cnt[k]);if(l==r) return;int mid=(l+r)>>1;if(x<=mid) Insert(tree[k].ls,x,l,mid);else Insert(tree[k].rs,x,mid+1,r);
}int query(int i,int j,int k,int l,int r)
{if(l==r) return l;int tmp=cnt[tree[j].rs]-cnt[tree[i].rs];int mid=(l+r)>>1;if(k<=tmp) return query(tree[i].rs,tree[j].rs,k,mid+1,r);else return query(tree[i].ls,tree[j].ls,k-tmp,l,mid);
}int main()
{int u,v,l,r,mid,ans;while(~scanf("%d%d",&n,&m)){memset(cnt,0,sizeof(cnt));memset(root,0,sizeof(root));memset(tree,0,sizeof(tree));top=0;for(int i=1;i<=n;i++){scanf("%d",&a[i]);root[i]=root[i-1];Insert(root[i],a[i],1,n);}/*for(int i=1;i<=n;i++){printf("%d ",query(root[0],root[n],i,1,n));}*/for(int i=0;i<m;i++){scanf("%d%d",&u,&v);l=1; r=v-u+1;while(l<=r){mid=(l+r)>>1;if(query(root[u-1],root[v],mid,1,n)>=mid){ans=mid;l=mid+1;}else{r=mid-1;}}printf("%d\n",ans);}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/384131.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Socket网络编程--小小网盘程序(3)

http://www.cnblogs.com/wunaozai/p/3891062.html 接上一小节&#xff0c;这次增加另外的两张表&#xff0c;用于记录用户是保存那些文件。增加传上来的文件的文件指纹&#xff0c;使用MD5表示。 两张表如下定义: 1 create table files(2 fid int,3 filename varchar(64),4 md…

LInux下du, df, top, free, pstack, su, sudo, adduser, password命令

1.du命令&#xff1a;du [选项] 文件 (1)功能该命令是显示指定文件以及下的所有文件占用系统数据块的情况&#xff0c;如果没有文件&#xff0c;默认为是当前工作目录 -a    显示所有文件对系统数据块的使用情况 -b    显示数据块大小时以字节为基本单位 -c    除了显…

HDU - 5919 Sequence II——主席树+区间种类++逆序建树

【题目描述】 HDU - 5919 Sequence II 【题目分析】 题目给定一个数组&#xff0c;每次查询一个区间&#xff0c;找出区间内不同数字的个数x&#xff0c;然后输出按出现顺序第x/2向上取整个数字的位置。 按照要求&#xff0c;我们首先需要能够找出给定区间不同的数字个数。 首…

Socket网络编程--小小网盘程序(4)

http://www.cnblogs.com/wunaozai/p/3892729.html 在这一小节中实现了文件的下载&#xff0c;具体的思路是根据用户的uid和用户提供的文件名filename联合两张表&#xff0c;取得md5唯一标识符&#xff0c;然后操作这个标识符对应的文件发送给客户端。 实现下载的小小网盘程序 …

静态顺序表的实现

实现对顺序表的初始化&#xff0c;头插&#xff0c;头删&#xff0c;尾插&#xff0c;尾删&#xff0c; 任意下标的删除&#xff0c; 任意下标处的的元素删除&#xff0c;任意下标处的元素插入&#xff0c;任意元素的下标返回&#xff0c;任意下标处的元素返回&#xff0c; 删除…

树链剖分入门+HYSBZ - 1036树的统计Count

今天学习了树链剖分&#xff0c;记录一下。 【题目背景】 HYSBZ - 1036树的统计Count 【题目分析】 题目要求求任意结点之间路径的和以及路径上最大的结点&#xff0c;还有可能修改。如果正常做可能会很复杂&#xff08;我也不知道正常应该怎么做&#xff0c;应该要用到LCA什么…

Socket网络编程--小小网盘程序(5)

http://www.cnblogs.com/wunaozai/p/3893469.html 各位好呀&#xff01;这一小节应该就是这个小小网盘程序的最后一小节了&#xff0c;这一节将实现最后的三个功能&#xff0c;即列出用户在服务器中的文件列表&#xff0c;还有删除用户在服务器中的文件&#xff0c;最后的可以共…

进程相关概念

1.进程相关概念 进程是代码的一次动态执行&#xff0c;担当分配系统资源的角色&#xff0c;进程信息是被放在一个一个数据结构中&#xff0c;是一个结构体task_struct 2.进程控制块内容 //linux下的进程控制块 struct task_struct {volatile long state;// 说明了该进程是否可以…

SPOJ - QTREE3Query on a tree again!——树链剖分

【题目描述】 SPOJ - QTREE3Query on a tree again! 【题目分析】 题目要求是输出从111到xxx的路径上遇到的第一个黑色的点。我们可以用树链剖分&#xff08;不了解的同学请出门左拐&#xff0c;详见树链剖分入门&#xff09; 我们用线段树维护每个区间第一次遇到黑点的位置&a…

C++中的函数指针和函数对象总结

http://www.cnblogs.com/lvpengms/archive/2011/02/21/1960078.html 篇一、函数指针 函数指针&#xff1a;是指向函数的指针变量&#xff0c;在C编译时&#xff0c;每一个函数都有一个入口地址&#xff0c;那么这个指向这个函数的函数指针便指向这个地址。 函数指针的用途是很…

开发工具

1.编辑器 &#xff08;1&#xff09;vim     vim是从vi发展出来的一个文本编辑器。代码补完、编译错误跳转等方便编程的功能特别丰富&#xff0c;在程序员中被广泛使用。 &#xff08;2&#xff09;sed     sed是一种流编辑器&#xff0c;它一次处理一行内容。处理时…

c++ 智能指针用法详解

http://www.cnblogs.com/TenosDoIt/p/3456704.html 本文介绍c里面的四个智能指针: auto_ptr, shared_ptr, weak_ptr, unique_ptr 其中后三个是c11支持&#xff0c;并且第一个已经被c11弃用。 为什么要使用智能指针&#xff1a;我们知道c的内存管理是让很多人头疼的事&#xff0…

CodeForces - 786BLegacy——线段树建图+最短路

【题目描述】 CodeForces - 786BLegacy 【题目分析】 题目大概意思就是有三种操作&#xff1a; 从某个点到另一个点从某个点到另一个区间从某个区间到另一个点 然后询问从其中一个点到其他所有点的距离——这很显然是一个求单源最短路径的。我们简单的想法显然是建一个图&a…

自主编写shell

1.替换原理 用fork创建子进程后执行的是和父进程相同的程序&#xff08;但有可能执行不同的代码分支&#xff09;&#xff0c;子进程往往要调用一种exec函数以执行例外一个程序。当进程调用一种exec函数时&#xff0c;该进程的用户空间代码和数据完全被新程序替换&#xff0c;从…

HYSBZ - 2243染色——树链剖分+线段树建树技巧

【题目描述】 HYSBZ - 2243染色 【题目分析】 我一直没有看清楚题&#xff0c;以为求的是路径上出现颜色的种类&#xff0c;然后就写了一个区间染色的线段树进行维护&#xff0c;过样例的时候才发现题读错了&#xff0c;人家要求的是路径上出现的颜色段&#xff0c;所以颜色的…

打动态库和静态库

一.动态库和静态库的定义 1.静态库     程序在编译链接时把库的代码链接到可执行文件中。程序运行时就不再需要静态库 2.动态库     程序在运行的时候才去链接动态库的代码&#xff0c;多个程序 共享使用代码 3.动态链接     在执行文件之前&#xff0c;外部…

HYSBZ - 2157树链剖分

【题目描述】 HYSBZ - 2157树链剖分 【题目分析】 这道题给出的是边权而不是点权&#xff0c;但是我们分析这个树就会发现每个节点都只有一个父亲&#xff0c;也就是每条边的边权都可以存放在儿子节点上&#xff0c;然后在遍历路径的时候我们在从前往后遍历&#xff0c;但是注…

C++11中的右值引用

http://www.cnblogs.com/yanqi0124/p/4723698.html 在C98中有左值和右值的概念&#xff0c;不过这两个概念对于很多程序员并不关心&#xff0c;因为不知道这两个概念照样可以写出好程序。在C11中对右值的概念进行了增强&#xff0c;我个人理解这部分内容是C11引入的特性中最难以…

BZOJ2115XOR——线性基

【题目描述】 BZOJ2115XOR——线性基 【题目分析】 这道题看完以后很懵逼&#xff0c;人家要是走的很复杂呢&#xff1f;各种绕来绕去怎么办&#xff1f; 首先我们应该注意到一个很明显的道理&#xff1a;重复的路径会和自身抵消&#xff0c;所以我们大可以随便跑&#xff0c;…

单链表的相关操作

1.冒泡排序对单链表进行排序 void LinkListBubbleSort(LinkNode* head) {if(head NULL){ return;//空链表} if(head -> next NULL){ return;//只有一个结点} LinkNode* cur head;//趟数LinkNode* tail NULL;//尾指针LinkNode* tmp head;//次数for(; cur -…