题目传送门:https://ac.nowcoder.com/acm/contest/1107/C

题意:给出一个区间,求最大的 h ,使得区间内至少有 h 个数 大于等于 h.

思路:1.需要区间有序,那么就需要使用 主席树。

   2.二分答案。

    2.1 —— 一开始我的思路是直接对每一个查询二分答案 h。

        然后判断第 len(区间个数)-h+1 小是否大于等于 h,这样二分得出最大h,但是T了。

        一开始以为是卡常了,于是各种 骚操作 还是没有什么卵用。

        于是在一次优化 “ 由于n小可以去掉离散化” ,依然T了之后。忽然发现可以直接二分位置,也就是直接在主席树查询中直接找到答案。

    2.2 —— 在查询过程中,我们就不断的二分位置,判定条件是:

        主席树中,

        h右边的个数是否大于h,如果是,那么就往右子树走,否则就往左子树走。

        记得不要离散化,因为我们二分的是位置,而不是大小。

 

//#pragma comment(linker, "/STACK:1024000000,1024000000")
//#pragma GCC optimize(2)
#include <bits/stdc++.h> using namespace std;
typedef double dou;
typedef long long ll;
typedef pair<int, int> pii;
typedef map<int, int> mii; #define pai acos(-1.0)
#define M 4000005
#define inf 0x3f3f3f3f
#define mod 1000000007
#define IN inline
#define W(a) while(a)
#define lowbit(a) a&(-a)
#define left k<<1
#define right k<<1|1
#define lson L, mid, left
#define rson mid + 1, R, right
#define ms(a,b) memset(a,b,sizeof(a))
#define Abs(a) (a ^ (a >> 31)) - (a >> 31)
#define random(a,b) (rand()%(b+1-a)+a)
#define false_stdio ios::sync_with_stdio(false),cin.tie(0),cout.tie(0) int n, cnt, Q;
int num[M];
int T[M], Ls[M], Rs[M], sum[M]; IN int Built(int L, int R) {
int rt = ++cnt;
if (L < R) {
int mid = (L + R) >> ;
Ls[rt] = Built(L, mid);
Rs[rt] = Built(mid + , R);
}
return rt;
} IN int updata(int L, int R, int pre, int id) {
int rt = ++cnt;
Ls[rt] = Ls[pre], Rs[rt] = Rs[pre], sum[rt] = sum[pre] + ;
if (L < R) {
int mid = (L + R) >> ;
if (id <= mid)Ls[rt] = updata(L, mid, Ls[pre], id);
else Rs[rt] = updata(mid + , R, Rs[pre], id);
}
return rt;
} //Rtot是上一个节点的右子节点的个数
IN int query(int u, int v, int L, int R, int Rtot) {
if (L == R)return L;
int R_sum = sum[Rs[v]] - sum[Rs[u]];//右子节点的个数
int mid = (L + R) >> ;
//判定条件
if (mid - Rtot + > R_sum)return query(Ls[u], Ls[v], L, mid, Rtot + R_sum);
else return query(Rs[u], Rs[v], mid + , R, Rtot);
} IN int read() {//读入挂
int x = ; bool f = ; char ch = getchar();
while (ch < '' || '' < ch)
f |= ch == '-', ch = getchar();
while ('' <= ch && ch <= '')
x = x * + ch - '', ch = getchar();
return f ? -x : x;
} int main() {
W(scanf("%d%d", &n, &Q) != EOF) {
cnt = ;
T[] = Built(, n);
for (register int i = ; i <= n; i++)num[i] = read();
for (register int i = ; i <= n; i++)T[i] = updata(, n, T[i - ], num[i]); int l, r;
W(Q--) {
l = read(), r = read();
printf("%d\n", query(T[l - ], T[r], , n, ));
}
}
return ;
}

        

