题目传送门:https://www.luogu.org/problemnew/show/P4364

期中考后记:期中考刚考完,感觉不咋滴,年排第3。我抗压力太差了。。期末得把rank1抢回来。

本来感觉是个瞎贪心的(对每个歌曲的先决的歌曲为父子关系建树,然后每次找尽量大的孩子)。。其实不是。

贪心仅能骗60分。(省选题不会水的)

前面那个贪心只是瞎YY的。YY的贪心有一定几率出错。

为啥会出错,我一会儿讲。

我们正经得想一个贪心。其实问题变为:

for(i=1;i<=n;++i){

找一个难度为p的歌曲并删去,使在i后面的节点能依照没有p歌曲的歌单下不会没有难度足够大的歌曲的情况下,p尽量大,第i个歌曲难度就是p

}

其实这个贪心的思路非常好想(我最开始想的就是这个,后来去打暴力了,就用了第一个)

我们把设选了歌曲p后需要Ap个大于等于p的歌曲(包括p)。那么,我们只要计算出所有Ap,不就爽歪歪了吗?

最开始,我们将歌曲难度降序排序记为A,Ap=p。

写个伪代码

for(i=1;i<=n;++i){

  找到最靠右的节点k使Ak-1<siz[i](i的子树大小)

  ans[i]=k;

  将ak+1.ak+2....an都减去siz[i];

}

for(i=1;i<=n;++i)输出d[ans[i]]

好了还记得最开始讲的贪心为啥会错吗?

因为,我刚才写的伪代码是错的(错的地方和第一个贪心一毛一样)

正确的在此

for(i=1;i<=n;++i){

  找到最靠右的节点k使Ak-1<siz[i](i的子树大小)

  如果相同的几个歌曲和k的难度一样,那么,将k移到在序列A中最靠左的那个;

  ans[i]=k;

  将ak+1.ak+2....an都减去siz[i];

}

为啥要那样干?反正没有后效性,而且贪心吗,就要贪得彻底,预留给自己的子树尽量多的节点。

代码:

#include <bits/stdc++.h>
using namespace std;
;
],dr[N<<],hd[N],pos,lovewxy[N];
double k;
bool cmp(int x,int y){return  x>y;}
bool vis[N];
],wxy[rt<<|]);}
void pushdown(int rt){
    if(dr[rt]){
        dr[rt<<]+=dr[rt];
        dr[rt<<|]+=dr[rt];
        wxy[rt<<]+=dr[rt];
        wxy[rt<<|]+=dr[rt];dr[rt]=;
    }
}
void build(int rt,int l,int r){
    if(l==r){
        wxy[rt]=l;return;
    }
    ;
    build(rt<<,l,mid);build(rt<<|,mid+,r);pushup(rt);
}
void motify(int rt,int l,int r,int ql,int qr,int d){
    if(ql<=l && r<=qr){
        wxy[rt]+=d;dr[rt]+=d;return;
    }pushdown(rt);
    ;
    ,l,mid,ql,qr,d);
    <=qr)motify(rt<<|,mid+,r,ql,qr,d);
    pushup(rt);
}
int query(int rt,int l,int r,int lst){
    ;
    pushdown(rt);;
    |]<lst)|,mid+,r,lst);
    ,l,mid,lst);
}
void dfs(int u){
    if(u>n)return;
    int l,r;double tmp=(double)u*k;
    l=tmp-;
    while(l<tmp)++l;
    tmp=()*k;
    r=tmp-;while(r<tmp)++r;
    --r;siz[u]=;
    for(int i=r;i>=l;--i)
    if(i<=n)
    dfs(i),siz[u]+=siz[i],fa[i]=u;
}
int main(){
    scanf("%d%lf",&n,&k);
    ;i<=n;++i)scanf(,d++n,cmp);d[n+]=-;
    ;--i)hd[i]= d[i]==d[i+] ? pos:++pos;
    ;i<=n;++i)lovewxy[hd[i]]=max(lovewxy[hd[i]],i);
    ;
    while(p>=k)
    --p;
    ;--i){dfs(i);}build(,,n);
    ;i<=n;++i){
        if(fa[i]&&!vis[fa[i]]){
            motify(,,n,ans[fa[i]],n,siz[fa[i]]-);vis[fa[i]]=;
        }
        ,,n,siz[i]);
        tp=lovewxy[hd[tp]];
        --lovewxy[hd[tp]];
        ans[i]=tp;motify(,,n,ans[i],n,-siz[i]);
    }
    printf(]]);
    ;i<=n;++i)printf(" %d",d[ans[i]]);
}

