题面

题意:给你一个数组a[n],对于数组每次建立一个完全k叉树,对于每个节点,如果父节点的值比这个节点的值大,那么就是一个违规点,统计出1~n-1完全叉树下的违规点的各自的个数。

分析

注意到完全k叉树的一个性质,v节点的儿子是k*(v-1)+2...kv+1,v节点的父亲为(v+k-2)/k

那我们可以暴力枚举k,然后枚举每个点i,但是我们没必要枚举叶子节点,也就是说i的范围是0到最后一个叶子节点n的父亲,即[0,(v+n-2)/k]

然后对于每个点i,在对应的子节点区间里查询值在[0,a[i]-1]里的节点个数。由于主席树维护的就是1~i中有多少个节点的值落在[l,r]内,直接区间求和然后相减就可以了

由于n个节点的k叉树最多有\(\frac{n}{k}\)个叶子节点

时间复杂度为\(\sum_{k=1}^{n-1} \frac{n}{k}=O(n\log n)\)

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 200005
#define maxlogn 20
using namespace std;
struct node{
#ifdef DEBUGint l;int r;
#endifint ls;int rs;int cnt;
}tree[maxn*maxlogn];
int ptr;
inline void push_up(int x){tree[x].cnt=tree[tree[x].ls].cnt+tree[tree[x].rs].cnt;
}
void update(int &x,int last,int upos,int l,int r){x=++ptr;tree[x]=tree[last];
#ifdef DEBUGtree[x].l=l;tree[x].r=r;
#endifif(l==r){tree[x].cnt++;return;}int mid=(l+r)>>1;if(upos<=mid) update(tree[x].ls,tree[last].ls,upos,l,mid);else update(tree[x].rs,tree[last].rs,upos,mid+1,r);push_up(x);
}
int get_sum(int L,int R,int l,int r,int x){if(L<=l&&R>=r){return tree[x].cnt;}int mid=(l+r)>>1;int ans=0;if(L<=mid) ans+=get_sum(L,R,l,mid,tree[x].ls);if(R>mid) ans+=get_sum(L,R,mid+1,r,tree[x].rs);return ans;
}int n;
int root[maxn];
int a[maxn];
int b[maxn];
int ans[maxn];
int main(){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",&a[i]);b[i]=a[i];}int m=n;sort(b+1,b+1+m);m=unique(b+1,b+1+m)-b-1;for(int i=1;i<=n;i++){a[i]=lower_bound(b+1,b+1+m,a[i])-b;}for(int i=1;i<=n;i++){update(root[i],root[i-1],a[i],1,m);}for(int k=1;k<=n-1;k++){int lim=(n+k-2)/k;for(int i=1;i<=lim;i++){int l=k*(i-1)+2;int r=min(k*i+1,n);int cnt=0;if(a[i]-1<1) cnt=0; else cnt=get_sum(1,a[i]-1,1,m,root[r])-get_sum(1,a[i]-1,1,m,root[l-1]);ans[k]+=cnt;}}for(int i=1;i<=n-1;i++){printf("%d ",ans[i]);}
}

转载于:https://www.cnblogs.com/birchtree/p/10851793.html

