CodeForces - 434D Nanami's Power Plant
题目大意:
给定一个长为n的序列,序列中的第i为上的值\(x_i\),序列第i位上的值\(x_i\in[l_i,r_i]\),价值为\(f_i(x_i)\),其中\(f_i(x) = a_ix^2 + b_ix + c_i\),同时给出m个限制条件,每个限制条件用一个三元组\(<u,v,d>\)来表示,需要序列满足\(x_u \leq x_v + d\)。求在满足所限制条件的情况下的\(f_i(x_i)\)的最大和。
其中满足(\(1 \leq n \leq 50, 0 \leq m \leq 100 , -100 \leq l_i \leq r_i \leq 100)\)
题目解答:
这道题跟[bzoj 3144 切糕]类似,由于网上关于切糕的题解已经烂大街了,在这里就不说了.
首先我们考虑在没有\(x_i\)的限制之下的答案计算:
直接取每段内的\(max\)不就好了嘛... ...
开一开脑洞,你就会构造出一个跟切糕差不多的层次模型
这不过这次是"最大割"而已
我们可以把所有有价值的边权全部都被所有值中的最大值减一下
这样我们直接求最小流再调整就行了。
而对于\(X_u <= X_v + d\)的限制
我们直接应用和切糕一样的思想来限制就可以了
一遍最大流即可
\(ans = (max(f_i(x)) + 1)*n - maxflow\)
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
inline void read(int &x){
x=0;char ch;bool flag = false;
while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;
while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x;
}
inline int cat_max(const int &a,const int &b){return a>b ? a:b;}
inline int cat_min(const int &a,const int &b){return a<b ? a:b;}
const int maxn = 51;
const int maxm = 128;
const int maxnode = 25400;
const int maxedge = 254000;
const int inf = 0x3f3f3f3f;
struct Edge{
int to,next,cap;
}G[maxedge];
int head[maxnode],cnt=1;
void add(int u,int v,int c){
G[++cnt].to = v;
G[cnt].next = head[u];
G[cnt].cap = c;
head[u] = cnt;
}
inline void insert(int u,int v,int c){
add(u,v,c);add(v,u,0);
}
int dis[maxnode],q[maxnode],l,r;
int S,T;
#define v G[i].to
bool bfs(){
memset(dis,-1,sizeof dis);
dis[S] = 0;l = 0;r = -1;
q[++r] = S;
while(l <= r){
int u = q[l++];
for(int i = head[u];i;i=G[i].next){
if(dis[v] == -1 && G[i].cap){
dis[v] = dis[u] + 1;
q[++r] = v;
}
}
}return dis[T] != -1;
}int cur[maxnode];
int dfs(int u,int f){
if(u == T || f == 0) return f;
int ret = 0;
for(int &i = cur[u];i;i=G[i].next){
if(dis[v] == dis[u] + 1 && G[i].cap){
int x = dfs(v,cat_min(G[i].cap,f));
ret += x;f -= x;
G[i].cap -= x;G[i^1].cap += x;
if(f == 0) break;
}
}if(ret == 0) dis[u] = -1;
return ret;
}
inline int dinic(){
int ret = 0;
while(bfs()){
memcpy(cur,head,sizeof head);
ret += dfs(S,inf);
}return ret;
}
#undef v
int n;
inline int f(int x,int y){
y += 102;
return x*210+y;
}
int a[maxn],b[maxn],c[maxn],le[maxn],ri[maxn];
inline int calc(int i,int x){
return a[i]*x*x+b[i]*x+c[i];
}
int main(){
S = maxnode - 5;T = S+1;
read(n);int m;read(m);
int lim = -inf;
for(int i=1;i<=n;++i){
read(a[i]);read(b[i]);read(c[i]);
}
for(int i=1;i<=n;++i){
read(le[i]);read(ri[i]);
insert(S,f(i,le[i]-1),inf);
for(int j=le[i];j<=ri[i];++j){
lim = cat_max(lim,calc(i,j)+1);
}
insert(f(i,ri[i]),T,inf);
}
for(int i=1;i<=n;++i){
for(int j=le[i];j<=ri[i];++j){
insert(f(i,j-1),f(i,j),lim - calc(i,j));
}
}
for(int i=1,u,v,d;i<=m;++i){
read(u);read(v);read(d);
for(int j=le[u];j<=ri[u];++j){
if(j - d - 1 >= le[v] - 1 && j - d -1 <= ri[v])
insert(f(u,j-1),f(v,j-d-1),inf);
}
}
int ans = dinic();
printf("%d\n",lim*n - ans);
getchar();getchar();
return 0;
}
CodeForces - 434D Nanami's Power Plant的更多相关文章
- Codeforces Round #248 (Div. 1) D - Nanami's Power Plant 最小割
D - Nanami's Power Plant 思路:类似与bzoj切糕那道题的模型.. #include<bits/stdc++.h> #define LL long long #de ...
- 【CF434D】Nanami's Power Plant 最小割
[CF434D]Nanami's Power Plant 题意:有n个二次函数$y=a_ix^2+b_ix+c_i$($a_i,b_i,c_i$是整数),第i个函数要求x的取值在$[l_i,r_i]$ ...
- CF434D Nanami's Power Plant 最小割
传送门 因为连距离限制的边的细节调了贼久QAQ 这个题和HNOI2013 切糕性质相同,都是有距离限制的最小割问题 对于每一个函数,用一条链记录变量\(x\)在不同取值下这个函数的贡献.对于一个\(x ...
- CF434D Nanami's Power Plant
就是切糕那道题,首先对每个函数连一串,然后\(x_u\leq x_v+d\)这个条件就是\(u\)函数\(i\)取值连向\(v\)函数\(i-d\)取值边权为inf,然后答案就是最小割了. #incl ...
- 缩点:Power Plant;
题目传送门:[UVALive 6437]Power Plant 题目大意:T组数据,给定一幅带权图(n, m), 然后给定k个点, 与图中存在有若干条边.每个点都要至少要和这k个点的一个点直接或间接相 ...
- Nuclear Power Plant ZOJ - 3840 树形dp
There are N (1 ≤ N ≤ 105) cities on land, and there are N - 1 wires connecting the cities. Therefore ...
- [Codeforces 1245D] Shichikuji and Power Grid (最小生成树)
[Codeforces 1245D] Shichikuji and Power Grid (最小生成树) 题面 有n个城市,坐标为\((x_i,y_i)\),还有两个系数\(c_i,k_i\).在每个 ...
- 【CodeForces】906 D. Power Tower 扩展欧拉定理
[题目]D. Power Tower [题意]给定长度为n的正整数序列和模数m,q次询问区间[l,r]累乘幂%m的答案.n,q<=10^5,m,ai<=10^9. [算法]扩展欧拉定理 [ ...
- UVA Live 6437 Power Plant 最小生成树
题意: 有许多油井和村庄什么的,让你使得这些村庄能连通一个油井就好了.第一行给你一个数字T代表有T组测试数据,第二行有 M , N , K ,M代表包括油井在内的村庄数,N 代表有N个 两两连通的地方 ...
随机推荐
- C语言日期计算器
记录下码子 # define _CRT_SECURE_NO_WARNINGS # include <stdio.h> # include <stdlib.h> int days ...
- 【甘道夫】Ubuntu14 server + Hadoop2.2.0环境下Sqoop1.99.3部署记录
第一步.下载.解压.配置环境变量: 官网下载sqoop1.99.3 http://mirrors.cnnic.cn/apache/sqoop/1.99.3/ 将sqoop解压到目标文件夹,我的是 /h ...
- document.readyState和xmlhttp.onreadystatechange
document.readyState的几种状态 0-uninitialized:XML 对象被产生,但没有任何文件被加载. 1-loading:加载程序进行中,但文件尚未开始解析. 2-loaded ...
- php html_entity_decode使用总结
在处理网页字符串的时候,尤其是做爬虫类的应用时,经常会涉及到要处理的字符串中包含html标签,现在对这类字符串的处理做一个小的总结: 有时候获取到的字符串中有html标签,在入库的时候出于安全的考虑通 ...
- linux下proc里关于磁盘性能的参数(转)
我们在磁盘写操作持续繁忙的服务器上曾经碰到一个特殊的性能问题.每隔 30 秒,服务器就会遇到磁盘写活动高峰,导致请求处理延迟非常大(超过3秒).后来上网查了一下资料,通过调整内核参数,将写活动的高峰分 ...
- VS2017快捷键
1.回到上一个光标位置/前进到下一个光标位置 (1)回到上一个光标位置:使用组合键“Ctrl + -”; (2)前进到下一个光标位置:“Ctrl + Shift + - ”. 2.复制/剪切/删除整行 ...
- 【BZOJ3671】[Noi2014]随机数生成器 暴力
[BZOJ3535][Noi2014]随机数生成器 Description Input 第1行包含5个整数,依次为 x_0,a,b,c,d ,描述小H采用的随机数生成算法所需的随机种子.第2行包含三个 ...
- python的接口类的思考?
1.java怎么实现多继承的功效:https://www.cnblogs.com/Berryxiong/p/6142735.html 2.python的接口类和抽象类:https://www.cnbl ...
- wimdows安装mongodb,开机启动
> d: > cd D:\Program Files\MongoDB\Server\3.0\bin > .\mongod --logpath "D:\Program Fil ...
- [java,maven] 使用 maven 来搭建简单的 netty 开发环境
大致过程是: 首先, 使用 mvn 命令在指定路径下面创建一套简单的 java 文件包. 然后, 使用 JIdea 导入 maven 项目的方式将创建好的文件包加载到 IDE 环境中.‘ 接下来, ...