Description

Link.

给出一个堆,然后让你填数进去,使得其满足小根堆的性质,并使编号靠前的点的数最大。

Solution

考虑贪心,把原数列降序排序,然后因为这个东西是整除分块的形式,所以一个结点的子树一定对应的是原序列的一个子区间。不过这个东西并不能用根号分治来做。

然后对于一个子树的根 \(u\),我们给他 \([l,r]\) 这个区间,\(\text{subtree}(u)-\{u\}=a_{[l,r)}\),结点 \(u=a_{r}\),\([l,r]\) 按需分配,反正就优先队列维护就行了。

代码大概长成这样子:

void Search(int x) {
for(int y in SonOf(x)) Search(y);
if(x != VirtualRoot) {
ans[x] = PriorityQueue.top();
PriorityQueue.pop();
}
}

那个 VirtualRoot 是为了编码方便弄出来的一个虚根,不用管。同时发现这个做法只有在 \(\forall i,j,s.t.d_{i}\neq d_{j}\) 的时候才是对的。Hack 数据网上找找应该有。

对于一个与 \(u\) 同层的结点,可能会出现这个结点与 \(u\) 的儿子交换点权后更优的情况。

对值域 \([1,n]\) 建出一棵线段树,同时定义 \(pos_{i}\) 为 \(\max\{j\mid a_{i}=a_{i+1}=\cdots=a_{j}\}\)。然后每次查找能用的个数不小于该结点子树大小的位置,有多解跑到最右边,然后把这个位置的能用个数减去子树大小。描述的不清楚,建议做代码阅读理解领略一下精神。

#include<bits/stdc++.h>
struct node
{
int mn,tag;
node(int A=0,int B=0)
{
mn=A;
tag=B;
}
}nodes[2000010];
std::vector<std::vector<int> > e;
int n,siz[500010],ans[500010];
double k;
void dfs(int x)
{
siz[x]=1;
for(int i=0;i<int(e[x].size());++i)
{
int y=e[x][i];
dfs(y);
siz[x]+=siz[y];
}
}
void build(int l,int r,int x)
{
if(l^r)
{
int mid=(l+r)>>1;
build(l,mid,x<<1);
build(mid+1,r,x<<1|1);
nodes[x].mn=std::min(nodes[x<<1].mn,nodes[x<<1|1].mn);
}
else nodes[x].mn=l;
}
void push_down(int x)
{
if(nodes[x].tag)
{
int &cur=nodes[x].tag;
nodes[x<<1].mn+=cur;
nodes[x<<1|1].mn+=cur;
nodes[x<<1].tag+=cur;
nodes[x<<1|1].tag+=cur;
cur=0;
}
}
void ins(int l,int r,int x,int fr,int ba,int delta)
{
if(l>ba || r<fr) return;
if(l>=fr && r<=ba)
{
nodes[x].mn+=delta;
nodes[x].tag+=delta;
}
else
{
int mid=(l+r)>>1;
push_down(x);
ins(l,mid,x<<1,fr,ba,delta);
ins(mid+1,r,x<<1|1,fr,ba,delta);
nodes[x].mn=std::min(nodes[x<<1].mn,nodes[x<<1|1].mn);
}
}
int find(int l,int r,int x,int d)
{
if(l^r)
{
int mid=(l+r)>>1;
push_down(x);
if(d<=nodes[x<<1|1].mn) return find(l,mid,x<<1,d);
else return find(mid+1,r,x<<1|1,d);
}
else return l+(nodes[x].mn<d);
}
int getDiv(int x,double k)
{
return int(std::floor(double(x)/k));
}
int main()
{
scanf("%d %lf",&n,&k);
e.resize(n+1);
std::vector<int> a(n+10),pos(n+10);
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
std::sort(a.begin()+1,a.begin()+n+1,std::greater<int>());
for(int i=n-1;i;--i)
{
if(a[i]==a[i+1]) pos[i]=pos[i+1]+1;
}
for(int i=1;i<=n;++i) e[getDiv(i,k)].emplace_back(i);
dfs(0);
build(1,n,1);
for(int i=1;i<=n;++i)
{
if(getDiv(i,k)^getDiv(i-1,k)) ins(1,n,1,ans[getDiv(i,k)],n,siz[getDiv(i,k)]-1);
int tmp=find(1,n,1,siz[i]);
tmp+=pos[tmp];
++pos[tmp];
tmp-=pos[tmp]-1;
ans[i]=tmp;
ins(1,n,1,tmp,n,-siz[i]);
}
for(int i=1;i<=n;++i) printf("%d ",a[ans[i]]);
return 0;
}

