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 ...
随机推荐
- 在Sping的配置文件中,关于dataSource的配置,就我们常用的方法大致可以有三种:
在Sping的配置文件中,关于dataSource的配置,就我们常用的方法大致可以有三种: 1.一般的配置方法,直接在配置中指定其值.具体的例子我们参照Mysql的配置如下: <bean id= ...
- Volatile可见性分析(一)
JUC(java.util.concurrent) 进程和线程 进程:后台运行的程序(我们打开的一个软件,就是进程) 线程:轻量级的进程,并且一个进程包含多个线程(同在一个软件内,同时运行窗口,就是线 ...
- openwrite使用说明
访问官网https://openwrite.cn/注册登录 访问https://openwrite.cn/plugin-chrome/ 下载插件和安装插件"OpenWrite助手1.1.4& ...
- while和do-while
1. While(条件表达式){ 只要条件表达式结果为true,循环一直执行,当条件表达式结果为false的时候,循环终止 } 2. Do{ 循环体代码:首先执行该循环体代码一次.如果while后边的 ...
- Css3 新增的属性以及使用
Css3基础操作 . Css3? css3事css的最新版本 width. heith.background.border**都是属于css2.1CSS3会保留之前 CSS2.1的内容,只是添加了一些 ...
- 利用numpy实现多维数组操作图片
1.上次介绍了一点点numpy的操作,今天我们来介绍它如何用多维数组操作图片,这之前我们要了解一下色彩是由blue ,green ,red 三种颜色混合而成,0:表示黑色 ,127:灰色 ,255:白 ...
- 10个步骤教你如何安装Anaconda安装,Python数据分析入门必看
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:小白 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行 ...
- Docker安装Redis并介绍漂亮的可视化客户端进行操作
1 简介 Redis是使用ANSI C语言开发的基于Key-Value的高性能NoSQL数据库,在解决高并发.高可用等一系列问题中,它扮演着重要的角色.它的优势主要有: 速度快. 持久化. 原子性. ...
- OkHttp 优雅封装 HttpUtils 之 气海雪山初探
曾经在代码里放荡不羁,如今在博文中日夜兼行,只为今天与你分享成果.如果觉得本文有用,记得关注我,我将带给你更多. 介绍 HttpUtils 是近期开源的对 OkHttp 轻量封装的框架,它独创的异步预 ...
- Suctf知识记录&&PHP代码审计,无字母数字webshell&&open_basedir绕过&&waf+idna+pythonssrf+nginx
Checkin .user.ini构成php后门利用,设置auto_prepend_file=01.jpg,自动在文件前包含了01.jpg,利用.user.ini和图片马实现文件包含+图片马的利用. ...