省选九省联考T2 IIIDX(线段树)
题目传送门: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(线段树)的更多相关文章
- [九省联考2018] IIIDX 线段树+贪心
题目: 给出 k 和 n 个数,构造一个序列使得 d[i]>=d[i/k] ,并且字典序最大. 分析: 听说,当年省选的时候,这道题挡住了大批的高手,看上去十分简单,实际上那道弯段时间内是转不过 ...
- [BZOJ5249][九省联考2018]IIIDX(线段树)
5249: [2018多省省队联测]IIIDX Time Limit: 40 Sec Memory Limit: 512 MBSubmit: 32 Solved: 17[Submit][Statu ...
- BZOJ5249 九省联考2018IIIDX(线段树+贪心)
显然这形成了一个树形结构.考虑这样一种贪心:按照曲目顺序,每次取消其父亲的预留,并选择当前可选择(保证其子树有合法选择且满足预留)的最大值,然后对其子树预留出大于等于他的一些值.这个做法显然是正确的. ...
- [luogu] P4364 [九省联考2018]IIIDX(贪心)
P4364 [九省联考2018]IIIDX 题目背景 Osu 听过没?那是Konano 最喜欢的一款音乐游戏,而他的梦想就是有一天自己也能做个独特酷炫的音乐游戏.现在,他在世界知名游戏公司KONMAI ...
- [BZOJ 5252][LOJ 2478][九省联考2018] 林克卡特树
[BZOJ 5252][LOJ 2478][九省联考2018] 林克卡特树 题意 给定一个 \(n\) 个点边带权的无根树, 要求切断其中恰好 \(k\) 条边再连 \(k\) 条边权为 \(0\) ...
- [九省联考2018]IIIDX
题目描述 这一天,Konano接到了一个任务,他需要给正在制作中的游戏<IIIDX>安排曲目的解锁顺序.游戏内共有n首曲目 ,每首曲目都会有一个难度d,游戏内第i首曲目会在玩家Pass第t ...
- 洛谷P4364 [九省联考2018]IIIDX 【线段树】
题目 [题目背景] Osu听过没?那是Konano最喜欢的一款音乐游戏,而他的梦想就是有一天自己也能做个独特酷炫的音乐游戏.现在 ,他在世界知名游戏公司KONMAI内工作,离他的梦想也越来越近了.这款 ...
- [luogu]P4364 [九省联考2018]IIIDX
题目背景 Osu 听过没?那是Konano 最喜欢的一款音乐游戏,而他的梦想就是有一天自己也能做个独特酷炫的音乐游戏.现在,他在世界知名游戏公司KONMAI 内工作,离他的梦想也越来越近了. 这款音乐 ...
- BZOJ.5249.[九省联考2018]iiidx(贪心 线段树)
BZOJ LOJ 洛谷 \(d_i\)不同就不用说了,建出树来\(DFS\)一遍. 对于\(d_i\)不同的情况: Solution 1: xxy tql! 考虑如何把这些数依次填到树里. 首先对于已 ...
随机推荐
- 省选/NOI刷题Day1
bzoj4864 Splay乱搞 bzoj3669 正解LCT,考虑上下界的spfa可过 bzoj3668 位运算 暴力 bzoj3670 KMP DP bzoj3671 含有最小的一个数的路径一定比 ...
- SQL中replace函数
string sql1 = "select price from dbo.eazy_farm where REPLACE(title,' ','')='" + cainame + ...
- asp.net中日志框架Log4Net的使用
Log4Net是用来记录日志的,可以将程序运行过程中的信息输出到一些地方(文件.数据库.EventLog等),日志就是程序的黑匣子,可以通过日志查看系统的运行过程,从而发现系统的问题.日志的作用:将运 ...
- 统计不同的单词(map应用)
题目描述: 输入一些单词,找出所有满足如下条件的单词:该单词不能通过字母重排,得到输入文本中的另一个单词.在判断是否满足条件时,字母不区分大小写,但在输出时应保留输入中的大小写,按字典序进行排列(所有 ...
- HDOJ5441(图论中的并查集)
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; ; ; ; ...
- 【转】Pro Android学习笔记(二六):用户界面和控制(14):RelativeLayout
相对布局:RelativeLayout RelativeLayout也是非常常用的布局,能够精确对控件的位置进行网格对齐,可以设置在控件与其他控件的相对位置,以及控件在容器中的位置.缺省控件的位置为最 ...
- centos7 查看启动ntp服务命令
标签(空格分隔): centos7 系统 1. 查看ntp服务命令: [root@node1 ~]# systemctl status ntpd * ntpd.service - Network Ti ...
- Linux(C/C++)下的文件操作open、fopen与freopen via Boblim
Linux(C/C++)下的文件操作open.fopen与freopen open是linux下的底层系统调用函数,fopen与freopen c/c++下的标准I/O库函数,带输入/输出缓冲. li ...
- springMVC绑定json参数之二(2.2.4)
二.springmvc 接收不同格式的json字符串 4).格式四:json传递复杂对象(对象中有属性,还有List,这里验证数组接收,不用List,其他的和上一节不变) 测试一: Test对象属性如 ...
- Select 标签的默认值设置
以下是网上“借鉴”的:(http://blog.csdn.net/nairuohe/article/details/6307367/) 比如<select class="selecto ...