/*
题目转换为 n个节点的一片森林,n个权值,要给每个节点分配一个权值,保证子节点的权值不小于父节点的权值,并且1~n的权值的字典序最大。 考场上的贪心很显然 建立出 树来 将所有数值从大到小排序 然后后序遍历依次填进去 这样就可以处理 互不相同的数据 然后一旦有相同的就会gg 正解
考虑从前往后贪心 我们把所有的数字按照从大到小排序, 然后从前往后贪心 每个位置贪心找当前能放的最大的,也就是保证子树元素都比改点大, 如果有相同的, 令我们选择在序列中最靠右的,这样才有可能将较大的留给后面的 对于数列构建线段树 令res[i] 表示第i个元素以及他左边 空余的元素有多少个 每次查询在线段树上二分 找到这个元素之后 体会一下他的所有孩子都会比这个元素大 所以res[i - n] 都要减去sz[i] 这个限制 当我们遍历该节点的第一个孩子时 将其去除即可 */
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<iostream>
#define M 500010
#define fa(x) (int) floor((x) / (k))
#define inf 1000000000
using namespace std; int read() {
int nm = , f = ;
char c = getchar();
for(; !isdigit(c); c = getchar()) if(c == '-') f = -;
for(; isdigit(c); c =getchar() ) nm = nm * + c - '';
return nm * f;
}
int n, res[M << ], lazy[M << ], note[M], b[M], sz[M], ans[M], cnt[M];
double k; void pushup(int now) {
res[now] = min(res[now << ], res[now << | ]);
} void pushdown(int now) {
if(!lazy[now]) return;
lazy[now << ] += lazy[now], res[now << ] += lazy[now], lazy[now << | ] += lazy[now], res[now << | ] += lazy[now];
lazy[now] = ;
} void build(int l, int r, int now) {
if(l > r) return;
if(l == r) {
res[now] = l;
return;
}
int mid = (l + r) >> ;
build(l, mid, now << );
build(mid + , r, now << | );
pushup(now);
} void modify(int l, int r, int now, int ln, int rn, int ver) {
if(l > rn || r < ln) return ;
if(l >= ln && r <= rn) {
res[now] += ver;
lazy[now] += ver;
return;
}
int mid = (l + r) >> ;
pushdown(now);
modify(l, mid, now << , ln, rn , ver);
modify(mid + , r, now << | , ln, rn,ver);
pushup(now);
} int query(int l, int r, int now, int k) {
if(l == r) return (res[now] >= k) ?l : l + ;
int mid = (l + r) >> ;
pushdown(now);
if(k <= res[now << | ]) return query(l, mid ,now << , k);
return query(mid + , r, now << | , k);
} int main() {
n = read();
cin >> k;
for(int i = ; i <= n; i++) note[i] = read(), sz[i] = ;
sort(note + , note + n + , greater<int>() );
for(int i = n; i >= ; i--) {
if(note[i] == note[i + ]) cnt[i] = cnt[i + ] + ;
else cnt[i] = ;
sz[fa(i)] += sz[i];
}
build(, n, );
for(int i = ; i <= n; i++) {
if(fa(i) && fa(i) != fa(i - )) modify(, n, , ans[fa(i)], n, sz[fa(i)] - );
int op = query(, n, , sz[i]);
op += cnt[op],cnt[op]++,op -= (cnt[op] - ),ans[i] = op;
modify(, n, , op, n, -sz[i]);
}
for(int i = ; i <= n; i++) cout << note[ans[i]] << " ";
return ;
}

SDOI2018IIIDX的更多相关文章

随机推荐

  1. vue项目权限控制

    Vue权限控制有各种方法,大概分为两个方向: 把当前角色对应的权限保存在浏览器本地(容易被恶意修改): 将操作权限保存在vuex中(推荐此种方式:页面一刷新就没了,可以再次向后端请求相关数据,始终保持 ...

  2. PHP 对象转数组 Object转array

    //调用这个函数,将其幻化为数组,然后取出对应值 public static function object_array($array) { if(is_object($array)) { $arra ...

  3. Hadoop HDFS NameNode工作机制

    Secondary namenode 首先,我们假设如果存储在Namenode节点的磁盘中,因为经常需要进行随机访问,还有响应客户请求,必然是效率过低.因此,元数据需要存放在内存中.但如果只存在内存中 ...

  4. angular2的ngfor ngif指令嵌套

    angular2的ngfor ngif指令嵌套 ng2 结构指令不能直接嵌套使用,可使用<ng-container>标签来包裹指令 示例如下: <ul> <ng-cont ...

  5. HanLP的自定义词典使用方式与注意事项介绍

    [环境]python 2.7 方法一:使用pyhanlp,具体方法如下: pip install pyhanlp  # 安装pyhanlp 进入python安装包路径,如 /usr/lib/pytho ...

  6. <亲测>CentOS7中使用yum安装Nginx的方法

    CentOS7中使用yum安装Nginx的方法   最近无意间发现Nginx官方提供了Yum源.因此写个文章记录下. 1.添加源 默认情况Centos7中无Nginx的源,最近发现Nginx官网提供了 ...

  7. JS之事件机制

    一.绑定事件的3种方式 1.内联绑定事件 2.on+事件名,绑定事件程序 3.通过addEventListener/removeEventListener绑定事件 不支持ie9之前的浏览器,ie9之前 ...

  8. hadoop长时间运行后,stop-all.sh报错

    报错现象: hadoop在stop-all.sh的时候依据的是datanode上的mapred和dfs进程号. 而默认的进程号保存在/tmp下,linux默认会每 隔一段时间(一般是一个月或者7天左右 ...

  9. MyBatis 手动映射结果集

    MyBatis可以自动将查询结果封装到bean中,前提条件是bean的属性名和查询的结果列名相同,就会一次对应存储. 如果查询结果的列名和bean的属性名不一致,则需要手动映射结果集 <!-- ...

  10. flume 1.7在windows下的安装与运行

    flume 1.7在windows下的安装与运行 一.安装 安装java,配置环境变量. 安装flume,flume的官网http://flume.apache.org/,下载地址,下载后直接解压即可 ...