[贪心 线段树] LOJ#2472. 「九省联考 2018」IIIDX

[九省联考2018] iiidx 给定一颗nnn个点的有根树,和nnn权值d1...dnd1...dnd_1 ... d_n。将每个权值分配个每个节点,要求使父亲的权值小于等于儿子的权值。依次最大化1,2,3...n1,2,3...n1, 2, 3...n号点的权值,输出方案。 n≤600000n≤600000n \leq 600000 从111号点开始枚举,由于我们要使一个点最大,所以我们每次都要求出当前符合要求的最大的... 阅读详情

从1到n枚举,逐位确定。

首先可以把关系树建出来,一个点的权值要大于等于父节点的权值。

如果没有相同数字的,第 ii 以及它子树种的点会选择 [n−sizei+1,n] 这个区间里的数,选完后把这个区间删去,继续考虑 i+1i+1

如果有重复的数字,那么第 ii 个点会选择第 n−sizei+1 大的数字,但是它的子树中的点选择的区间就不能确定。

令 aiai 表示大于等于 ii 的可以选择的数的个数,bi 表示已经选了多少个大于等于 ii 的数

那么如果当前考虑 i 点,ii 点选择的数为 p ( pp 肯定会尽可能的大),那么我们就会选择 sizei 个大于等于 pp 的数。

可以发现,如果 i 能选择 pp,那么对于任何一个小于等于 p 的 jj 都满足 bj+sizei≤aj

也就是 sizei≤aj−bjsizei≤aj−bj ,用线段树记录 aj−bjaj−bj ,然后在线段树上二分一下 pp 就可以了

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <vector>
#define ALL(x) (x).begin(),(x).end()

using namespace std;

typedef pair<int,int> pii;

const int N=500010;

int n,cnt,b[N],a[N],G[N],size[N],ans[N],son[N],dpt[N],fa[N];
double k;
struct edge{
    int t,nx;
}E[N];

vector<int> sb;

inline void addedge(int x,int y){
    E[++cnt].t=y; E[cnt].nx=G[x]; G[x]=cnt;
}

void dfs(int x){
    size[x]=1;
    for(int i=G[x];i;i=E[i].nx){
        dpt[E[i].t]=dpt[x]+1;
        dfs(E[i].t);
        size[x]+=size[E[i].t];
        fa[E[i].t]=x;
    }
}

int mn[N<<2],tag[N<<2];

inline void Up(int g){
    mn[g]=min(mn[g<<1]+tag[g<<1],mn[g<<1|1]+tag[g<<1|1]);
}

void build(int g,int l,int r){
    if(l==r) return mn[g]=b[l],void();
    int mid=l+r>>1;
    build(g<<1,l,mid); build(g<<1|1,mid+1,r);
    Up(g);
}

vector<int> Q[N];

void Modify(int g,int l,int r,int L,int R,int x){
    if(l==L && r==R) return tag[g]+=x,void();
    int mid=L+R>>1;
    if(r<=mid) Modify(g<<1,l,r,L,mid,x);
    else if(l>mid) Modify(g<<1|1,l,r,mid+1,R,x);
    else Modify(g<<1,l,mid,L,mid,x),Modify(g<<1|1,mid+1,r,mid+1,R,x);
    Up(g);
}

int Query(int s){
    int g=1,l=1,r=n,ret;
    while(l<r){
        int mid=l+r>>1; s-=tag[g];
        if(mn[g<<1]+tag[g<<1]<s) r=mid,g=g<<1;
        else l=mid+1,g=g<<1|1,ret=mid;
    }
    if(mn[g]+tag[g]>=s) return l;
    return ret;
}

int main(){
    scanf("%d%lf",&n,&k);
    for(int i=1;i<=n;i++)   
        scanf("%d",&a[i]),sb.push_back(a[i]);
    sb.push_back(0); sort(ALL(sb)); sb.erase(unique(ALL(sb)),sb.end());
    for(int i=1;i<=n;i++) a[i]=lower_bound(ALL(sb),a[i])-sb.begin();
    for(int i=1;i<=n;i++) addedge(i/k,i);
    dfs(0);
    for(int i=1;i<=n;i++) b[a[i]]++;
    for(int i=n;i;i--) b[i]+=b[i+1];
    build(1,1,n);
    for(int i=1;i<=n;i++) Q[dpt[i]].push_back(i);
    for(int d=1;d<=dpt[n];d++){
        for(int i=0;i<Q[d].size();i++){
            if(d>1 && (i==0 || fa[Q[d][i]]!=fa[Q[d][i-1]]))
                Modify(1,1,ans[fa[Q[d][i]]],1,n,size[fa[Q[d][i]]]-1);
            int u=Q[d][i],p=Query(size[u]);
            ans[u]=p; Modify(1,1,p,1,n,-size[u]);
        }
    }
    for(int i=1;i<=n;i++) printf("%d ",sb[ans[i]]);
    return 0;
}
告别谷歌翻译失效!手把手教你用Immersive Translate插件实现双语网页阅读(附Chrome/Edge/Firefox保姆级配置) 本文详细介绍了如何使用Immersive Translate插件实现双语网页阅读,解决谷歌翻译失效的问题。通过Chrome、Edge和Firefox的保姆级配置指南,帮助用户轻松安装和使用这款支持双语对照、智能识别网页内容的翻译插件,提升外文资料阅读效率。 阅读详情