省选九省联考T2 IIIDX(线段树)的更多相关文章

  1. [九省联考2018] IIIDX 线段树+贪心

    题目: 给出 k 和 n 个数,构造一个序列使得 d[i]>=d[i/k] ,并且字典序最大. 分析: 听说,当年省选的时候,这道题挡住了大批的高手,看上去十分简单,实际上那道弯段时间内是转不过 ...

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

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

  3. BZOJ5249 九省联考2018IIIDX(线段树+贪心)

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

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

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

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

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

  6. [九省联考2018]IIIDX

    题目描述 这一天,Konano接到了一个任务,他需要给正在制作中的游戏<IIIDX>安排曲目的解锁顺序.游戏内共有n首曲目 ,每首曲目都会有一个难度d,游戏内第i首曲目会在玩家Pass第t ...

  7. 洛谷P4364 [九省联考2018]IIIDX 【线段树】

    题目 [题目背景] Osu听过没?那是Konano最喜欢的一款音乐游戏,而他的梦想就是有一天自己也能做个独特酷炫的音乐游戏.现在 ,他在世界知名游戏公司KONMAI内工作,离他的梦想也越来越近了.这款 ...

  8. [luogu]P4364 [九省联考2018]IIIDX

    题目背景 Osu 听过没?那是Konano 最喜欢的一款音乐游戏,而他的梦想就是有一天自己也能做个独特酷炫的音乐游戏.现在,他在世界知名游戏公司KONMAI 内工作,离他的梦想也越来越近了. 这款音乐 ...

  9. BZOJ.5249.[九省联考2018]iiidx(贪心 线段树)

    BZOJ LOJ 洛谷 \(d_i\)不同就不用说了,建出树来\(DFS\)一遍. 对于\(d_i\)不同的情况: Solution 1: xxy tql! 考虑如何把这些数依次填到树里. 首先对于已 ...

随机推荐

  1. ngget配置

    Install-Package NuGet.CommandLine nuget spec nuget pack Jryg.VirtualNumber.ClientNet4.csproj -Includ ...

  2. RenderMonkey基本使用方法

    http://www.cnblogs.com/mixiyou/archive/2009/10/05/1578208.html 楔子: 差不多从年中开始由于工作需要,开始研究Direct3D,这是继大二 ...

  3. 汇编题目:在屏幕中间显示a-z的所有字母,按ESC键改变字符颜色

    在屏幕中显示a-z字母,按ESC键改变字符颜色. ;程序功能:在屏幕中间同一点显示a-z的所有字符 ; 1.使用cpu循环空运行实现延迟 ; 2.按ESC键改变正在循环显示的字符的颜色 ; 3.程序完 ...

  4. 大数据排序算法:外部排序,bitmap算法;大数据去重算法:hash算法,bitmap算法

    外部排序算法相关:主要用到归并排序,堆排序,桶排序,重点是先分成不同的块,然后从每个块中找到最小值写入磁盘,分析过程可以看看http://blog.csdn.net/jeason29/article/ ...

  5. oracle 12c 列式存储 ( In Memory 理论)

    随着Oracle 12c推出了in memory组件,使得Oracle数据库具有了双模式数据存放方式,从而能够实现对混合类型应用的支持:传统的以行形式保存的数据满足OLTP应用:列形式保存的数据满足以 ...

  6. POJ1456:Supermarket

    浅谈堆:https://www.cnblogs.com/AKMer/p/10284629.html 题目传送门:http://poj.org/problem?id=1456 把物品按照时间排序,显然\ ...

  7. (Python编程)Pickle对象

    Programming Python, 3rd Edition 翻译 最新版本见:http://wiki.woodpecker.org.cn/moin/PP3eD 19.4. Pickled Obje ...

  8. 10_android打包的过程

    java代码先编译成.class,最后打包成.dex.resources  uncompiled resources:不需要编译的资源:资产目录assets 清单文件 用来标识唯一的安卓应用:签名和包 ...

  9. CODING 代码托管架构升级之路

    本文为 CODING 创始团队成员王振威在『CODING 技术小馆:上海站』的演讲实录. CODING 技术小馆,是由国内专业的一站式软件服务平台 CODING 主办的一系列技术沙龙.将邀请数位业内知 ...

  10. iOS开发,使用CocoaSSDP查找设备时按关键字过滤Device

    关于CocoaSSDP的资料有很多,这里就不介绍了. 希望寻找的目标设备,在header中设置了自定义的keyword,虽然通过外围代码也能达到相同目的,但是直接修改CocoaSSDP源码更简便. 导 ...