713C
费用流
并没有想出来构图方法 我们设立源汇,其实我们关心的是相邻两个值的差值,如果差值小于0说明需要长高,那么向汇点连边差值,说明需要修改,如果差大于零,那么由源点连边差值,说明可以提供修改空间,再由源点向1和n+1连边inf,因为这两个点是可以无限修改的。然后1-2-3-n+1连双向边,费用为1,容量inf,表明修改差值。正向流是提高后面的值,反向流是降低前面的值。而且得加堆优化迪杰斯特拉,否则跑不过去了。
- #include<bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- typedef pair<ll, int> PII;
- const int N = ;
- const ll inf = ;
- struct edge {
- int nxt, to;
- ll f, c;
- } e[N * ];
- int inq[N], a[N], b[N], head[N], pree[N], pprev[N];
- ll dis[N];
- priority_queue<PII, vector<PII>, greater<PII> > q;
- int n, source, sink, cnt = ;
- inline void link(int u, int v, ll f, ll c)
- {
- e[++cnt].nxt = head[u];
- head[u] = cnt;
- e[cnt].to = v;
- e[cnt].f = f;
- e[cnt].c = c;
- }
- inline void insert(int u, int v, ll f, ll c)
- {
- link(u, v, f, c);
- link(v, u, , -c);
- }
- inline bool spfa()
- {
- int l = , r = ;
- for(int i = source; i <= sink; ++i)
- dis[i] = inf;
- dis[source] = ;
- q.push(make_pair(, source));
- while(!q.empty())
- {
- PII x = q.top();
- q.pop();
- int u = x.second;
- if(dis[u] != x.first) continue;
- for(int i = head[u]; i; i = e[i].nxt) if(e[i].f && dis[e[i].to] > dis[u] + e[i].c)
- {
- pree[e[i].to] = i;
- pprev[e[i].to] = u;
- dis[e[i].to] = dis[u] + e[i].c;
- q.push(make_pair(dis[e[i].to], e[i].to));
- }
- }
- return dis[sink] != inf;
- }
- inline ll getflow()
- {
- int now = sink;
- ll delta = inf;
- while(now != source)
- {
- delta = min(delta, e[pree[now]].f);
- now = pprev[now];
- }
- now = sink;
- while(now != source)
- {
- e[pree[now]].f -= delta;
- e[pree[now] ^ ].f += delta;
- now = pprev[now];
- }
- return delta * dis[sink];
- }
- inline ll mcmf()
- {
- ll ret = ;
- while(spfa()) ret += getflow();
- return ret;
- }
- int main()
- {
- scanf("%d", &n);
- source = ;
- sink = n + ;
- for(int i = ; i <= n; ++i)
- scanf("%d", &a[i]);
- for(int i = ; i <= n; ++i)
- {
- b[i] = a[i] - a[i - ];
- if(b[i] > ) insert(i, sink, b[i] - , );
- else insert(source, i, -b[i] + , );
- }
- for(int i = ; i <= n; ++i)
- {
- insert(i, i + , inf, );
- insert(i + , i, inf, );
- }
- insert(, sink, inf, );
- insert(n + , sink, inf, );
- printf("%lld\n", mcmf());
- return ;
- }
713C的更多相关文章
- codeforces 713C C. Sonya and Problem Wihtout a Legend(dp)
题目链接: C. Sonya and Problem Wihtout a Legend time limit per test 5 seconds memory limit per test 256 ...
- Codeforces 713C Sonya and Problem Wihtout a Legend
题意:给一个序列,可以进行若干次操作,每次操作选择一个数让它+1或-1,问最少要几次操作使得序列变为严格单调递增序列. 题解:首先考虑非严格递增序列,则每个数字最终变成的数字一定是该数组中的某个数.那 ...
- Codeforces 713C Sonya and Problem Wihtout a Legend(单调DP)
[题目链接] http://codeforces.com/problemset/problem/713/C [题目大意] 给出一个数列,请你经过调整使得其成为严格单调递增的数列,调整就是给某些位置加上 ...
- Codeforces 713C Sonya and Problem Wihtout a Legend DP
C. Sonya and Problem Wihtout a Legend time limit per test 5 seconds memory limit per test 256 megaby ...
- codeforces 713C C. Sonya and Problem Wihtout a Legend(dp)(将一个数组变成严格单增数组的最少步骤)
E. Sonya and Problem Wihtout a Legend time limit per test 5 seconds memory limit per test 256 megaby ...
- Codeforces 713C Sonya and Problem Wihtout a Legend(DP)
题目链接 Sonya and Problem Wihtout a Legend 题意 给定一个长度为n的序列,你可以对每个元素进行$+1$或$-1$的操作,每次操作代价为$1$. 求把原序列变成 ...
- [20180918]文件格式与sql_id.txt
[20180918]文件格式与sql_id.txt --//记录测试中遇到的一个问题.这是我在探究SQL*Net more data from client遇到的问题.--//就是实际oracle会把 ...
- Week One
2018.11.21: 1.[BZOJ 4868][SHOI 2017] 从后往前枚举最后位置即可,如果$A<B$,用尽可能多的$A$替换$B$操作 Tip:很大的$C$可能爆$longlong ...
- codeforces的dp专题
1.(467C)http://codeforces.com/problemset/problem/467/C 题意:有一个长为n的序列,选取k个长度为m的子序列(子序列中不能有位置重复),求所取的k个 ...
随机推荐
- C#——简单工厂
简单工厂的方法实现过程核心就是之前介绍的接口应用.所以直接上代码: public interface IPerson { void Say(); } public class Student : IP ...
- HTML地理位置定位
最近公司项目需要做一个类似微信朋友圈的互动交友功能,需要显示用户位置信息,因此在网上查了部分资料,记下demo供以后查看学习:(用到了百度api来实现定位功能) <!DOCTYPE html&g ...
- NetBeans将java项目编译成jar包
1.找到file选项下的build.xml.
- 删除ListView item数据 页面不刷新
最近碰到一个匪夷所思的事情.就是我删除listView中一条item数据 网络请求成功了 但是页面不成功,一番折腾 ,找到问题 ,原来我给item 添加了北京点击事假,又给listView 被禁设置 ...
- tac
功能说明:反向显示文件内容. 参数选项: -b 在行前而非行尾加分隔标志. -r 将分隔标志视作正则表达式来解析. -s 使用指定字符串代替换行作为分隔标志. cat命令与tac命令的对比:
- mvc 类中对应数据库属性
[StringLength()] //可空 对应数据库可空 [DefaultValue("")] [DisplayName("添加人用户名")] public ...
- map集合遍历,放入id
背景,需要从电脑导入excel表格到网页上然后表格中公司需要对应数据库的id 通过key-value方法来对应id Office office = new Office();office.setG00 ...
- 1 Web 知识基础
一.什么是跨域访问举个栗子:在A网站中,我们希望使用Ajax来获得B网站中的特定内容.如果A网站与B网站不在同一个域中,那么就出现了跨域访问问题.你可以理解为两个域名之间不能跨过域名来发送请求或者请求 ...
- Mac 执行 gulp 报错 -bash: gulp: command not found
在mac系统下安装gulp,之后执行gulp 报如下错误: -bash: gulp: command not found 回溯安装过程发现问题如下 1.执行 npm root: Application ...
- python利用7z批量解压rar
一开始我使用了rarfile这个库,奈何对于含有密码的压缩包支持不好,在linux上不抛出异常:之后有又尝试了unrar..比rarfile还费劲.. 所以用了调用系统命令的方法,用7z来解压 通过a ...