相关推荐

SAP 财务BAPI_ACC_DOCUMENT_POST批导的税务tax

最近遇到了关于SAP财务凭证批导要bapi:BAPI_ACC_DOCUMENT_POST增加税的功能要求,查阅了一众文献发现都不尽如人意,所以想着自己写一个趟过的雷吧。 一般前台sap的凭证是有自动计算税码的勾选框的,但是bapi却并没有这个字段。 实际操作过程中1.可以定义一个税额的结构,参考bapiactx09 2.在会计分录上传如果需要增加税码的时候,譬如总账gl,需要对应tax_code 3.通过CALCULATE_TAX_FROM_GROSSAMOUNT 计算出税额和acct_k...

qq_35640448的博客 3182

【BZOJ5249】【九省联考2018】IIIDX(线段树)

Description 他需要给正在制作中的游戏《IIIDX》安排曲目的解锁顺序。游戏内共有n首曲目,每首曲目都会有一个难度d,游戏内第i首曲目会在玩家Pass第trunc(i/k)首曲目后解锁(x为下取整符号)若trunc(i/k)=0,则说明这首曲目无需解锁。举个例子:当k=2时,第1首曲目是无需解锁的(trunc(1/2)=0),第7首曲目需要玩家Pass第trunc(7/2)=3首曲目才...

დ♂Hany01's Blog Space♂ღ 400

AFSim插件开发实战:从环境搭建到功能扩展

本文详细介绍了AFSim插件开发的完整流程,从环境搭建到功能扩展,涵盖了SDK配置、插件创建、核心代码解析、功能扩展实战、调试优化以及高级开发技巧。通过实战案例和实用技巧,帮助开发者快速掌握AFSim插件开发,提升仿真系统的扩展性和灵活性。

weixin_29309475的博客 576

九省联考总贴

秘密袭击单独写了。 详情见另一个博客。 #include &amp;amp;lt;bits/stdc++.h&amp;amp;gt; using namespace std; typedef unsigned int ui; const int N = 2e3 + 5; const int M = N * 2; const ui mod = 64123; const int MAX = 1e5 + 5; struct ...

Fire Dancer 617

VSCode玩转ESP-ADF音频开发:从环境搭建到成功播放MP3的避坑全流程

本文详细介绍了如何在VSCode环境下使用ESP-ADF框架进行ESP32音频开发,从环境搭建到成功播放MP3的全流程。重点解析了`IDF_PATH`和`ADF_PATH`的配置问题,以及如何解决`xTaskCreateRestrictedPinnedToCore`等常见编译错误,帮助开发者快速上手ESP-ADF音频开发。

weixin_42520909的博客 339

Visual Studio 2022与Qt集成实战:解决Qt.props导入错误的完整指南

本文详细解析了在Visual Studio 2022中集成Qt开发时,如何解决因Qt.props文件导入失败导致的编译错误。文章从问题根源入手,深入剖析了Qt.props文件与QtMsBuild环境变量的关系,并提供了从检查文件存在性、配置环境变量到直接修改项目文件路径的完整排查与修复方案,帮助开发者快速恢复项目构建。

wdx01234567的博客 672

[九省联考 2018] 一双木棋 chess

我的第一道轮廓线dp。

pyx寄居地 302

问答式AI vs 智能体(Agent):它们有什么不同?

你肯定用过 ChatGPT 或文心一言——问它一个问题,它给你一个答案。AI Agent(AI智能体)。很多人搞不清楚:它们不都是"AI"吗?有什么区别?这篇文章用一个最简单的类比,彻底讲清楚这两者的本质差异。框架特点适合人群AutoGPT完全自主执行任务,链式思考开发者MetaGPT模拟团队协作,多角色分工开发者LangChain最流行的Agent开发框架开发者Dify可视化无代码搭建Agent非技术用户Coze(扣子)字节跳动出品,国内最易用普通用户WorkBuddy。

Johnny2004的专栏 445

[九省联考2018]一双木棋chess

