SDOI2018IIIDX
/*
题目转换为 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的更多相关文章
随机推荐
- [转]logback常用配置简介
logback是一套日志框架,由log4j的优化版,由同一个作者开发,在速度和性能上都超过其他日志框架,再结合slf4j,已成为当前最流行的日志框架. Logback最常用就是在classpath定义 ...
- python list 转换为str
xiaoquInfo = ['暂无参考均价', '中仪花园海伦堡', '113.403781', '22.540973', '2008年建成', '塔楼', '2元/平米/月', '海伦堡物业', ' ...
- dojo:如何用MultiSelect实现类似ListBox风格的FromTo功能
欲实现的功能如下图: 主要要解决的问题包括两个方面: 一个是MultiSelet初始化的工作,一个是FromTo功能按钮的实现.这主要是因为MultiSelect控件是存储无关的,并不像Select或 ...
- DeviceIoControl 驱动交互
驱动程序通信的函数,除了ReadFile和WriteFile函数还有DeviceIoControl函数,而且DeviceIoControl函数那是相当的彪悍.因为它可以自定义控制码,你只要在IRP_M ...
- thinkPHP 3.2.3操作MongoDB指南
今天使用thinkPHP操作MongoDB发现跟用MYSQL有很多不同的地方,在这里特别跟大家分享下. 暂时没用thinkPHP5一直还在用thinkPHP3.2.3觉得挺好用,MongoDB版本2和 ...
- 主流开源SQL(on Hadoop)总结
转载至 大数据杂谈 (BigdataTina2016),同时参考学习 http://www.cnblogs.com/barrywxx/p/4257166.html 进行整理. 使用SQL 引擎一词是有 ...
- 【python】序列化和反序列化
序列化可以理解为:把python的对象编码转换为json格式的字符串,反序列化可以理解为:把json格式字符串解码为python数据对象.在python的标准库中,专门提供了json库与pickle库 ...
- windows server core 设置shell 及切换
hkey_local_machine/software/Microsoft/windows nt/currentversion/winlogon/shell 1)windows server 2012 ...
- SpringBoot集成RabbitMQ
官方说明:http://www.rabbitmq.com/getstarted.html 什么是MQ? MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.MQ ...
- python 字符转换记录
1.unicode转utf-8格式: a="unicode格式的字符" a=a.encode("utf-8") 2.utf-8转unicode格式: s2 = ...