主席树的妙用——Just h-index的更多相关文章

  1. SPOJ 3267 D-query(离散化+主席树求区间内不同数的个数)

    DQUERY - D-query #sorting #tree English Vietnamese Given a sequence of n numbers a1, a2, ..., an and ...

  2. bzoj1926[Sdoi2010]粟粟的书架 二分 主席树

    1926: [Sdoi2010]粟粟的书架 Time Limit: 30 Sec  Memory Limit: 552 MBSubmit: 1064  Solved: 421[Submit][Stat ...

  3. 主席树——求区间[l,r]不同数字个数的模板(向左密集 D-query)

    主席树的另一种用途,,(还有一种是求区间第k大,区间<=k的个数) 事实上:每个版本的主席树维护了每个值最后出现的位置 这种主席树不是以权值线段树为基础,而是以普通的线段树为下标的 /* 无修改 ...

  4. Codeforces 1000F One Occurrence 主席树|| 离线+线段树

    One Occurrence 为什么我半年前这么菜呀, 这种场只A三题... 我们在主席树 || 线段树上维护每个数的右边和它一样的数在哪里, 然后就变成了区间求最大值. 注意加进去的时候要把它右边一 ...

  5. ZOJ 2112 Dynamic Rankings (动态第k大,树状数组套主席树)

    Dynamic Rankings Time Limit: 10 Seconds      Memory Limit: 32768 KB The Company Dynamic Rankings has ...

  6. SPOJ 10628. Count on a tree (树上第k大,LCA+主席树)

    10628. Count on a tree Problem code: COT You are given a tree with N nodes.The tree nodes are number ...

  7. SPOJ 3267. D-query (主席树,查询区间有多少个不相同的数)

    3267. D-query Problem code: DQUERY English Vietnamese Given a sequence of n numbers a1, a2, ..., an  ...

  8. BZOJ3295: [Cqoi2011]动态逆序对(树状数组套主席树)

    3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 7465  Solved: 2662[Submit][Sta ...

  9. SPOJ - TTM 主席树

    给你一个系列\(a[1...n]\),要求可以区间求和,区间更新,也可以回溯过去 经典的主席树板子题,很久以前做的题了,代码太丑回炉重写 PS.题目标题To The Moon也是我最喜欢的游戏之一 这 ...

随机推荐

  1. 019、Java中定义字符

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  2. nginx配置多个项目

    使用Nginx要在同一个域名下配置多个项目有两种方式: nginx按不同的目录分发给不同的项目 启用二级域名,不同的项目分配不同的二级域名 1.nginx按不同的目录分发给不同的项目: server ...

  3. NIO三大组件简介

    NIO简介 NIO 是面向缓冲区(或者说面向块)编程的, 因为Buffer底层本质上就是内存块.数据被读取到一个缓冲区, 稍后再被它处理, 需要时数据可在缓冲区前后移动, 从而增加了处理过程中的灵活性 ...

  4. Vue2.x双向数据绑定

    1.vue双向绑定原理 vue.js 则是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给 ...

  5. Vue+Axios+Nigix+SpringCloud前端和后端搭建及其碰到的问题

    一.Axios.Router的安装和使用 1.如何安装Axios和Router 1).进入到工程所在的文件夹,通过cmd指令,进入到window的dos界面 2).输入:npm install axi ...

  6. DRF源码-views.py

    REST框架提供了一个APIView类,它是Django View类的子类. 要了解几个特点: 请求中body中的数据全部都封装到了data中(原POST,PUT,PATCH,DELETE中的数据全部 ...

  7. HihoCoder第十周:后序遍历

    也就在大二学数据结构的时候知道了树的前序遍历.后序遍历.中序遍历.之后就忘了,在之后就是大四研究生老师考我,我当时还不知道,真够丢人的.自此之后,知道了如何通过其中两个得到第三个,但是也没有编程实现过 ...

  8. tomcat启动报错The JRE could not be found.Edit the server and change the JRE location

    解决: 在Windows->Preferences->Server->Runtime Environments 选择Tomcat->Edit,在jre中选择相应的jdk版本,完 ...

  9. python 输出六行星号✳

    for i in range(1,6): for j in range(5-i): print(" ",end=" ") for j in range(1,2* ...

  10. maven爬坑

    版本问题 maven源的问题 找不到的jar包 http://www.cnblogs.com/geektown/p/5705405.html http://blog.csdn.net/beyondlp ...