Description

Input

Output

Sample Input

4 2.0
114 514 1919 810

Sample Output

114 810 514 1919

Data Constraint

Solution

  • 先考虑一个贪心,将数从大到小填到树的后序遍历上。

  • 但是这只能过 did_i 互不相同的数据点,如数据:

4 2
1 1 1 2

  • 就能卡的你痛不欲生……

  • 关键在于没有预留足够的点填到一个点的子树内。

  • 我们先将数从小到大排序,从小到大地填。

  • 注意可以新建一个 00 号节点,把森林变成一颗树方便处理。

  • 设一个点在线段树的后缀子树大小为 SizeSize ,一个数的重复个数为 PP ,

  • 那么这个数要填到一个点 ii 满足:Sizei≥PSize_i\ge P (感性理解)。

  • 结合上述数据可以清楚地得出这个结论……

  • 于是用线段树维护区间和还有单点修改即可。

  • 时间复杂度为 O(N log N)O(N\ log\ N) 。

Code

#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cctype>
using namespace std;
const int N=5e5+5;
int n,tot,qx,qy;
double k;
int first[N],nex[N],en[N],size[N];
int a[N],fa[N],ans[N],f[N<<2];
inline int read()
{int X=0,w=0; char ch=0;while(!isdigit(ch)) w|=ch=='-',ch=getchar();while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();return w?-X:X;
}
inline void write(int x)
{if(x>9) write(x/10);putchar(x%10+'0');
}
inline void insert(int x,int y)
{nex[++tot]=first[x];first[x]=tot;en[tot]=y;size[x]+=size[y];
}
void change(int v,int l,int r)
{f[v]+=qy;if(l==r) return;int mid=l+r>>1;if(qx<=mid) change(v<<1,l,mid); else change(v<<1|1,mid+1,r);
}
int find(int v,int l,int r,int x)
{if(l==r) return l;int mid=l+r>>1;if(f[v<<1|1]>=x) return find(v<<1|1,mid+1,r,x);return find(v<<1,l,mid,x-f[v<<1|1]);
}
int main()
{n=read(),scanf("%lf",&k);for(int i=1;i<=n;i++) a[i]=read(),size[i]=1;sort(a+1,a+1+n);for(int i=n;i;i--) insert(floor(i*1.0/k),i);for(int i=first[0];i;i=nex[i]){qy=size[qx=en[i]];change(1,1,n);}for(int i=1,k=1;i<=n;i=k){while(k<=n && a[i]==a[k]) k++;for(int j=k-i;j;j--){int pos=find(1,1,n,j);ans[pos]=a[i];qy=-size[qx=pos];change(1,1,n);for(int l=first[pos];l;l=nex[l]){qy=size[qx=en[l]];change(1,1,n);}}}for(int i=1;i<=n;i++) write(ans[i]),putchar(' ');return 0;
}

JZOJ 5638. 【NOI2018模拟4.8】IIIDX相关推荐

  1. JZOJ 5623. 【NOI2018模拟4.2】program

    Description Input Output Sample Input 10 5 8>6<2<>54< 4 7 1 10 4 4 2 9 8 10 Sample Ou ...

  2. JZOJ 5643. 【NOI2018模拟4.10】最小代价

    Description 给定一张n个点m条边的无向图,点编号1到n,每个点x有两个权值ax和bx.给定k,选出图中一个大小为k的点集S,使得S中任意两个点之间存在仅经过这个点集中的点的路径.S也存在两 ...

  3. JZOJ 5640. 【NOI2018模拟4.9】劈配

    Description Input Output 输出到文件 mentor.out 中. 按顺序输出每组数据的答案.对于每组数据,输出 2 行: • 第 1 行输出 n 个用空格隔开的正整数,其中第 ...

  4. JZOJ 5639. 【NOI2018模拟4.8】秘密袭击

    Description Input Output Sample Input [样例1 输入] 5 3 3 2 1 1 2 3 1 2 2 3 1 4 1 5 [样例2 输入] 10 2 3 2 1 1 ...

  5. JZOJ 5637. 【NOI2018模拟4.8】一双木棋

    Description 菲菲和牛牛在一块n 行m 列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手. 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结 束.落子的规则是:一个格子可 ...

  6. JZOJ 5629. 【NOI2018模拟4.4】Map

    Description Rin是个特别好动的少女. 一天Rin来到了一个遥远的都市.这个都市有N个建筑,编号从1到N,其中市中心编号为1,这个都市有M条双向通行的街道,每条街道连接着两个不同的建筑,其 ...

  7. JZOJ 4673. 4504. 5635. 【NOI2018模拟4.7】LCS

    Description Input Output Sample Input [样例输入1] 3 3 aaa [样例输入2] 3 3 aab [样例输入3] 1 2 a [样例输入4] 10 9 aba ...

  8. JZOJ 5630. 【NOI2018模拟4.4】Connection

    Description 给定一张N个点M条边的连通无向图,问最少需要断开多少条边使得这张图不再连通. Input 第一行两个整数N,M含义如题所示. 接下来M行,每行两个正整数x,y,表示x和y之间有 ...

  9. JZOJ 5628. 【NOI2018模拟4.4】Travel

    Description 有N个人出去旅行,第i个人去A国有Ai种游玩方式,去B国有Bi种游玩方式,问至少有C个人去A国的情况下,所有人的游玩方式有多少种不同的可能. 两种所有人的游玩方式不同当且仅当存 ...

最新文章

  1. Xamarin Essentials教程语音播报TextToSpeech
  2. Android自己定义组件系列【6】——进阶实践(3)
  3. Java操作符自测运算符精度
  4. Python中的MySQL数据库编程
  5. java取邮箱前缀_java抓取网页或文件中的邮箱号码
  6. PHP提高性能的几个Tips
  7. Nova reboot 和 lock 操作 - 每天5分钟玩转 OpenStack(32)
  8. Machine Learning for Communication Networks
  9. 仓库货位 mysql_Max(TM)财务进销存管理系统 V1.1.12 MySQL网络版
  10. html5中get的特点,html4与html5的差异及html5的一些新特性
  11. 22春天津大学《财务会计》在线作业2
  12. pytorch加载数据时中途卡死且未报错
  13. m41+m42+m43+m44
  14. Java开发个人总结
  15. 耦合器 功分器 合路器
  16. PageHelper的PageInfo使用方法
  17. JS验证身份证号地区码及最后一位校验码
  18. 一些名企秋招网申链接合集
  19. 电子日记本(ediary)
  20. C#实现的两个淘宝插件源码

热门文章

  1. c++学习笔记之类的应用
  2. 高并发01_synchronized
  3. yii2 redis封装类 php,yii2项目中如何使用redis
  4. matlab cell类型数组存至txt文件
  5. 【Leetcode】组合、排列、子集、切割(回溯模板和去重方法)
  6. [云炬商业计划书阅读分享]无水洗车市场推广策划书
  7. [云炬python3玩转机器学习笔记] 3-7Numpy中的矩阵运算
  8. [我的1024开源程序]350元写的HTML5程序
  9. [我的1024开源程序]100元写的软件工程和VB试题
  10. python读取redis存储数据的存储时间_Python读写Redis数据库操作示例