/*
题目转换为  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 = 0, f = 1;char c = getchar();for(; !isdigit(c); c = getchar()) if(c == '-') f = -1;for(; isdigit(c); c  =getchar() ) nm = nm * 10 + c - '0';return nm * f;
}
int n, res[M << 2], lazy[M << 2], note[M], b[M], sz[M], ans[M], cnt[M];
double k;void pushup(int now) {res[now] = min(res[now << 1], res[now << 1 | 1]);
}void pushdown(int now) {if(!lazy[now]) return;lazy[now << 1] += lazy[now], res[now << 1] += lazy[now], lazy[now << 1 | 1] += lazy[now], res[now << 1 | 1] += lazy[now];lazy[now] = 0;
}void build(int l, int r, int now) {if(l > r) return;if(l == r) {res[now] = l;return;}int mid = (l + r) >> 1;build(l, mid, now << 1);build(mid + 1, r, now << 1 | 1);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) >> 1;pushdown(now);modify(l, mid, now << 1, ln, rn , ver);modify(mid + 1, r, now << 1 | 1, ln, rn,ver);pushup(now);
}int query(int l, int r, int now, int k) {if(l == r) return (res[now] >= k) ?l : l + 1;int mid = (l + r) >> 1;pushdown(now);if(k <= res[now << 1 | 1]) return query(l, mid ,now << 1, k);return query(mid + 1, r, now << 1 | 1, k);
}int main() {n = read();cin >> k;for(int i = 1; i <= n; i++) note[i] = read(), sz[i] = 1;sort(note + 1, note + n + 1, greater<int>() );for(int i = n; i >= 1; i--) {if(note[i] == note[i + 1]) cnt[i] = cnt[i + 1] + 1;else cnt[i] = 0;sz[fa(i)] += sz[i];}build(1, n, 1);for(int i = 1; i <= n; i++) {if(fa(i) && fa(i) != fa(i - 1)) modify(1, n, 1, ans[fa(i)], n, sz[fa(i)] - 1);int op = query(1, n, 1, sz[i]);op += cnt[op],cnt[op]++,op -= (cnt[op] - 1),ans[i] = op;modify(1, n, 1, op, n, -sz[i]);}for(int i = 1; i <= n; i++) cout << note[ans[i]] << " ";return 0;
}

转载于:https://www.cnblogs.com/luoyibujue/p/9250671.html

SDOI2018IIIDX相关推荐

最新文章

  1. 为什么阿里巴巴要禁用Executors创建线程池?
  2. [CareerCup] 8.5 Online Book Reader System 在线读书系统
  3. 真香!用 4K 高清显示器写代码,包邮送一台!
  4. 使用Eclipsephp工具打开Thinkphp为什么会有红色的波浪线报警?
  5. BPF、eBPF、XDP 和 Bpfilter……这些东西是什么?
  6. hadooppythonsql_半小时搞定Hadoop+Mysql+Hive+Python
  7. KVM中断虚拟化(一)
  8. js能订阅mq吗_ActiveMQ+MQTT实现客户端订阅推送模式(一)订阅者
  9. OpenSSL is not properly installed on your system.
  10. 真不是开玩笑:同事因在涉及金钱交易中使用double造成无法挽回的损失,已跑路...
  11. Atitit 颜色平均值cloor grb hsv模式的区别对比
  12. IOS:APP三种状态下收到推送后的跳转操作
  13. 计算机毕业设计之答辩
  14. Excel:INDIRECT函数
  15. 第三章: 微信小程序底部导航栏的实现(详细)
  16. 单因素方差分析的计算步骤
  17. Java EE开发系列教程 - 使用EJB组件与JPA层交互
  18. java 怎么去JTF边框_求助 java 如何编写JFrame窗体右上角红色打叉关闭按钮的事件?...
  19. linux 执行程序时,提示not found问题分析
  20. 麦吉尔大学计算机工程的世界排名,「麦吉尔大学」2021qs世界排名_申请条件 - 言顶留学...

热门文章

  1. php 数组接在数组后面,PHP array_splice()接合数组用法的简单介绍
  2. modelsim读取文件中的数据_modelsim中的文件操作—— 大数据测试
  3. android studio 设置自动编译_某小型公司持续集成工具jenkins实践(JAVA WEB、Android、IOS、html)...
  4. 网络推广是什么告诉大家如何高效提高网站权重?
  5. 网站突然不收录?如何做到自审、自查、自纠?
  6. 企业网络推广—企业网络推广专员一定要避免这些不靠谱的优化方式
  7. 浅析优化网站导航设计的几种常用方法
  8. 计算机辅助园林设计ps,计算机辅助园林设计III
  9. a标签被选择的底色_实施特殊管理,婴配乳粉标签书写有规矩(下)
  10. 开发日记-20190625 Linux系统管理技术手册(第二版) 第一章习题答案(个人版)