P5186 [COCI2009-2010#4] OGRADA 题解
题目链接:#
大意:#
给定
如上图,若
思路:#
看到这种类型的题应该想到的都是单调数据结构,这道题看着像是单调栈,实际上是单调队列。
我们维护两个单调栈
对于每次刷漆,不妨在
对于子问题二,只需考虑有多少连续的相同高度的矩形,用宽度除去
代码#
#include<bits/stdc++.h>
#define int long long
#define endl "\n"
template<typename P>
inline void read(P &x){
P res=0,f=1;
char ch=getchar();
while(ch<'0' || ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0' && ch<='9'){
res=res*10+ch-'0';
ch=getchar();
}
x=res*f;
}
using namespace std;
int T=1;
int n,k;
int a[1100010];
int q[1100010];
int b[1100010];
int S=0;
signed main(){
read(n),read(k);
for(int i=1;i<=n;++i) read(a[i]),S+=a[i];
int l=1,r=0;
int ans=0;
for(int i=1;i<=n+k+1;++i){
while(l<=r && i-q[l]>=k) l++;
while(l<=r && a[i]<a[q[r]]) r--;
q[++r]=i;
if(i>=k) b[i]=a[q[l]];
}
l=1,r=0;
memset(q,0,sizeof(q));
memset(a,0,sizeof(a));
for(int i=1;i<=n+k+1;++i){
while(l<=r && i-q[l]>=k) l++;
while(l<=r && b[i]>b[q[r]]) r--;
q[++r]=i;
if(i>=k) a[i]=b[q[l]];
if(i>=k) ans+=k*a[i]-(k-1)*(a[i-1]);
}
int len=0;
int ans1=0;
for(int i=1;i<=n+k;++i){
len++;
if(a[i]!=a[i+1]){
ans1+=ceil(len*1.0/k);
len=0;
}
}
cout<<S-ans<<endl;
cout<<ans1-1<<endl;
return 0;
}
作者:God_Max_Me
出处:https://www.cnblogs.com/lizihan00787/p/18323138
版权:本作品采用「God_Max_Me-非商业性使用」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现