UESTC 1646 穷且益坚, 不坠青云之志。 差分约束、Fellman-ford
来源:互联网 发布:淘宝升钻有什么好处 编辑:程序博客网 时间:2024/06/07 05:53
穷且益坚, 不坠青云之志。
Time Limit: 6000/2000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)Submit Status
求一个有n个元素的数列,满足任意连续p个数的和不小于s,任意连续q个数的和不大于t。
Input
输入包括五个数n,p,q,s,t(1≤n,p,q≤500,1≤s,t≤100000)
Output
如果不能做到,输出"No"Sample input and output
Sample Input Sample Output4 2 2 1 2 Yes
1 0 1 0
Source
2017 UESTC Training for Graph Theory
UESTC 1646 穷且益坚, 不坠青云之志。
My Solution
题意:求一个有n个元素的数列,满足任意连续p个数的和不小于s,任意连续q个数的和不大于t。
差分约束、Fellman-ford
令sum[i]表示前i项的和(0<=i<=n,sum[0]=0)
那么题目的条件可转化为:
sum[i]-sum[i-p]>=s (p<=i<=n)
sum[i]-sum[i-q]<=t (q<=i<=n)
将第一个不等式取反,得到
sum[i-p]-sum[i]<=-s(p<=i<=n)
于是问题转化为求一系列不等式的解,这是一个典型的差分约束问题。
考虑最短路径的性质,令dis[i]表示从s到i的最短路,则对于图中存在的一条边(u,v),
有dis[v]<=dis[u]+w(u,v),即dis[v]-dis[u]<=w(u,v);
类比不等式,于是可建图,i向i-p引长度为-s的边,i-q向i引长度为t的边。
然后运行bellmanford,如果存在负环,则无解,
否则所得到的最短路的值就是sum[i]的一个解。
时间复杂度 O(VE)
空间复杂度 O(V + E)
#include <iostream>#include <cstdio>#include <queue>#include <vector>#include <cstring>using namespace std;typedef long long LL;typedef pair<int, LL> ii;const int MAXN = 1e3 + 8;const LL INF = 1e9;vector<ii> sons[MAXN];LL dis[MAXN];int cnt[MAXN];bool inque[MAXN];queue<int> que;//O(nlogn)inline bool SPFA(int n, int src){ for(int i = 0; i <= n; i++){ dis[i] = INF; } memset(inque, false, sizeof inque); memset(cnt, 0, sizeof cnt); dis[src] = 0;while(!que.empty()) que.pop();que.push(src);inque[src] = true;for(int i = 1; i <= n; i++){ que.push(i); inque[i] = true;}//这样不连通也能跑Bellman-fordLL u, v, w, sz, i;while(!que.empty()){ u = que.front(); que.pop(); inque[u] = false; sz = sons[u].size();for(i = 0; i < sz; i++){v = sons[u][i].first;w = sons[u][i].second;if(dis[u] + w < dis[v]){dis[v] = dis[u] + w;cnt[v]++;if(cnt[v] > n) return false;if(!inque[v]){ inque[v] = true; que.push(v);}}}}return true;}int main(){ #ifdef LOCAL freopen("j.txt", "r", stdin); //freopen("j.out", "w", stdout); int T = 1; while(T--){ #endif // LOCAL //ios::sync_with_stdio(false); cin.tie(0); int n, p, q, i; LL s, t; scanf("%d%d%d%lld%lld", &n, &p, &q, &s, &t); for(i = 0; i <= n; i++){ if(i - p >= 0) sons[i].push_back(ii(i-p, -s)); if(i - q >= 0) sons[i-q].push_back(ii(i, t)); } if(!SPFA(n, 0)) puts("No"); else{ printf("Yes\n%lld", dis[1]); for(i = 2; i <= n; i++){ printf(" %lld", dis[i] - dis[i-1]); } putchar('\n'); } #ifdef LOCAL cout << endl; } #endif // LOCAL return 0;}
Thank you!
------from ProLights
- UESTC 1646 穷且益坚, 不坠青云之志。 差分约束、Fellman-ford
- UESTC 1646 穷且益坚, 不坠青云之志。
- uestc 1511 糖果 差分约束
- UESTC 1511 糖果 (差分约束系统)
- UESTC 1511(差分约束)
- Intervals-bellman-ford+差分约束
- POJ-2983 用Bellman-Ford求解差分约束..
- POJ1364—Bellman-Ford算法+差分约束系统
- poj-2983-差分约束+优化Bellman-Ford
- POJ 3169 Layout (Bellman-Ford、差分约束)
- POJ 3169 Layout(差分约束-Bellman-Ford)
- UVA 11478 Halum(差分约束系统+Bellman-Ford)
- POJ 3169 Layout 差分约束/Bellman-Ford
- POJ 1364 King【差分约束+SPFA/Bellman-Ford】
- POJ 3169 Layout (差分约束系统,Bellman-Ford)
- 【图-差分约束】 差分约束
- POJ1716—差分约束系统+Bellman-Ford算法 || SPFA算法的实现
- [poj 1364]King[差分约束详解(续篇)][超级源点][SPFA][Bellman-Ford]
- 每次读取一行字符串输入
- vcruntime140.dll问题的解决
- Android编程红外编程——红外码详析
- MySQL索引原理及慢查询优化
- Linux总结笔记4-网卡配置及双网卡绑定
- UESTC 1646 穷且益坚, 不坠青云之志。 差分约束、Fellman-ford
- PAT 1015 Reversible Primes(进制转换+素数)
- 乱码问题,解决办法不一定是”统一所有编码”
- Java 中的接口有什么作用?
- makefile文件的一些解读
- IMWeb提升营Day4 | 训练题21:栈的压入、弹出序列
- 【备忘】大数据Hbase视频源码解析与开发实战教程下载
- cef MasterBuildQuickStart
- Linux总结笔记5-配置虚拟主机