Solution -「九省联考 2018」IIIDX的更多相关文章

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

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

  2. loj2472 「九省联考 2018」IIIDX

    ref #include <algorithm> #include <iostream> #include <cstdio> using namespace std ...

  3. LOJ #2473. 「九省联考 2018」秘密袭击

    #2473. 「九省联考 2018」秘密袭击 链接 分析: 首先枚举一个权值W,计算这个多少个连通块中,第k大的数是这个权值. $f[i][j]$表示到第i个节点,有j个大于W数的连通块的个数.然后背 ...

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

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

  5. LOJ 2743(洛谷 4365) 「九省联考 2018」秘密袭击——整体DP+插值思想

    题目:https://loj.ac/problem/2473 https://www.luogu.org/problemnew/show/P4365 参考:https://blog.csdn.net/ ...

  6. [loj 2478][luogu P4843]「九省联考 2018」林克卡特树

    传送门 Description 小L 最近沉迷于塞尔达传说:荒野之息(The Legend of Zelda: Breath of The Wild)无法自拔,他尤其喜欢游戏中的迷你挑战. 游戏中有一 ...

  7. @loj - 2478@「九省联考 2018」林克卡特树

    目录 @description@ @solution@ @part - 1@ @part - 2@ @accepted code@ @details@ @description@ 小 L 最近沉迷于塞 ...

  8. 【LOJ】#2479. 「九省联考 2018」制胡窜

    题解 老了,国赛之前敲一个后缀树上LCT和线段树都休闲的很 现在后缀树上线段树合并差点把我写死 主要思路就是后缀树+线段树合并+容斥,我相信熟练的OIer看到这已经会了 但就是不想写 但是由于我过于老 ...

  9. LOJ#2471「九省联考 2018」一双木棋 MinMax博弈+记搜

    题面 戳这里 题解 因为每行取的数的个数是单调不增的,感觉状态数不会很多? 怒而记搜,结果过了... #include<bits/stdc++.h> #define For(i,x,y) ...

  10. Solution -「六省联考 2017」「洛谷 P3750」分手是祝愿

    \(\mathcal{Description}\)   Link.   有 \(n\) 盏编号为 \(1\sim n\),已知初始状态的灯,每次操作选取 \(x\in[1,n]\),使得所有编号为 \ ...

随机推荐

  1. go 实现ringbuffer以及ringbuffer使用场景介绍

    ringbuffer因为它能复用缓冲空间,通常用于网络通信连接的读写,虽然市面上已经有了go写的诸多版本的ringbuffer组件,虽然诸多版本,实现ringbuffer的核心逻辑却是不变的.但发现其 ...

  2. ChatGPT的原理与前端领域实践

    一.ChatGPT 简介 ChatGPT的火爆 ChatGPT作为一个web应用,自22年12月发布,仅仅不到3个月的时间,月活用户就累积到1亿.在此之前,最快记录的保持者也需要9个月才达到月活1亿. ...

  3. ASP.NET Core 6框架揭秘实例演示[38]:两种不同的限流策略

    承载ASP.NET应用的服务器资源总是有限的,短时间内涌入过多的请求可能会瞬间耗尽可用资源并导致宕机.为了解决这个问题,我们需要在服务端设置一个阀门将并发处理的请求数量限制在一个可控的范围,即使会导致 ...

  4. 浅谈TCP和UDP

    简介 在计算机网络中,TCP(传输控制协议)和UDP(用户数据报协议)是两个常用的传输层协议.它们分别提供了可靠的数据传输和快速的数据传送,成为互联网世界中的双子星.本文将探讨TCP和UDP的特点.优 ...

  5. 洛谷 P5540 [BalkanOI2011] timeismoney | 最小乘积生成树

    题意 给一个无向图,边有两个权 \(a\) 和 \(b\),定义一个生成树的权值是 \(\left(\sum\limits_{e\in T}a_e\right)\left(\sum\limits_{e ...

  6. 使用 Transformers 为多语种语音识别任务微调 Whisper 模型

    本文提供了一个使用 Hugging Face Transformers 在任意多语种语音识别 (ASR) 数据集上微调 Whisper 的分步指南.同时,我们还深入解释了 Whisper 模型.Com ...

  7. Windows服务启动exe无界面终极解决方案

      1.前言 我这个方案(C#操作)是彻底解决[从Windows服务启动程序exe,程序无界面]问题的终极解决方案,终极方案,绝对的终极方案,本来打算收钱的,还是算了,你们也不容易,关注我一下就行.后 ...

  8. 1.4 编写简易ShellCode弹窗

    在前面的章节中相信读者已经学会了使用Metasploit工具生成自己的ShellCode代码片段了,本章将继续深入探索关于ShellCode的相关知识体系,ShellCode 通常是指一个原始的可执行 ...

  9. pytest7.4版本的一个变更,可能会影响你的项目

    pytest7.4版本的一个变更,可能会影响你的项目 本文撰写于 2023.7.10 准备工作 项目结构如下 D:\Gitee\DemoRepo (17.97MB) +-- testCases (1. ...

  10. 即构推出低延迟直播产品L3,可将直播延迟降到1s

    近日,全球云通讯服务提供商ZEGO即构科技推出低延迟直播产品Low-Latency Live,简称L3.这款产品对传统CDN直播中"延迟较大.弱网抗性差.观众端内容不同步"等问题进 ...