题解:P6544 [CEOI2014] Cake

news/2025/1/24 16:44:25/文章来源:https://www.cnblogs.com/Kenma/p/18689770

P6544 解题报告

前言

感觉没有紫……

但是评了我也没意见。

思路分析

首先考虑怎样计算答案。

如果 \(b\)\(a\) 的左侧,那么设 \(x\)\([b,a]\) 的最大值,\(c\)\([a,n]\) 中最靠左的 \(d_c>x\) 的位置,那么答案为 \(b-c-1\)

应该不难理解。想要吃掉 \(b\),必须吃掉 \([b,a]\) 的所有蛋糕,和 \([a,n]\) 中部分比 \(d_b\) 小的蛋糕。

可以直接线段树二分解决。

瓶颈在于修改。

发现这个修改非常神秘,它只修改值的大小关系,但是不修改具体的值。

因为 \(e\le 10\) 非常不正常,所以考虑从这里入手解决。

发现如果我们只维护前 \(10\) 大所在的位置,那么修改时可以把前 \(e-1\) 大的值整体向前平移一段距离,给第 \(e\) 大留出位置,然后把第 \(e+1\) 大往后的排名整体后移。

感觉上比维护实数值好写多了。

然后就做完了。

实际上,只需要维护一棵支持单点修改,查询最大值,查询区间 \(>k\) 的最靠左/右的下标的线段树就行了。

总体复杂度 \(O(en\log n)\),在洛谷上跑进了 300 ms。

代码实现

感觉上不是很难写,但是从想到做完还是用了 1 h。


#include<bits/stdc++.h>
using namespace std;
int n,m,a,pos,maxn,sum,num,id,e,d[250005],c[250005];
char op;
int val[500005],ls[500005],rs[500005],dcnt,rt;
void pushup(int x){val[x]=max(val[ls[x]],val[rs[x]]);
}
void build(int l,int r,int &x){x=++dcnt;if(l==r){val[x]=d[l];return;}int mid=(l+r)>>1;build(l,mid,ls[x]);build(mid+1,r,rs[x]);pushup(x);
}
void modify(int l,int r,int pos,int k,int x){if(l==r && l==pos){val[x]=k;return;}int mid=(l+r)>>1;if(pos<=mid) modify(l,mid,pos,k,ls[x]);else modify(mid+1,r,pos,k,rs[x]);pushup(x);
}
int query(int l,int r,int ql,int qr,int x){if(ql<=l && r<=qr){return val[x];}int mid=(l+r)>>1,ans=0;if(ql<=mid) ans=max(ans,query(l,mid,ql,qr,ls[x]));if(qr>=mid+1) ans=max(ans,query(mid+1,r,ql,qr,rs[x]));return ans; 
}
int find_l(int l,int r,int ql,int qr,int k,int x){if(l==r){if(val[x]<k) return -1;else return l;}int mid=(l+r)>>1;if(ql<=mid && val[ls[x]]>=k){int ans=find_l(l,mid,ql,qr,k,ls[x]);if(ans!=-1) return ans;}if(qr>=mid+1){return find_l(mid+1,r,ql,qr,k,rs[x]);}else return -1;
}
int find_r(int l,int r,int ql,int qr,int k,int x){if(l==r){if(val[x]<k) return -1;else return l;} int mid=(l+r)>>1;if(qr>=mid+1 && val[rs[x]]>=k){int ans=find_r(mid+1,r,ql,qr,k,rs[x]);if(ans!=-1) return ans;}if(ql<=mid){return find_r(l,mid,ql,qr,k,ls[x]);}else return  -1;
}
int main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);cin>>n>>a;for(int i=1;i<=n;i++){cin>>d[i];if(n-d[i]+1<=10) c[n-d[i]+1]=i;}build(1,n,rt);cin>>m;sum=n;for(int i=1;i<=m;i++){cin>>op;if(op=='F'){cin>>pos;if(pos==a){cout<<0<<'\n';}else if(pos<a){maxn=query(1,n,pos,a-1,rt);int k=(a==n?-1:find_l(1,n,a+1,n,maxn,rt));if(k==-1) k=n+1;cout<<k-pos-1<<'\n';}else{maxn=query(1,n,a+1,pos,rt);int k=(a==1?-1:find_r(1,n,1,a-1,maxn,rt));if(k==-1) k=0;cout<<pos-k-1<<'\n';}}else{int lst=min(n,10);cin>>pos>>num;for(int i=1;i<=10;i++){if(c[i]==pos) lst=i;}for(int i=lst-1;i>=num;i--){c[i+1]=c[i];}c[num]=pos;for(int i=num;i>=1;i--){sum++;modify(1,n,c[i],sum,rt);}}}return 0;
}

后记

最后要谴责 nfls 机子慢还要开小时限,使某些人的正解被卡常了。