[CF538F]A Heap of Heaps(主席树)相关推荐

  1. CodeForce 538-F A Heap of Heaps(主席树)

    题目: 传送门 思路:        咱用 离线+树状数组 逃了好多次课 ,终究还是 被抓回来补课了:        对于每个k,每个点我们都去查询 [k*(I-1)+2,min(n,k*I+1)] ...

  2. [CF538F]A Heap of Heaps 持久化线段树

    直接枚举k 每个有儿子的节点和他的儿子区间的起点 容易发现这样枚举是调和级数 然后需要一个东西查询某段区间比x小的数 上主席树即可 #include<cstdio> #include< ...

  3. CodeForces - 538F--A Heap of Heaps(树状数组+离线)

    题目链接https://codeforces.com/problemset/problem/538/F Time limit 3000 ms Memory limit 524288 kB Andrew ...

  4. [CF538F]A Heap of Heaps

    题目大意 懒得写 做法 从0开始标号. 注意i是父亲是(i-1)/k 因此可以分块 对一段产生的影响可以在数组上打tag #include<cstdio> #include<algo ...

  5. CF464E The Classic Problem(主席树+哈希+最短路)

    CF464E The Classic Problem problem solution code problem 题目链接 solution 经典题. 本题很特别的是每条边的边权都是 222 的幂,而 ...

  6. hdu 2665(主席树查询区间k大值)

    先贴我自己写的代码做模板虽然跟原博主没什么两样.(一开始空间开的4*maxn,交到hdu上一直TLE很奇怪) #include<bits/stdc++.h> using namespace ...

  7. P3168 [CQOI2015]任务查询系统 差分+主席树

    链接在这~:https://www.luogu.org/problem/P3168 主席静态区间修改,单点查询 区间(L,R)加1可以通过差分以后转换为L位置加1,R+1位置减1 我们只需要记录一下, ...

  8. 洛谷 P3302 [SDOI2013]森林 主席树+启发式合并

    click here~:https://www.luogu.org/problem/P3302 emmm这个题是真的烦 一看题发现这题不是count on a tree的升级版么 如果一点思路没有的话 ...

  9. 洛谷 P2468 粟粟的书架 二分(主席树+前缀和)

    传送~:https://www.luogu.org/problem/P2468 看了一下数据也发现是两道题,后边当他是一个序列(n==1)的时候直接主席树二分区间前k大和就行了 但是有一个细节我觉得就 ...

最新文章

  1. win7 web开发遇到的问题-由于权限不足而无法读取配置文件,无法访问请求的页面...
  2. Python 3标准库,[美] 道格·赫尔曼(Doug Hellmann)
  3. CentOS7中卸载Docker
  4. C++类成员的初始化
  5. bom实现方块移动_html5实现简单的拼图小游戏
  6. 最通俗易懂的理解API和SDK
  7. 深山红叶PE系统工具箱V32
  8. 微信公众号怎么放html文件,微信公众号html缓存处理
  9. 东南亚跨境电商shopee平台,教你轻松打造高销量品牌店铺!
  10. nohup java_nohup
  11. 【深度学习】计算机视觉(七)——使用GPU进行目标检测详解(上)
  12. 乐pro3 android8.0,乐视Pro3 安卓7.1.2 魅族Flyme6刷机包 最新6.8.3.20R紫火版 于20180510更新...
  13. Android联网失败报错:java.io.IOException: Cleartext HTTP traffic to xxx.xxx.xxx.xxx not permitted
  14. 五分钟掌握微信小程序轮播图
  15. 英文简历如何选择字体?
  16. C语言中实现bool(布尔型变量)
  17. python---表情包爬取
  18. 大众点评数据采集分析
  19. 学习前端,需要掌握的单词集汇总
  20. 厉害,我带的实习生仅用四步就整合好SpringSecurity+JWT实现登录认证

热门文章

  1. 怎么才能写好一篇文章
  2. 从零开始成为GStreamer专家——基于Windows的GStreamer从源码下载、编译到开发
  3. 【考研经验】19制药跨考【东南大学】软件专硕,真实考研经历以及跨考菜鸡的迷茫记录!...
  4. 新零售时代的新营销,OTT何故成为香饽饽?
  5. 最近公共祖先LCA问题
  6. Linux入门——如何制作一个刷取网页访问量的脚本并打包成rpm软件包(CentOS)
  7. 被忽略的流量入口—热门话题,精准助力小红书品牌营销
  8. SAS和蒙特卡罗模拟(3):SAS随机数函数及CALL子程序
  9. 为什么我们依然困于柏油坑?
  10. 单机游戏编辑器《铯际毁灭者》制作《布鲁末日》实现即时战略《蓝色警戒》的缺憾弥补