L - A Heap of Heaps CodeForces - 538F 主席树
L - A Heap of Heaps
这个是一个还比较裸的静态主席树。
这个题目的意思是把这个数组变成k叉树,然后问构成的树的子树小于等于它的父节点的对数有多少。
因为这个k是从1~n-1 所以直接暴力肯定是不对的,所以可以用主席树来查询区间第k大。
查询的次数大约为n+n/2+n/3+...n/n 差不多是n*log(n) 的复杂度,建个主席树,直接查询即可
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
#define inf 0x3f3f3f3f
#define inf64 0x3f3f3f3f3f3f3f3f
using namespace std;
const int maxn = 2e5 + ;
int n, m, root[maxn], a[maxn], b[maxn], cnt;
int sum[maxn << ], lc[maxn << ], rc[maxn << ]; void build(int &rt, int l, int r) {
rt = ++cnt;
sum[rt] = ;
if (l == r) return;
int mid = (l + r) >> ;
build(lc[rt], l, mid);
build(rc[rt], mid + , r);
// printf("rt=%d l=%d r=%d\n",rt,l,r);
} int update(int rt, int l, int r, int pos) {
// printf("ww rt=%d l=%d r=%d pos=%d\n", rt, l, r, pos);
int id = ++cnt;
sum[id] = sum[rt] + ;
// printf("rt=%d sum[%d]=%d\n", rt, id, sum[id]);
lc[id] = lc[rt], rc[id] = rc[rt];
if (l == r) return id;
int mid = (l + r) >> ;
// printf("mid=%d rt=%d l=%d r=%d pos=%d\n", mid,rt,l,r,pos);
if (pos <= mid) lc[id] = update(lc[id], l, mid, pos);
else rc[id] = update(rc[id], mid + , r, pos);
// printf("rt=%d l=%d r=%d pos=%d\n", rt, l, r, pos);
return id;
} int query(int l, int r, int u, int v, int h) {
int mid = (l + r) >> ;
int x = sum[lc[v]] - sum[lc[u]];
//printf("l=%d r=%d u=%d v=%d h=%d mid=%d x=%d %d\n", l, r, u, v, h, mid, x, sum[v] - sum[u]);
if (l == r) return sum[v] - sum[u];
//printf("ww l=%d r=%d u=%d v=%d h=%d mid=%d x=%d\n", l, r, u, v, h, mid, x);
int ans = ;
if (h <= mid) ans = query(l, mid, lc[u], lc[v], h);
else ans = x + query(mid + , r, rc[u], rc[v], h);
return ans;
} int main() {
cnt = ;
scanf("%d", &n);
for (int i = ; i <= n; i++) scanf("%d", &a[i]), b[i] = a[i];
sort(b + , b + + n);
int len = unique(b + , b + + n) - b - ;
//printf("len=%d\n", len);
build(root[], , len);
for (int i = ; i <= n; i++) {
a[i] = lower_bound(b + , b + + len, a[i]) - b;
// printf("a[%d]=%d\n", i, a[i]);
root[i] = update(root[i - ], , len, a[i]);
}
// if(len==1)
// {
// for (int i = 1; i < n; i++) printf("0 ");
// printf("\n");
// return 0;
// }
for (int i = ; i <= n - ; i++) {
int j = , ans = ;
while (i*j + <= n) {
int l = i * (j - ) + , r = i * j + ;
if (a[j] - != ) ans += query(, len, root[l], root[r], a[j] - );
j++;
}
if (i*j + > n&&i*(j - ) + <= n) {
int l = i * (j - ) + , r = n;
if (a[j] - != ) ans += query(, len, root[l], root[r], a[j] - );
}
printf("%d ", ans);
}
printf("\n");
return ;
}
主席树
L - A Heap of Heaps CodeForces - 538F 主席树的更多相关文章
- codeforces 813E 主席树
题意: 一个数列多组询问,每次询问[l,r]中最多能选多少个数字,其中每个数字的出现次数不超过k次 题解: 我们保存对于每个位置上,出现超过k次的位置,那么对于每次询问,我们就变成了查询区间[l,r] ...
- Pathwalks CodeForces - 960F(主席树 || 树状数组)
题意: 求树上最长上升路径 解析: 树状数组版: 998ms edge[u][w] 代表以u为一条路的终点的小于w的最长路径的路的条数 · 那么edge[v][w] = max(edge[u][w-1 ...
- bzoj1901: Zju2112 Dynamic Rankings(BIT套主席树)
带修改的题主席树不记录前缀,只记录单点,用BIT统计前缀. 对于BIT上每一个点建一棵主席树,修改和询问的时候用BIT跑,在主席树上做就行了. 3k4人AC的题#256...应该不算慢 #incl ...
- Codeforces 961E 主席树
题意: 给出一个n个数的序列,求有几对(i,j)满足a[i]>=j&&a[j]>=i,(i,j)和(j,i)只能算一对. 考虑第i个数会有几个j(j<i)满足条件,首 ...
- CodeForces - 840D:(主席树求出现区间出现次数大于某值的最小数)
Once, Leha found in the left pocket an array consisting of n integers, and in the right pocket q que ...
- Till I Collapse CodeForces - 786C (主席树区间加,二分最小值)
大意: 给定序列, 将序列划分为若干段, 使得每段不同数字不超过k, 分别求出k=1...n时的答案. 考虑贪心, 对于某个k 从1开始, 每次查询最后一个颜色数<=k的点作为一个划分, 直到全 ...
- 主席树——求区间[l,r]不同数字个数的模板(向左密集 D-query)
主席树的另一种用途,,(还有一种是求区间第k大,区间<=k的个数) 事实上:每个版本的主席树维护了每个值最后出现的位置 这种主席树不是以权值线段树为基础,而是以普通的线段树为下标的 /* 无修改 ...
- BZOJ 3514: Codechef MARCH14 GERALD07加强版 [LCT 主席树 kruskal]
3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 1312 Solved: 501 ...
- SPOJ DQUERY - D-query (莫队算法|主席树|离线树状数组)
DQUERY - D-query Given a sequence of n numbers a1, a2, ..., an and a number of d-queries. A d-query ...
随机推荐
- jetCache 基本使用
1.pom引用 <!--jetcache缓存 lettuce--> <dependency> <groupId>com.alicp.jetcache</gro ...
- python 集合(set)和字典(dictionary)的用法解析
Table of Contents generated with DocToc ditctaionary and set hash 介绍 集合-set 创建 操作和访问集合的元素 子集.超集.相对判断 ...
- php-fpm 进程数的设定
近日,服务器出现异常,网站不能正常访问.经排查是php的问题. 在重启php-fpm时,恢复正常.1分钟之后又出现故障.查看php日志文件 /usr/local/php/var/log 后提示 WAR ...
- AJ学IOS(26)UI之iOS抽屉效果小Demo
AJ分享,必须精品 先看效果 实现过程 第一步,把三个view设置好,还有颜色 #warning 第一步 - (void)addChildView { // left UIView *leftView ...
- AJ学IOS(17)UI之纯代码自定义Cell实现新浪微博UI
AJ分享,必须精品 先看效果图 编程思路 代码创建Cell的步骤 1> 创建自定义Cell,继承自UITableViewCell 2> 根据需求,确定控件,并定义属性 3> 用get ...
- ViewStub
在书上了解了ViewStub,但只是带过两笔,没能了解.在网上搜索了一些资料,虽然很多文章都讲得比较完善,但是觉得可能是表达的原因,导致某个点上我理解错误,慢慢的才算比较清楚的认识ViewStub. ...
- [算法]Miller-Robbin素数判定
目录 一.实现原理 二.应用 判断一个正整数是否为素数 三.小结 一.实现原理 我们以前都是怎么判断素数的呢: 试除法: 若一个正整数N为合数,则存在一个能整除N的数k,其中\(2\leqslant ...
- 设计模式中巧记I/O
一.I/O 1. I/O操作中的设计模式 概要 以设计模式角度,自顶向下理解I/O源码结构 理解字节与字符的关系 1.1 装饰者模式(输入流为例) 背景:通过继承扩展对象耦合度高,使用装饰者扩展可以在 ...
- day22作业
# 1.检索文件夹大小的程序,要求执行方式如下 # python3.8 run.py 文件夹 import os,sys l = sys.argv[1] size = 0 def get_size(f ...
- D - Catch That Cow BFS
农夫知道一头牛的位置,想要抓住它.农夫和牛都于数轴上 ,农夫起始位于点 N(0<=N<=100000) ,牛位于点 K(0<=K<=100000) .农夫有两种移动方式: 1. ...