还有我不是高二的老年选手……

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/874787.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git分支提交,提PR

远程分支xxx,临时分支tmp_xxx git checkout -b tmp_xxx   #创建并进入临时分支 git pull origin xxx      #更新本地code git add .          git commit -m "test pr" git push --set-upstream origin tmp_xxx #github上现在能看到这个临时…

Hibernate Validator 国际化开启快速校验配置

这里默认你已经配置好了国际化,如需配置可以参考 网上其他配置,这里只做快速失败国际化配置@Configuration public class ValidConfig {@Beanpublic Validator validator() {     // 这里是读取你的国际化配置文件做缓存MessageInterpolator messageInterpolator = new R…

AQS学习笔记

一、使线程进入等待状态和唤醒状态的三种方法 1、使用Object中的wait()方法让线程等待,使用Object中的notify()方法唤醒线程,需配合synchronized关键字使用 2、使用JUC包中的Condition的await()方法让线程等待,使用signal()方法唤醒线程 3、LockSupport类可以阻塞当前线程以…

Oracle安装指南 Xming远程桌面

安装Xming然后使用Oracle用户连接登录,设置DISPLAY环境变量(IP地址为你的windows客户端IP地址) export DISPLAY=192.168.111.155:0.0然后执行dbca就会弹出数据库配置界面了参考链接:https://www.cnblogs.com/iancloud/p/15015683.html

P4070 [SDOI2016] 生成魔咒

P4070 [SDOI2016] 生成魔咒 题目描述 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示。例如可以将魔咒字符 \(1,2\) 拼凑起来形成一个魔咒串 \([1,2]\)。 一个魔咒串 \(S\) 的非空字串被称为魔咒串 \(S\) 的生成魔咒。 例如 \(S=[1,2,1]\) 时,它的生成魔咒有 \([1],[2],[1…

深入探讨触发器的创建与应用:数据库自动化管理的强大工具

title: 深入探讨触发器的创建与应用:数据库自动化管理的强大工具 date: 2025/1/24 updated: 2025/1/24 author: cmdragon excerpt: 触发器是一种强大的数据库对象,它能够在特定事件发生之前或之后自动执行一组SQL语句。作为一种自动化管理工具,触发器在许多数据库管理场景…

Metasploit Pro 4.22.7-2025012201 (Linux, Windows) - 专业渗透测试框架

Metasploit Pro 4.22.7-2025012201 (Linux, Windows) - 专业渗透测试框架Metasploit Pro 4.22.7-2025012201 (Linux, Windows) - 专业渗透测试框架 Rapid7 Penetration testing, released Jan 22, 2025 请访问原文链接:https://sysin.org/blog/metasploit-pro-4/ 查看最新版。…

VS.net中快捷键收缩和展开代码段

i. Ctrl-M-O 折叠所有方法 ii. Ctrl-M-P 展开所有方法并停止大纲显示(不可以再折叠了) iii. Ctrl-M-M 折叠或展开当前方法 iv. Ctrl-M-L展开所有方法 其他的快捷方式:怎样跳转到指定的某一行? 两种方法:Ⅰ. Ctrl+G Ⅱ. 双击状态栏中的行号2.. 怎样创建矩形选区? 两…

查看Resources.resx的三种方式

同一个Resources.resx文件在Visual Studio 中可以以多种方式查看, 但某一天遇到了问题, 只能以资源浏览器的方式查看, 期初还以为是Visual Studio升级加入的新功能, 怎么都无法打开设计器, 在Resources.resx文件右键菜单中看不到下面的菜单项,经过一些列的摸索, 发现设置…

Vmware 虚拟机克隆注意事项-CentOS7

1.克隆后修改MAC地 2.修改 UUID,UUID克隆虚拟机后一般是一样的,需要进行修改 输入命令uuidgen,将生成的UUID写入ifcfg-ens33 【文件位置:/etc/sysconfig/network-scripts/ifcfg-ens33】 【我克隆的时候并没有修改,但是也一样可以联网,不知道为啥】 3.修改主机名 先临时修…

autocad Ribbon创建的一种新思路

之前开发的功能相对简单, 一个RibbonTab就把相关的功能展示出来了。 目前着手准备开发的功能, 需要多个RibbonTab, 且不想显示AutoCAD或Civil 3D自身的RibbonTab, 曾经想模拟3d3s的样子来切换RibbonTab, 但发现3d3s是将AutoCAD原生的Cuix和自己的RibbonTab结合到一起, 对…

Solon Cloud Gateway 开发:导引

Solon Cloud Gateway 是 Solon Cloud 体系提供的分布式网关实现(轻量级实现)。Solon Cloud Gateway 是 Solon Cloud 体系提供的分布式网关实现(轻量级实现)。 分布式网关的特点(相对于本地网关):提供服务路由能力 提供各种拦截支持1、分布式网关推荐 建议使用专业的分布…