Codeforces 1146G Zoning Restrictions
题目
https://codeforces.com/contest/1146/problem/G
题目翻译
你正在准备在一条路上建房子。这条路上有n个可以建房子的点,它们从左到右编号为1~n。你可以在每个点上建一个高度为[0,h]中的整数的房子。
如果一个房子的高度为a,那么你可以获得a2的收益。
但是这个城市有m个分区限制。对于第i个分区限制,如果第li 个到第ri个点上最高的房子的高度严格大于xi,那么你就要缴纳ci的罚款。
请求出你的最大收益(房子收益总和-罚款)
题解
可以发现这道题直接做起来会比较棘手,考虑转化。
把答案转化为 所有建筑高度都为h的贡献 - num 。令a[i]表示每栋房子的实际高度,那么num=一些罚款+∑h2−ai2\sum h^2-a_i^2∑h2−ai2。
但是这样子做起来也不方便,发现数据范围特别小,因此考虑网络流。
如果要让答案尽可能大,那么num就要尽可能小。而最小割等于最大流,只需要建图就可以了。
发现难以处理高度,因此把每个点的高度拆分成独立的节点。对于每一个点,都新建一条从S到T的边数为h+2的路径,即S→0→1→2→…→h→T(这里的0~h指的是每个点拆分成不同高度),其中i→i+1(或T)的路径长度为h2−i2h^2-i^2h2−i2。这样割掉i→i+1的边就表示选择了i这个高度。
然后罚款处理起来就很容易了,对于每个限制i,新建一个节点p,p向T连一条值为c的边,然后[li,ri][l_i,r_i][li,ri]中每个点的高度x+1对应的点(因为是严格大于x)都向p连一条流量为∞的边。
最后用n⋅h2n\cdot h^2n⋅h2-最大流 就好了。
CODE
#include<cstdio>
using namespace std;
#define id(x,y) (x-1)*(h+1)+y+1
#define inf 999999999
#define M 20005
#define N 3055
#define S 3051
#define T 3052
int fir[N],to[M],nex[M],len[M],cur[N],gap[N],dis[N],s=1;
inline void inc(int x,int y,int z)
{to[++s]=y,len[s]=z,nex[s]=fir[x],cur[x]=fir[x]=s;to[++s]=x,len[s]=0,nex[s]=fir[y],cur[y]=fir[y]=s;
}
int dfs(int u,int flow)
{if(u==T) return flow;int v,have=flow,tmp,i;for(i=cur[u];i;i=nex[i]){cur[u]=i,v=to[i];if(len[i]&&dis[u]==dis[v]+1){tmp=dfs(v,have<len[i]?have:len[i]);have-=tmp,len[i]-=tmp,len[i^1]+=tmp;if(!have) return flow;}}cur[u]=fir[u];if(!--gap[dis[u]]) dis[S]=T;++gap[++dis[u]];return flow-have;
}
int main()
{int n,h,m,l,r,x,c,i,j,ans,cnt;scanf("%d%d%d",&n,&h,&m);ans=n*h*h,cnt=id(n,h);for(i=1;i<=n;++i){inc(S,id(i,0),inf);for(j=0;j<h;++j) inc(id(i,j),id(i,j+1),h*h-j*j);}for(i=1;i<=m;++i){scanf("%d%d%d%d",&l,&r,&x,&c);if(x==h) continue;inc(++cnt,T,c);for(j=l;j<=r;++j) inc(id(j,x+1),cnt,inf);}while(dis[S]<T) ans-=dfs(S,inf);printf("%d\n",ans);return 0;
}
Codeforces 1146G Zoning Restrictions相关推荐
- Codeforces 1146G Zoning Restrictions dp
Zoning Restrictions 发现从左往右dp没有办法dp, 可以想到最大值的性质, 我们考虑构建笛卡尔树的过程. 如果 i 的l, r 的最大值, 那么经过 i 点的线段可以全部在枚举 i ...
- CF1146G Zoning Restrictions 最小割
CF1146G Zoning Restrictions 最小割 题意: 你准备在一条街上建房子.这条街上共有nn个地方可以用来建房子,每个房子高度最高为h.若你建了一个高度为aa的房子,那你将得到a^ ...
- CF1146G Zoning Restrictions
CF1146G Zoning Restrictions 网络流 h<=50? 直接都选择最大的,ans=n*h*h 最小割 考虑舍弃或者罚款 有一个>x就要罚款? 经典取值限制的模型:切糕 ...
- cf----2019-08-14(The Doors,Zoning Restrictions Again,Detective Book)
总在不经意的年生,回首彼岸,纵然发现光景绵长. Three years have passes and nothing changed. It is still raining in London, ...
- Forethought Future Cup - Elimination Round G. Zoning Restrictions 最大流(最小割)
题目链接: https://codeforces.com/contest/1146/problem/G 题意: 你现在要给 nnn 个位置制定高度 hi(1<=hi<=H)h_i (1&l ...
- codeforces1146G Zoning Restrictions
题面 题意 在一条路上有标号为1-n的n座房子,每座房子最高为h,若一座房子的高度为x,则这座房子的收益为x*x,有m条限制,每条限制表示如果在l-r之间的所有房子的最大高度超过hi,则罚款ci.问所 ...
- Codeforces Round #343 (Div. 2) D. Babaei and Birthday Cake 线段树维护dp
D. Babaei and Birthday Cake 题目连接: http://www.codeforces.com/contest/629/problem/D Description As you ...
- codeforces Labyrinth
codeforces Labyrinth Time Limit: 2 Sec Memory Limit: 512 MB Description You are playing some compute ...
- Codeforces Round #439 (Div. 2) Problem C (Codeforces 869C) - 组合数学
- This is not playing but duty as allies of justice, Nii-chan! - Not allies but justice itself, Onii ...
最新文章
- a_2可以用作python标识符嘛,【单选题】下列选项中,可作为Python标识符的是哪项?
A. getpath()
B. throw
C. my#var
D. _ My_price...
- 学习笔记:部署趋势科技企业安全无忧版——服务器端和web控制台的安装(一)...
- 有哪些指标可以描述两个图(graph)的相似度?
- ubuntu 16.04 远程挂载硬盘
- paip.验证码识别---初始化
- 某TS流视频文字识别系统
- 扫描二维码登录的接口
- 获取上周第一天,最后一天
- leetcode 1800. Maximum Ascending Subarray Sum(python)
- 用c语言编程,统计大写字母,小写字母,数字,其他字符的个数,用C语言:输入一行字符,不超过50个,统计出其中英文大写字母,小写字母,数字,空格以及其他字符个数...
- b2b2c电商平台系统
- 一张图玩转 XMind 思维导图软件
- typora 公式对齐_Typora极简教程
- 正确理解以下名词及其含义:(1)源程序,目标程序,可执行程序(2)程序编辑,程序编译,程序连接(3)程序,程序模块,程序文件 (4)函数,主函数,被调用函数,库函数
- 软件测试中的“汽车车载导航系统项目”讲解
- sudo,普通用户的提权操作,越权跟踪
- linux乱码文件删不掉,linux删除乱码文件或文件夹
- Python案例学习—yuC
- 在eclipse中显示空格
- 怎样锻炼自己的意志力,绘制思维导图教你总结