题目 题目描述 菲菲和牛牛在一块n 行m 列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手。 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结束。 落子的规则是:一个格子可以落子当且仅当这个格子内没有棋子且这个格子的左侧及上方的所有格子内都有棋子。 棋盘的每个格子上,都写有两个非负整数,从上到下第i 行中从左到右第j 列的格 子上的两个整数记作A_{i,j}A i,j ​ 、B_{i,j}B i,j ​ 。在游戏结束后,菲菲和牛牛会分别计算自己的得分:菲菲的得分是所有有黑棋的格子上的

Brute♂force 458

HFSS 3D Layout仿真PCB操作说明

本文介绍一种特别适合PCB这种叠层结构的仿真软件,HFSS 3D Layout既有操作的简便性,又有同3D软件仿真所有的精确性,仿真速度上又比3D软件快很多。

sinat_15150363的博客 3937

【电源专题】Type-C母座外壳直接接主板GND还是接RC呢?别再纠结了!

Type-C屏蔽壳接地这件事,没有唯一标准答案。符合规范、贴合产品、能过认证,就是最优解。希望这篇文章能帮你理清思路。

一点硬件 592

[九省联考 2018] iiidx

题目描述: 给出一个序列 重新安排序列的下标 使得 di&lt;=di/kdi&lt;=di/kd_ididid_i不相同的情况成立 比如 4 2.0 1 1 1 2 这组样例 用贪心搞出来的是 1 1 1 2 其实正解应该是1 1 2 1 如果权值有重复的,我们要找和第siz大的权值相等的权值中最靠右的那个点,再给子树预定siz-1个,这样做能够让当前点权值尽可能大的前提...

HT008的Blog 757

寒武纪面试——数字IC,数字逻辑岗

面试过程:面试是电话面试,通话时间大致在40分钟左右!面试体验挺不错的。面试的岗位是数字逻辑工程师。本人双非,拿过一个国一(南京FPGA大赛),一个数学建模省二。

FPGA/MATLAB学习教程/源码/项目合作开发 1374

九省联考2018D1T2 IIIDX

链接很容易发现,歌曲间的关系构成了一棵树,于是O(n)的贪心算法也就是显然的。但是我们对贪心带来的55~60分不满意,鉴于这个题是个nlogn范围,所以还是用数据结构吧。很容易发现,题目给出的n首歌的难度顺序不会影响最终答案,所以首先对这个难度值从大到小排序。不过树还是要构造的,接下来预处理出每个节点的子树大小。之后,每次找一个最靠左的位置,使得这个位置左边足够放下当前节点的子树。如果有多个值相同...

star_city 445

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

P4363 [九省联考2018]一双木棋chess

题目链接 题目描述 菲菲和牛牛在一块 nnn 行 mmm 列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手。 棋局开始时,棋盘上没有任何棋子,两人轮流在格子上落子,直到填满棋盘时结束。 落子的规则是:一个格子可以落子当且仅当这个格子内没有棋子且这个格子的左侧及上方的所有格子内都有棋子。 棋盘的每个格子上,都写有两个非负整数,从上到下第 iii 行中从左到右第 jjj 列的格子上的两个整数记作 ai,ja_{i,j}ai,j​ 和 bi,jb_{i,j}bi,j​。 在游戏结束后,菲菲和牛牛会分别计算自己的得分

sky123博客 417

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

[九省联考2018]IIIDX——贪心

Description: 【题目背景】 Osu听过没?那是Konano最喜欢的一款音乐游戏,而他的梦想就是有一天自己也能做个独特酷炫的音乐游戏。现在 ,他在世界知名游戏公司KONMAI内工作,离他的梦想也越来越近了。这款音乐游戏内一般都包含了许多歌曲,歌曲 越多,玩家越不易玩腻。同时,为了使玩家在游戏上氪更多的金钱花更多的时间,游戏一开始一般都不会将所有曲 目公开,有些曲目你需要通关某首...

ylsoi的博客 461

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【BZOJ5248】【九省联考2018】一双木棋(搜索,哈希)

题面BZOJDescription菲菲和牛牛在一块n行m列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手。棋局开始时,棋盘上没有任何棋子, 两人轮流在格子上落子,直到填满棋盘时结束。落子的规则是:一个格子可以落子当且仅当这个格子内没有棋子且 这个格子的左侧及上方的所有格子内都有棋子。 棋盘的每个格子上,都写有两个非负整数,从上到下第i行中从左到右第j列的格子上的两个整数记作Aij、Bij。在

小蒟蒻yyb的博客 1039

[LOJ]#2472. 「九省联考 2018」IIIDX 线段树+贪心

Solution 按照大小关系连边之后得到一棵树,然后肯定是每次填入尽量大的数,如果当前连到第xxx个点,那么就需要知道当前能用的数中最大的一个有sizexsize_xsizex​个数大于等于它的数,考虑如何维护这个东西。如果直接维护现在每种数剩下多少个,就很难搞,反正我是没有搞出来,考虑换一个东西,维护大于等于每种数的还有多少个数能用,这样的话每次是一个区间加减,还有一个线段树上二分的操作。注意...

