BZOJ5249 九省联考2018IIIDX(线段树+贪心)
显然这形成了一个树形结构。考虑这样一种贪心:按照曲目顺序,每次取消其父亲的预留,并选择当前可选择(保证其子树有合法选择且满足预留)的最大值,然后对其子树预留出大于等于他的一些值。这个做法显然是正确的。问题在于怎么达到预留的效果。
离散化后建一棵权值线段树。线段树每个节点维护这段权值其右边(即大于该权值)至少有多少个权值可以选择。预留一棵子树时,我们无法知道大于等于根的那些权值如何选择,但小于根的权值的右边的可选权值减少的个数是可以知道的。于是对于权值小于根的部分,直接把可选权值个数减掉子树大小-1。查询时在线段树上二分,看左儿子区间的右边至少有多少个权值可以选择,若该值小于需要预留的子树大小,那么就无法把子树全部塞到右边了,于是向左儿子递归,否则向右儿子递归,直到叶子节点。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{
int x=,f=;char c=getchar();
while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
return x*f;
}
#define N 500010
int n,a[N],cnt[N],size[N],b[N],fa[N];
double k,eps=1E-;
int tree[N<<],L[N<<],R[N<<],lazy[N<<],ans[N];
void up(int k){tree[k]=min(tree[k<<],tree[k<<|]);}
void build(int k,int l,int r)
{
L[k]=l,R[k]=r;
if (l==r) {tree[k]=cnt[l+];return;}
int mid=l+r>>;
build(k<<,l,mid);
build(k<<|,mid+,r);
up(k);
}
void down(int k)
{
tree[k<<]+=lazy[k],tree[k<<|]+=lazy[k];
lazy[k<<]+=lazy[k],lazy[k<<|]+=lazy[k];
lazy[k]=;
}
void modify(int k,int l,int r,int x)
{
if (L[k]==l&&R[k]==r){tree[k]+=x,lazy[k]+=x;return;}
if (lazy[k]) down(k);
int mid=L[k]+R[k]>>;
if (r<=mid) modify(k<<,l,r,x);
else if (l>mid) modify(k<<|,l,r,x);
else modify(k<<,l,mid,x),modify(k<<|,mid+,r,x);
up(k);
}
int query(int k,int x)
{
if (L[k]==R[k]) return L[k];
if (lazy[k]) down(k);
int mid=L[k]+R[k]>>,ans;
if (tree[k<<]<x) ans=query(k<<,x);
else ans=query(k<<|,x);
up(k);return ans;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("bzoj5249.in","r",stdin);
freopen("bzoj5249.out","w",stdout);
const char LL[]="%I64d";
#else
const char LL[]="%lld";
#endif
n=read();cin>>k;
for (int i=;i<=n;i++) b[i]=a[i]=read();
sort(b+,b+n+);
int t=unique(b+,b+n+)-b-;
for (int i=;i<=n;i++) a[i]=lower_bound(b+,b+t+,a[i])-b;
sort(a+,a+n+);
for (int i=;i<=n;i++) if (a[i]!=a[i-]) cnt[a[i]]=n-i+;
build(,,t);
for (int i=;i<=n;i++) fa[i]=(double)i/k+eps,size[i]=;
for (int i=n;i>=;i--) size[fa[i]]+=size[i];
for (int i=;i<=n;i++)
{
if (fa[i]!=fa[i-]) modify(,,ans[fa[i]]-,size[fa[i]]-);
ans[i]=query(,size[i]);
modify(,,ans[i]-,-size[i]);
}
for (int i=;i<=n;i++) printf("%d ",b[ans[i]]);
return ;
}
BZOJ5249 九省联考2018IIIDX(线段树+贪心)的更多相关文章
- BZOJ_5249_Luogu_P4364_[2018多省省队联测]_IIIDX_九省联考2018_JLOI2018_线段树
BZOJ_5249_[2018多省省队联测]IIIDX_线段树 Description [题目背景] Osu听过没?那是Konano最喜欢的一款音乐游戏,而他的梦想就是有一天自己也能做个独特酷炫的音乐 ...
- [luogu] P4364 [九省联考2018]IIIDX(贪心)
P4364 [九省联考2018]IIIDX 题目背景 Osu 听过没?那是Konano 最喜欢的一款音乐游戏,而他的梦想就是有一天自己也能做个独特酷炫的音乐游戏.现在,他在世界知名游戏公司KONMAI ...
- [BZOJ5249][九省联考2018]IIIDX:线段树+贪心
分析 GXZlegend orz 构造出一组合法的解并不是难事,但是我们需要输出的是字典序最大的解. 字典序最大有另一种理解方式,就是让越小的数尽量越靠后. 我们从树的根结点出发,从1开始填数,构造出 ...
- [BZOJ5249][九省联考2018]IIIDX(线段树)
5249: [2018多省省队联测]IIIDX Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 32 Solved: 17[Submit][Statu ...
- [BZOJ 5252][LOJ 2478][九省联考2018] 林克卡特树
[BZOJ 5252][LOJ 2478][九省联考2018] 林克卡特树 题意 给定一个 \(n\) 个点边带权的无根树, 要求切断其中恰好 \(k\) 条边再连 \(k\) 条边权为 \(0\) ...
- [九省联考2018]秘密袭击coat
[九省联考2018]秘密袭击coat 研究半天题解啊... 全网几乎唯一的官方做法的题解:链接 别的都是暴力.... 要是n=3333暴力就完了. 一.问题转化 每个联通块第k大的数,直观统计的话,会 ...
- Loj #2479. 「九省联考 2018」制胡窜
Loj #2479. 「九省联考 2018」制胡窜 题目描述 对于一个字符串 \(S\),我们定义 \(|S|\) 表示 \(S\) 的长度. 接着,我们定义 \(S_i\) 表示 \(S\) 中第 ...
- 【BZOJ5250】[九省联考2018]秘密袭击(动态规划)
[BZOJ5250][九省联考2018]秘密袭击(动态规划) 题面 BZOJ 洛谷 给定一棵树,求其所有联通块的权值第\(k\)大的和. 题解 整个\(O(nk(n-k))\)的暴力剪剪枝就给过了.. ...
- 「九省联考 2018」IIIDX 解题报告
「九省联考 2018」IIIDX 这什么鬼题,送的55分要拿稳,实测有60? 考虑把数值从大到小摆好,每个位置\(i\)维护一个\(f_i\),表示\(i\)左边比它大的(包括自己)还有几个数可以选 ...
随机推荐
- Apache IOUtils的使用
IOUtils 与 FileUtilsCommons IO 是 apache 的一个开源的工具包,封装了 IO操作的相关类,使用 Commons IO 可以很方便的读写文件 commons.jar 包 ...
- OOM异常的4种可能分析
OOM异常:OutOfMemoryError 1.JAVA堆溢出 JAVA堆用于存储对象实例,只要不断的创建对象,并且保证GC Roots到这些对象之间有路径可以来避免垃圾回收机制清除这些对象,那么在 ...
- mac brew update 报错
环境为mac, 总共报了三种错误. 对应三种不同的解法. 1. 第一种如下, 提示 1.8 的版本找不到 $ brew update /usr/local/bin/brew: /usr/local ...
- mysql中Error : Invalid default value for 'timestamp'问题
在执行mysql数据库时报错 timestamp给默认值出问题. 原因是:mysql的配置参数中sql_node中NO_ZERO_IN_DATE, NO_ZERO_DATE控制了times ...
- MongoDB的导入导出
一:MongoDB的导出功能 mongodb提供了导入和导出的功能,分别是MongoDB下载目录下的mongoexport.exe和mongoimport.exe文件 ,具体的导出命令格式如下: mo ...
- Roslyn入门(一)-C#语法分析
演示环境 Visual Studio 2017 .NET Compiler Platform SDK 简介 今天,Visual Basic和C#编译器是黑盒子:输入文本然后输出字节,编译管道的中间阶段 ...
- Tomcat通过自带的Cluster方式实现Session会话共享环境操作记录
一般来说,在多个tomcat集群业务中,session会话共享是必须的需求,不然前端nginx转发过来的请求不知道之前请求在哪台tomcat节点上,从而就找不到session以至于最终导致请求失败.要 ...
- Jmeter-使用Stepping Thread Group插件来设置负载场景
前言: 什么是实际的性能测试???1)思考时间:用户在做不同操作之间有时间停顿,或者延迟,思考时间就是模拟用户的操作过程中的停顿的间.2)步伐,速度:主要包括,大量用户进来的时间和退出时间,控制迭代之 ...
- linux alias 别名设置【转载】
功能说明:设置指令的别名. 语 法:alias[别名]=[指令名称] 形如: alias cp=“cp -i” : 补充说明:用户可利用alias,自定指令的别名.若仅输入alias,则可列出目前所有 ...
- Safecracker-HDU1015
题意 给你大写字母的字符串,A=1,...Z=26,以及target 问你是否有v - w^2 + x^3 - y^4 + z^5 = target 有输出字典序大的那个字符串 分析 dfs code ...