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个 两两连通的地方 ...
随机推荐
- 将到来的战略转变:移动 Web 还是移动 Apps?
目前来看,移动应用比移动网站的易用性更高,但变化即将发生,移动网站最终将优于Apps,成为更好的策略选择. 一家公司制定移动策略时,最重要的问题是:是否需要考虑为移动设备特别做点什么.一些公司永远都不 ...
- Unity3D研究院编辑器之脚本设置ToolBar及脚本设置顶视图
Unity版本5.3.2 如下图所示,ToolBar就是Unity顶部的那一横条.这里的所有按钮一般情况下都得我们手动的用鼠标去点击.这篇文章我们说说如果自动操作它们 1.自动点击左边四个按钮 (拖动 ...
- python MySQLdb Windows下安装教程及问题解决方法(python2.7)
使用python访问mysql,需要一系列安装 linux下MySQLdb安装见 Python MySQLdb在Linux下的快速安装http://www.jb51.net/article/6574 ...
- fzu 2039 Pets (简单二分图 + (最大流 || 二分图))
Are you interested in pets? There is a very famous pets shop in the center of the ACM city. There ar ...
- Codeforces 390E Inna and Large Sweet Matrix 树状数组改段求段
题目链接:点击打开链接 题意:给定n*m的二维平面 w个操作 int mp[n][m] = { 0 }; 1.0 (x1,y1) (x2,y2) value for i : x1 to x2 for ...
- java 邮件(2)
/** * 方法描述:发送带附件的邮件 * * @throws UnsupportedEncodingException */ public static boolean sendEmai ...
- UIWebView使用中的内存相关问题
本文转载至: http://blog.csdn.net/musou_ldns/article/details/7675589 applicationios5webkit测试cacheios 在iO ...
- 【百度之星复赛】T5 Valley Numer
Valley Numer Problem Description 众所周知,度度熊非常喜欢数字. 它最近发明了一种新的数字:Valley Number,像山谷一样的数字. 当一个数字,从左到右依次看过 ...
- html学习笔记(1)--处理特殊字符以及其他的一些小细节
冬日深夜,照着一本html的书籍练习,忍不住将一些常识记下来.书名是:<HTML与CSS入门经典> by [美] Julie Meloni(这是一位女士) 1.在大多数浏览器中,<s ...
- hihocoder(第十周)二叉树(前序中序推后续)递推实现
题目 : 后序遍历 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在参与过了美食节之后,小Hi和小Ho在别的地方又玩耍了一阵子,在这个过程中,小Ho得到了一个非常有意思 ...