TYB的博客 308

[博弈] LOJ#2471. 「九省联考 2018」一双木棋

考虑暴力。 每次枚举放哪个位置,设已经放了棋子的位置集合为 SSS,fSfSf_S 表示当前放置情况为 SSS 时,双方采用最优策略后,两个人的权值和的差。 那么如果是菲菲,会选择 fS+ai,jfS+ai,jf_S+a_{i,j} 最大的,牛牛会选择 fS−bi,jfS−bi,jf_S-b_{i,j} 最小的,然后跑dfs 实际上如果记忆化一下就能过了。 考虑每一种合法的状态,棋子都是放...

CE玩家 573

#2472. 「九省联考 2018」IIIDX

一眼思路的题… 就是比较难写.. 考虑一个点必须小于其 ⌊idk⌋⌊idk⌋ \lfloor \frac{id}{k} \rfloor 那么容易想出一个树形结构,每个点都大于其父亲. 那么对于一个点,那么他能选取的最大值就是当前能选的所有点中的n−size[id]n−size[id]n-size[id]这个点的值。 然后留够其儿子的位置即可。 最后如果有相同的点,容易想到把当前点放在权值...

Tgotp的博客 737

洛谷4364 [九省联考2018]IIIDX

标签:线段树 题目 题目传送门 题目背景 Osu 听过没?那是Konano 最喜欢的一款音乐游戏,而他的梦想就是有一天自己也能做个独特酷炫的音乐游戏。现在,他在世界知名游戏公司KONMAI 内工作,离他的梦想也越来越近了。 这款音乐游戏内一般都包含了许多歌曲,歌曲越多,玩家越不易玩腻。同时,为了使玩家在游戏上氪更多的金钱花更多的时间,游戏一开始一般都不会将所有曲目公开,有些曲目你需要...

Welcome to yjjr's blog! 454

BZOJ5249 [2018多省省队联测]IIIDX(神奇的贪心)

题目链接:BZOJ 5249题目大意:n(n<=500000)首曲子,n个难度值d[i] (d[i]<=1000000000)。给定一个实数k (k<=1000000000),完成第⌊ik⌋ \lfloor \frac ik \rfloor 首曲子后才能解锁第i首曲子,若⌊ik⌋=0 \lfloor \frac ik \rfloor =0,说明第i首曲子无需解锁。确定一种字典序最大的难度顺序,保证每

XHRlyb的博客 923

「九省联考 2018」IIIDX

题面 分析 60pts60pts60pts 贪心做法很显然对吧,把它看成一棵树很显然对吧。 不妨将权值从小到大排序。 对于一个点 xxx 的子树,每次取 n−siz[x]+1→nn-siz[x]+1\to nn−siz[x]+1→n 的权值即可,这种贪心在权值不相等的情况是可行的。p.s.siz[x]siz[x]siz[x] 为 xxx 的子树大小。 而权值不相等时,这种做法显然有问题。不妨思考一下,对于一个点 xxx,要取第 iii 小的权值要满足什么条件?对的,要满足 iii 以及 iii 右边(即

Clever_Hard的博客 363

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

「九省联考 2018」IIIDX 这什么鬼题,送的55分要拿稳,实测有60? 考虑把数值从大到小摆好,每个位置\(i\)维护一个\(f_i\),表示\(i\)左边比它大的(包括自己)还有几个数可以选 这个最开始直接处理好,就是>=数值\(i\)的数字个数 如果我们从小到大安排,发现我们需要给当前数安排一个数值,根据贪心,这个数值要尽可能大,但又要满足一个条件,就是这个数值右边的\(\min ...

weixin_30569033的博客 242

loj2472 「九省联考 2018」IIIDX

ref #include <algorithm> #include <iostream> #include <cstdio> using namespace std; int n, a[500005], fa[500005], siz[500005], cnt[500005], ans[500005]; int hmn[500005]; double ...

dianjiaxian1205的博客 238

九省联考2018总结

前言 我作为一名ZJOI2018day1凉凉选手,为获得更多的省选体验,去上海参加了九省联考2018,当然,是属于外省选手参加的(所以实际并测的时候出现了一些问题也得不到解决),做完两天的题,深有感触,在此写一篇博客进行总结(姗姗来迟~) (另:为啥ZJOI不写博客呢,因为day2还没考,逃~) day0 从杭州出发,乘坐高铁来到上海,高铁的速度还挺快,实际上就花了一个小时就到了上海虹...

zhouyuheng2003的博客 1771
上一篇: [博弈] LOJ#2471. 「九省联考 2018」一双木棋
下一篇: [DP] LOJ#2473. 「九省联考 2018」秘密袭击
LowestJN
博客等级 码龄10年 76粉丝 422原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值