L - A Heap of Heaps

CodeForces - 538F

这个是一个还比较裸的静态主席树。

这个题目的意思是把这个数组变成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 主席树的更多相关文章

  1. codeforces 813E 主席树

    题意: 一个数列多组询问,每次询问[l,r]中最多能选多少个数字,其中每个数字的出现次数不超过k次 题解: 我们保存对于每个位置上,出现超过k次的位置,那么对于每次询问,我们就变成了查询区间[l,r] ...

  2. Pathwalks CodeForces - 960F(主席树 || 树状数组)

    题意: 求树上最长上升路径 解析: 树状数组版: 998ms edge[u][w] 代表以u为一条路的终点的小于w的最长路径的路的条数 · 那么edge[v][w] = max(edge[u][w-1 ...

  3. bzoj1901: Zju2112 Dynamic Rankings(BIT套主席树)

    带修改的题主席树不记录前缀,只记录单点,用BIT统计前缀.  对于BIT上每一个点建一棵主席树,修改和询问的时候用BIT跑,在主席树上做就行了.  3k4人AC的题#256...应该不算慢 #incl ...

  4. Codeforces 961E 主席树

    题意: 给出一个n个数的序列,求有几对(i,j)满足a[i]>=j&&a[j]>=i,(i,j)和(j,i)只能算一对. 考虑第i个数会有几个j(j<i)满足条件,首 ...

  5. CodeForces - 840D:(主席树求出现区间出现次数大于某值的最小数)

    Once, Leha found in the left pocket an array consisting of n integers, and in the right pocket q que ...

  6. Till I Collapse CodeForces - 786C (主席树区间加,二分最小值)

    大意: 给定序列, 将序列划分为若干段, 使得每段不同数字不超过k, 分别求出k=1...n时的答案. 考虑贪心, 对于某个k 从1开始, 每次查询最后一个颜色数<=k的点作为一个划分, 直到全 ...

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

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

  8. BZOJ 3514: Codechef MARCH14 GERALD07加强版 [LCT 主席树 kruskal]

    3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 1312  Solved: 501 ...

  9. 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 ...

随机推荐

  1. 【翻译】Java Array的排名前十方法(Top 10 Methods for Java Arrays)

    这里列举了Java Array 的前十的方法.他们在stackoverflow最大投票的问题. The following are top 10 methods for Java Array. The ...

  2. ViewStub

    在书上了解了ViewStub,但只是带过两笔,没能了解.在网上搜索了一些资料,虽然很多文章都讲得比较完善,但是觉得可能是表达的原因,导致某个点上我理解错误,慢慢的才算比较清楚的认识ViewStub. ...

  3. 别人用钱,而我用python爬虫爬取了一年的4K高清壁纸

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取htt ...

  4. stand up meeting 1-6

    今日更新: 1.修复初始最佳战绩显示bug:  初始为击败全国0% 用户 2.挑战结果界面显示“哎,今天的饭又白吃了,回去多吃两碗###”, 去除API返回string中的“###”. 3.分享模块初 ...

  5. POJ 跳蚤

    Z城市居住着很多只跳蚤.在Z城市周六生活频道有一个娱乐节目.一只跳蚤将被请上一个高空钢丝的正中央.钢丝很长,可以看作是无限长.节目主持人会给该跳蚤发一张卡片.卡片上写有N+1个自然数.其中最后一个是M ...

  6. 2020-3 网络对抗技术 20175120 exp5 信息搜集与漏洞扫描

    目录 实践目标 实践内容 各种搜索技巧的应用 搜索特定类型的文件Google Hacking 搜索网站目录结构 DNS IP注册信息的查询 网络侦查 基本的扫描技术:主机发现.端口扫描.OS及服务版本 ...

  7. CentOS7.7下二进制部署MySQL多版本多实例实战

    第一章 需求说明 部署MySQL5.7的三个多实例环境(端口分别为3307,3308,3309) 部署MySQL5.6和8.0版本数据库实例((端口分别为3316和3326) 第二章 环境准备 1.虚 ...

  8. pytorch seq2seq闲聊机器人beam search返回结果

    decoder.py """ 实现解码器 """ import heapq import torch.nn as nn import con ...

  9. JavaScript之浅谈内存空间

    JavaScript之浅谈内存空间 JavaScipt 内存自动回收机制 在JavaScript中,最独特的一个特点就是拥有自动的垃圾回收机制(周期性执行),这也就意味者,前端开发人员能够专注于业余, ...

  10. 9个小技巧让你的 if else看起来更优雅

    if else 是我们写代码时,使用频率最高的关键词之一,然而有时过多的 if else 会让我们感到脑壳疼,例如下面这个伪代码: 是不是很奔溃?虽然他是伪代码,并且看起来也很夸张,但在现实中,当我们 ...