显然这形成了一个树形结构。考虑这样一种贪心:按照曲目顺序,每次取消其父亲的预留,并选择当前可选择(保证其子树有合法选择且满足预留)的最大值,然后对其子树预留出大于等于他的一些值。这个做法显然是正确的。问题在于怎么达到预留的效果。

  离散化后建一棵权值线段树。线段树每个节点维护这段权值其右边(即大于该权值)至少有多少个权值可以选择。预留一棵子树时,我们无法知道大于等于根的那些权值如何选择,但小于根的权值的右边的可选权值减少的个数是可以知道的。于是对于权值小于根的部分,直接把可选权值个数减掉子树大小-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(线段树+贪心)的更多相关文章

  1. BZOJ_5249_Luogu_P4364_[2018多省省队联测]_IIIDX_九省联考2018_JLOI2018_线段树

    BZOJ_5249_[2018多省省队联测]IIIDX_线段树 Description [题目背景] Osu听过没?那是Konano最喜欢的一款音乐游戏,而他的梦想就是有一天自己也能做个独特酷炫的音乐 ...

  2. [luogu] P4364 [九省联考2018]IIIDX(贪心)

    P4364 [九省联考2018]IIIDX 题目背景 Osu 听过没?那是Konano 最喜欢的一款音乐游戏,而他的梦想就是有一天自己也能做个独特酷炫的音乐游戏.现在,他在世界知名游戏公司KONMAI ...

  3. [BZOJ5249][九省联考2018]IIIDX:线段树+贪心

    分析 GXZlegend orz 构造出一组合法的解并不是难事,但是我们需要输出的是字典序最大的解. 字典序最大有另一种理解方式,就是让越小的数尽量越靠后. 我们从树的根结点出发,从1开始填数,构造出 ...

  4. [BZOJ5249][九省联考2018]IIIDX(线段树)

    5249: [2018多省省队联测]IIIDX Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 32  Solved: 17[Submit][Statu ...

  5. [BZOJ 5252][LOJ 2478][九省联考2018] 林克卡特树

    [BZOJ 5252][LOJ 2478][九省联考2018] 林克卡特树 题意 给定一个 \(n\) 个点边带权的无根树, 要求切断其中恰好 \(k\) 条边再连 \(k\) 条边权为 \(0\) ...

  6. [九省联考2018]秘密袭击coat

    [九省联考2018]秘密袭击coat 研究半天题解啊... 全网几乎唯一的官方做法的题解:链接 别的都是暴力.... 要是n=3333暴力就完了. 一.问题转化 每个联通块第k大的数,直观统计的话,会 ...

  7. Loj #2479. 「九省联考 2018」制胡窜

    Loj #2479. 「九省联考 2018」制胡窜 题目描述 对于一个字符串 \(S\),我们定义 \(|S|\) 表示 \(S\) 的长度. 接着,我们定义 \(S_i\) 表示 \(S\) 中第 ...

  8. 【BZOJ5250】[九省联考2018]秘密袭击(动态规划)

    [BZOJ5250][九省联考2018]秘密袭击(动态规划) 题面 BZOJ 洛谷 给定一棵树,求其所有联通块的权值第\(k\)大的和. 题解 整个\(O(nk(n-k))\)的暴力剪剪枝就给过了.. ...

  9. 「九省联考 2018」IIIDX 解题报告

    「九省联考 2018」IIIDX 这什么鬼题,送的55分要拿稳,实测有60? 考虑把数值从大到小摆好,每个位置\(i\)维护一个\(f_i\),表示\(i\)左边比它大的(包括自己)还有几个数可以选 ...

随机推荐

  1. exBSGS·BSGS-Senior/扩展的BSGS

    \(\rm{0x01\quad Preface}\) \(emmm\)严格来讲,不应该被算到一个模板里面.因为在我看来模板是人构造出来的,但是这个算法应该是一个解决问题的\(process\)-更像是 ...

  2. linux中断源码分析 - 软中断(四)

    本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 在上一篇文章中,我们看到中断实际分为了两个部分,俗称就是一部分是硬中断,一部分是软中断.软中断是专门用于处理中断 ...

  3. highcharts中数据列点击事件

    Highcharts.chart('container', { xAxis: { categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul ...

  4. Identity(五)

    本文摘自 ASP.NET MVC 随想录—— 使用ASP.NET Identity实现基于声明的授权,高级篇 在这篇文章中,我将继续ASP.NET Identity 之旅,这也是ASP.NET Ide ...

  5. (转)/etc/init.d/functions详解

    转自:https://www.cnblogs.com/image-eye/archive/2011/10/26/2220405.html functions这个脚本是给/etc/init.d里边的文件 ...

  6. Zookeeper Windows版的服务安装和管理工具

    以前研究过负载均衡,最近正在项目上实施(从来没做过小项目以上级别的东西,哈).然后遇到了多个一模一样但是同时运行的服务.不同服务但依赖同相同的配置数据(前端网页服务:Nginx+IIS+nodejs. ...

  7. Docker网络解决方案 - Flannel部署记录

    Docker跨主机容器间网络通信实现的工具有Pipework.Flannel.Weave.Open vSwitch(虚拟交换机).Calico, 其中Pipework.Weave.Flannel,三者 ...

  8. WinForm多线程+委托防止界面假死

    当有大量数据需要计算.显示在界面或者调用sleep函数时,容易导致界面卡死,可以采用多线程加委托的方法解决 using System; using System.Collections.Generic ...

  9. 如何启动Intel VT-X及合理利用搜索

    昨天安装Vmware的时候不幸遇到了Vt-X被禁用的麻烦,上网百度了一下才知道要进入Bois进行设置.说起百度就不得不提到模糊搜索这个概念.这个特性的优点和缺点可谓同等突出,有了模糊搜索大家可以在信息 ...

  10. 个人阅读作业 --软件工程M1/M2总结

    软件工程M1/M2总结 写在前面的话: 这学期的软件工程伴着考期的展开逐渐落下帷幕,回顾这学期的软件工程,我感觉我的热情在一次又一次的失落中逐步消耗殆尽,每个人对于这门课的体验都会有所不同吧,可以确定 ...