P7730 [JDWOI-1] 蜀道难

news/2024/9/30 15:14:00

首先,区间增加定值并且要求单调不降,很容易想到差分。

于是先把 \(h\) 数组差分一下,题目的要求即为最小代价使得 \(h\) 均为非负数。

观察一下两种操作,发现 \(n\) 的范围很小,可以枚举操作的起点 \(i\) ,然后如果操作是压低,相当于 \(h[i]--,h[i+l[i]]++\)
image

而如果操作是抬高,相当于 \(h[i]++,h[i+l[i]]--\)

显然差分数组的总和是一定的(边界有点小问题下文会提及),那么可以把压低当成一条 \(i\)\(i+l[i]\) 的流,抬高也是同理。

注意当 \(i+l[i]-1\) 恰好为 \(n\)\(i+l[i]\)\(n+1\) 但是这个操作显然是合法的,所以要增加一个 \(n+1\) 号点, \(h[n+1]\) 设为 \(h\) 的上限。

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=200010;
const int INF=1000000000;
int increase[N],to[N],head[N];
int flow[N],cost[N],nxt[N];
int pre[N];
int maxflow,tot;
bool vis[N];
int dis[N];
int n,m,s,t,ans,a,b;
int h[N];void add(int x,int y,int z,int c){to[++tot]=y;flow[tot]=z;cost[tot]=c;nxt[tot]=head[x];head[x]=tot;to[++tot]=x;flow[tot]=0;cost[tot]=-c;nxt[tot]=head[y];head[y]=tot;
}bool spfa(){memset(increase,0x3f,sizeof(increase));memset(vis,0,sizeof(vis));memset(dis,0x3f,sizeof(dis));int kep=dis[t];dis[s]=0;queue<int> q;q.push(s);vis[s]=true;while(!q.empty()){int x=q.front();q.pop();vis[x]=false;for(int i=head[x];i;i=nxt[i]){int y=to[i];if(flow[i] && dis[y]>dis[x]+cost[i]){dis[y]=dis[x]+cost[i];increase[y]=min(increase[x],flow[i]);pre[y]=i;if(!vis[y]){vis[y]=true;q.push(y);}}}}return dis[t]<kep;
}void update(){int cur=t;while(cur!=s){int last=pre[cur];flow[last]-=increase[t];flow[last^1]+=increase[t];cur=to[last^1];}maxflow+=increase[t];ans+=(increase[t]*dis[t]);
}inline int read(){char ch;int x=0;bool f=false;for(;!isdigit(ch);ch=getchar())if(ch=='-')f=true;for(;isdigit(ch);ch=getchar())x=(x<<1)+(x<<3)+(ch^48);if(f) x=-x;return x;
}signed main(){cin>>n>>m;s=0,t=n+2;h[n+1]=10000;tot=1;for(int i=1;i<=n;i++){h[i]=read();}for(int i=n;i>=1;i--){h[i]-=h[i-1];}char c;for(int i=1;i<=m;i++){cin>>c;a=read(),b=read();for(int j=1;j<=n-a+1;j++){int k=j+a;if(c=='-') add(j,k,INF,b);else add(k,j,INF,b);}}for(int i=1;i<=n+1;i++){//cout<<"h[i]: "<<i<<" "<<h[i]<<"\n";add(s,i,h[i]+1001,0),add(i,t,1001,0);}while(spfa()){update();}if(maxflow!=1001*(n+1)) cout<<-1;else cout<<ans;return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

就叫它new Star2024 的WP好了

begin WP 跟着引导走就好,这个引导做的还不错,能教人怎么用IDAbase64 WP总算知道为啥面试会问我是不是不知道base64编码,原来这个就是啊,和北邮新生赛re签到题基本一样。 看懂逻辑,经典3并4后单表替换,然后写代码解决就好

洛谷题单指南-分治与倍增-P6648 [CCC2019] Triangle: The Data Structure

原题链接:https://www.luogu.com.cn/problem/P6648 题意解读:在一个n行的数字三角形中,求所有边长为k的正三角形最大值之和。 解题思路: 1、枚举法 枚举每一个边长为k的三角形,在其中求max,然后累加,n最多3000,时间复杂度是n^4,显然超时。 2、倍增和ST思想 此题非常类…

确保上传的缩略图在 PbootCMS 中保持清晰

config/config.php 文件中的相关部分:// 缩略图配置 ico => array(max_width => 1920, // 最大宽度1920max_height => // 最大高度不填写代表不限制 ),清除缓存清除系统缓存修改完配置文件后,需要清除系统缓存,确保配置更新生效。 在后台管理中找到“缓存管…

象形闽都 数智榕城 | PostgreSQL中文社区技术沙龙 - 福州站

在数字化浪潮席卷的时代,数据已成为推动社会进步与企业发展的核心动力。福建,作为东南沿海的经济与文化重镇,正以崭新的姿态拥抱数智未来。为促进福建地区数据库技术的交流与发展,我们诚挚邀请您参加“象行闽都,数智榕城 —— PostgreSQL数据库技术沙龙”。活动主题: 象行…

SSL证书必须要买吗?

在当今数字化的时代,网络安全日益成为人们关注的焦点。SSL证书作为一种保障网络安全通信的工具,是否必须购买成为许多人心中的疑问。 对于企业和商业网站来说,购买SSL证书往往是非常必要的。 首先,从用户信任的角度来看,当用户访问一个带有SSL证书的网站时,浏览器地址栏会…

PBOOTCMS的水印功能如何使用?pbootcms设置的水印为何没生效?

在 PbootCMS 中,水印功能主要用于给新上传的图片添加水印。如果你发现开启了水印功能但前端仍然没有水印,可能是因为以下几个原因:只对新上传的图片生效:水印功能仅对新上传的图片生效,之前上传的图片不会自动加上水印。 水印配置未生效:可能是因为水印配置没有正确设置或…

prometheus学习笔记之Grafana 常用操作

一、Panel 设置 1.单位设置2.Panel名称修改3.曲线别名 修改前修改后 4.曲线排序 5.曲线复制6.曲线静默 7.Panel复制 当前dashboard中复制跨dashboard或folder在其他dashboard中操作8.设置告警线设置告警条件其他按提示填写如果触发告警规则 则页面会有提示9.row效果如下:10.自…

pbootcms模板幻灯片调用代码大全

在 PbootCMS 中,模板自带的幻灯片功能可以通过 {pboot:slide} 标签来实现。下面详细介绍该标签的使用方法及其控制参数。 幻灯片标签详解 标签语法html{pboot:slide gid=* num=*}<!-- 幻灯片内容 --> {/pboot:slide}控制参数gid=*分组:必填参数,用于指定需要输出的幻灯…