洛谷P4926 [1007]倍杀测量者(差分约束)
题意
Sol
题目中的两个限制条件相当于是
\]
\]
我们需要让这两个至少有一个不满足
直接差分约束建边即可
这里要用到两个trick
若某个变量有固定取值的时候我们可以构造两个等式\(C_i - 0 \leqslant X, C_i - 0 \geqslant X\)。
乘法的大小判断可以取log变加法,因为\(y = log(x)\)也是个单调函数
#include<bits/stdc++.h>
#define MP(x, y) make_pair(x, y)
#define fi first
#define se second
#define LL long long
template <typename A, typename B> inline bool chmin(A &a, B b){if(a > b) {a = b; return 1;} return 0;}
template <typename A, typename B> inline bool chmax(A &a, B b){if(a < b) {a = b; return 1;} return 0;}
using namespace std;
const int MAXN = 4001, INF = 1e9;
const double eps = 1e-5;
inline int read() {
char c = getchar(); int x = 0, f = 1;
while(c < '0' || c > '9') {if(c == '-') f = -1; c = getchar();}
while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
int N, M, K;
struct Edge {
int v, op;
double k, w;
};
vector<Edge> v[MAXN];
void AddEdge(int x, int y, double w, int opt, double k) {
v[x].push_back({y, opt, k, w});
}
double dis[MAXN];
bool vis[MAXN];
int times[MAXN];
bool SPFA(double add) {
queue<int> q; q.push(N + 1);
for(int i = 0; i <= N; i++) dis[i] = -1e18, vis[i] = times[i] = 0;
dis[N + 1] = 0; ++times[N + 1];
while(!q.empty()) {
int p = q.front(); q.pop(); vis[p] = 0;
for(auto &x : v[p]) {
int opt = x.op, to = x.v; double k = x.k, w;
if(opt == 0) w = x.w;
else if(opt == 1) w = log2(k - add);
else w = -log2(k + add);
if(dis[to] < dis[p] + w) {
dis[to] = dis[p] + w;
if(!vis[to]) {
q.push(to);
vis[to] = 1;
++times[to];
if(times[to] >= N + 1) return 0;
}
}
}
}
return 1;
}
signed main() {
N = read(); M = read(); K = read();
double l = 0, r = 10;
for(int i = 1; i <= M; i++) {
int opt = read(), x = read(), y = read(); double k = read();
AddEdge(y, x, 0, opt, k);
if(opt == 1) chmin(r, k);
}
for(int i = 1; i <= K; i++) {
int c = read(); double x = read();
AddEdge(0, c, log2(x), 0, 0);
AddEdge(c, 0, -log2(x), 0, 0);
}
for(int i = 0; i <= N; i++) AddEdge(N + 1, i, 0, 0, 0);
if(SPFA(0)) return puts("-1"), 0;
while(r - l > eps) {
double mid = (r + l) / 2;
if(SPFA(mid)) r = mid;
else l = mid;
}
printf("%lf", l);
return 0;
}
洛谷P4926 [1007]倍杀测量者(差分约束)的更多相关文章
- 题解——洛谷P2294 [HNOI2005]狡猾的商人(差分约束)
裸的差分约束 dfs判断负环,如果有负环就false,否则就是true 注意有多组数据,数组要清空 #include <cstdio> #include <algorithm> ...
- 题解—— 洛谷 p1993 小K的农场(差分约束&负环判断)
看到题就可以想到差分约束 判断负环要用dfs,bfs-spfa会TLE 4个点 bfs-spfa #include <cstdio> #include <algorithm> ...
- 洛谷P1993 小K的农场_差分约束_dfs跑SPFA
Code: #include<cstdio> #include<queue> using namespace std; const int N=10000+233; const ...
- 【动态规划】洛谷P1802 5 倍经验日(01背包问题)
一个洛谷普及-的题目,也是我刚刚入门学习动态规划的练习题. 下面发一下我的思路和代码题解: 我的思路及伪代码: 我的AC图: 接下来上代码: 1 //动态规划 洛谷P1802 五倍经验日 2 #inc ...
- 洛谷 1600 (NOIp2016) 天天爱跑步——树上差分
题目:https://www.luogu.org/problemnew/show/P1600 看TJ:https://blog.csdn.net/clove_unique/article/detail ...
- 洛谷 P7718 -「EZEC-10」Equalization(差分转化+状压 dp)
洛谷题面传送门 一道挺有意思的题,现场切掉还是挺有成就感的. 首先看到区间操作我们可以想到差分转换,将区间操作转化为差分序列上的一个或两个单点操作,具体来说我们设 \(b_i=a_{i+1}-a_i\ ...
- 洛谷 P1802 5倍经验日
题目背景 现在乐斗有活动了!每打一个人可以获得5倍经验!absi2011却无奈的看着那一些比他等级高的好友,想着能否把他们干掉.干掉能拿不少经验的. 题目描述 现在absi2011拿出了x个迷你装药物 ...
- 洛谷——P1802 5倍经验日
https://www.luogu.org/problem/show?pid=1802#sub 题目背景 现在乐斗有活动了!每打一个人可以获得5倍经验!absi2011却无奈的看着那一些比他等级高的好 ...
- Luogu4926 倍杀测量者(二分答案+差分约束)
容易想到二分答案.问题变为判断是否所有条件都被满足,可以发现这是很多变量间的相对关系,取个log之后就是经典的差分约束模型了.特殊的地方在于某些人的分数已被给定,从每个人开始跑一遍最短路判断一下是否能 ...
随机推荐
- java中最常见的几种运行时异常,你get了吗?
NullPointerException (空指针异常) ClassCastException (类型强制转换异常) NumberFormatException (数字格式异常) NegativeAr ...
- Python开发之---PyCharm初体验
PyCharm 的初始设置(知道) 目标 恢复 PyCharm 的初始设置 第一次启动 PyCharm 新建一个 Python 项目 设置 PyCharm 的字体显示 PyCharm 的升级以及其他 ...
- muduo-ThreadLocal实现细节——阻止销毁未定义对象
muduo利用pthread_key_t实现ThreadLocal模板类. 具体代码如下所示: template<typename T> class ThreadLocal : nonco ...
- 浅谈React16框架 - Fiber
前言 React实现可以粗划为两部分:reconciliation(diff阶段)和 commit(操作DOM阶段).在 v16 之前,reconciliation 简单说就是一个自顶向下递归算法,产 ...
- Java垃圾回收(GC)机制详解
一.为什么需要垃圾回收 如果不进行垃圾回收,内存迟早都会被消耗空,因为我们在不断的分配内存空间而不进行回收.除非内存无限大,我们可以任性的分配而不回收,但是事实并非如此.所以,垃圾回收是必须的. 二. ...
- Android--UI之ListView
前言 今天讲解一下Android平台下ListView控件的开发,在本篇博客中,将介绍ListView的一些常用属性.方法及事件,还会讲解ListView在开发中常用的几种方式,以及使用不通用的适配器 ...
- 动车上的书摘-java网络 连接服务器
摘要: 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 应该有些延迟,你会看到黑幕中弹出 来自USA的X原子的计量时间: ...
- 使用Expression进行动态排序分页
Expression动态查询.分页 Expression,表达式树,以lamda表达式创建,就以表达式目录树的形式将强类型的lambda表达式标识为数据结构. 排序 /// <summary&g ...
- Win32之隐藏DLL隐藏模块技术
Win32之隐藏DLL隐藏模块技术 这一讲涉及到windows底层技术.跟汇编内容. 我们才可以实现模块隐藏(也称为DLL隐藏) 一丶API反汇编勾引兴趣 我们都用过Windows的进程跟线程API ...
- 【Go】IP地址转换:数字与字符串之间高效转换
转载:https://blog.thinkeridea.com/201903/go/ip2long.html IP 地址库中 IP 地址的保存格式一般有两种,一种是点分十进制形式(192.168.1. ...