bzoj5249 [2018多省省队联测]IIIDX
转化一下问题变成给定一棵树,一个序列,求父亲的权值小于子树的最大方案。
直接贪心会在有重复权值时出现错误,我们考虑用线段树优化贪心。
将序列从小到大排序,线段树上每个点记录他和他右边当前还可用的权值,注意这里我们并不一定维护的都是正确的,但是我们要保证我们需要用到的限制一定都体现了出来,比如 1 2 5 5 5 5 5 6 7 8 9 K=2,我们放第二个点时,会放到3这个位置,于是我们将1~3区间减7,这时候4~11的权值我们并没有修改,但是需要用到的限制只有前三个点,所以是正确的,之后我们每次在线段树上找到最大的可用位置,然后放到和他权值相同的最左边就可以了。
还要注意我们放一个点时需要先将其父亲的限制去掉。
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <map>
#define N 500500
using namespace std;
int n,a[N],fa[N],size[N],pp[N];
double K;
int lazy[N<<],minn[N<<];
void pushdown(int rt){
if(lazy[rt]){
lazy[rt<<]+=lazy[rt];minn[rt<<]+=lazy[rt];
lazy[rt<<|]+=lazy[rt];minn[rt<<|]+=lazy[rt];
lazy[rt]=;
}
}
void build(int rt,int l,int r){
if(l==r){minn[rt]=n-l+;return;}
int mid=(l+r)>>;
build(rt<<,l,mid);
build(rt<<|,mid+,r);
minn[rt]=min(minn[rt<<],minn[rt<<|]);
}
void update(int rt,int l,int r,int x,int y,int z){
if(x<=l&&r<=y){
lazy[rt]+=z;minn[rt]+=z;
return ;
}
pushdown(rt);
int mid=(l+r)>>;
if(x<=mid)update(rt<<,l,mid,x,y,z);
if(y>mid)update(rt<<|,mid+,r,x,y,z);
minn[rt]=min(minn[rt<<],minn[rt<<|]);
}
int query(int rt,int l,int r,int x){
if(l==r){
if(minn[rt]>=x)return l;
return l-;
}
pushdown(rt);
int mid=(l+r)>>;
if(minn[rt<<]>=x)return query(rt<<|,mid+,r,x);
else return query(rt<<,l,mid,x);
}
map<int,int> L;
int main(){
scanf("%d%lf",&n,&K);
for(int i=;i<=n;i++)scanf("%d",&a[i]);
sort(a+,a+n+);
for(int i=;i<=n;i++)
if(a[i]!=a[i-])L[a[i]]=i;
for(int i=;i<=n;i++)fa[i]=floor(i/K);
for(int i=n;i;i--){
size[i]++;
size[fa[i]]+=size[i];
}
build(,,n);
for(int i=;i<=n;){
if(fa[i])update(,,n,,pp[fa[i]],size[fa[i]]-);
do{
int x=query(,,n,size[i]);
pp[i]=L[a[x]]++;
update(,,n,,pp[i],-size[i]);
i++;
}while(i<=n&&fa[i]==fa[i-]);
}
for(int i=;i<=n;i++)printf("%d%c",a[pp[i]],((i==n)?'\n':' '));
return ;
}
bzoj5249 [2018多省省队联测]IIIDX的更多相关文章
- bzoj千题计划324:bzoj5249: [2018多省省队联测]IIIDX(线段树)
https://www.lydsy.com/JudgeOnline/problem.php?id=5249 把树建出来 如果所有的d互不相同,后续遍历即可 现在有的d相同 将d从小到大排序,考虑如何将 ...
- BZOJ5249: [2018多省省队联测]IIIDX(线段树 贪心)
题意 题目链接 Sol 不难发现题目给出的是一个树,其中\(\frac{i}{K}\)是\(i\)的父亲节点 首先,当\(d_i\)互不相同时,一个显然的贪心策略就是优先给编号小的分配较大的权值.可以 ...
- 5249: [2018多省省队联测]IIIDX
5249: [2018多省省队联测]IIIDX 链接 分析: 贪心. 将给定的权值从大到小排序,从第一个往后挨个赋值,考虑第i个位置可以赋值那些树.首先满足前面必须至少有siz[i]个权值没选,如果存 ...
- bzoj 5249 [2018多省省队联测] IIIDX
bzoj 5249 [2018多省省队联测] IIIDX Link Solution 首先想到贪心,直接按照从大到小的顺序在后序遍历上一个个填 但是这样会有大问题,就是有相同的数的时候,会使答案不优 ...
- BZOJ 5249: [2018多省省队联测]IIIDX(贪心 + 线段树)
题意 这一天,\(\mathrm{Konano}\) 接到了一个任务,他需要给正在制作中的游戏 \(\mathrm{<IIIDX>}\) 安排曲目 的解锁顺序.游戏内共有\(n\) 首曲目 ...
- 【刷题】BZOJ 5249 [2018多省省队联测]IIIDX
Description [题目背景] Osu听过没?那是Konano最喜欢的一款音乐游戏,而他的梦想就是有一天自己也能做个独特酷炫的音乐游戏.现在,他在世界知名游戏公司KONMAI内工作,离他的梦想也 ...
- BZOJ_5249_Luogu_P4364_[2018多省省队联测]_IIIDX_九省联考2018_JLOI2018_线段树
BZOJ_5249_[2018多省省队联测]IIIDX_线段树 Description [题目背景] Osu听过没?那是Konano最喜欢的一款音乐游戏,而他的梦想就是有一天自己也能做个独特酷炫的音乐 ...
- bzoj 5248: [2018多省省队联测]一双木棋
Description 菲菲和牛牛在一块n行m列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手.棋局开始时,棋盘上没有任何棋子, 两人轮流在格子上落子,直到填满棋盘时结束.落子的规则是:一个格子可以落子 ...
- bzoj 5251: [2018多省省队联测]劈配
Description 一年一度的综艺节目<中国新代码>又开始了. Zayid从小就梦想成为一名程序员,他觉得这是一个展示自己的舞台,于是他毫不犹豫地报名了. 题目描述 轻车熟路的Zayi ...
随机推荐
- 前端iFrame跨域问题
一.父域访问子域的元素 项目需求: iFrame是个聊天窗口,要求聊天窗口中点击图片图标,在父域将内容展示出来. 解决方法:(jQuery) 首先/要等iFrame加载完再执行函数!(代码如下) va ...
- sort list(给链表排序)
Sort a linked list in O(n log n) time using constant space complexity. 题目要求使用O(nlogn)时间复杂度,可以考虑使用归并排 ...
- Android之Drawable
Android 中图片和常见的颜色都可以是一个Drawable. Drawable可以方便我们做出一些特殊的UI效果,这一点在UI相关的开发工作中尤其重要.其主要优点有: 使用简单,比自定义View成 ...
- javamail接收邮件(zt)
zt from:http://xiangzhengyan.iteye.com/blog/85961 import <a href="http://lib.csdn.net/base/j ...
- Lenghth of Last Word
description: Given a string s consists of upper/lower-case alphabets and empty space characters ' ', ...
- Java注解处理器--编译时处理的注解
1. 一些基本概念 在开始之前,我们需要声明一件重要的事情是:我们不是在讨论在运行时通过反射机制运行处理的注解,而是在讨论在编译时处理的注解.注解处理器是 javac 自带的一个工具,用来在编译时期扫 ...
- Web移动端页面 --响应式和动态REM
响应式 什么是响应式页面呢? 顾名思义响应式页面就是能做出响应的页面,它的页面效果不是定死的,会随着用户的改变而改变. 如何着手响应式有以下几个思考的方向 找一份设计图 使用Media Query 隐 ...
- spring cloud 入门系列七:基于Git存储的分布式配置中心
我们前面接触到的spring cloud组件都是基于Netflix的组件进行实现的,这次我们来看下spring cloud 团队自己创建的一个全新项目:Spring Cloud Config.它用来为 ...
- JavaScript 之函数
刚开 始学习 JS 时,挺不习惯它函数的用法,就比如一个 function 里面会嵌套一个 function,对于函数里创建变量的作用域也感到很迷惑,这个的语法和 JAVA 相差太多,为此,阅读了&l ...
- springboot之启动原理解析
前言 SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会吃亏.所以这次博主就跟你们一起一步步揭开SpringBoot的神秘面 ...