容易想到二分答案。问题变为判断是否所有条件都被满足,可以发现这是很多变量间的相对关系,取个log之后就是经典的差分约束模型了。特殊的地方在于某些人的分数已被给定,从每个人开始跑一遍最短路判断一下是否能满足关系即可。

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int read()
{int x=0,f=1;char c=getchar();while (c<'0'||c>'9') {if (c=='-') f=-1;c=getchar();}while (c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar();return x*f;
}
#define N 1010
const double eps=1E-6;
double l,r,ans,d[N],a[N];
int n,m,k,p[N],q[N],cnt[N],t;
bool f[N],isget[N];
struct data{int to,nxt;double len;
}edge[N<<2];
struct flag{int op,x,y,z;
}Q[N];
void addedge(int x,int y,double z){t++;edge[t].to=y,edge[t].nxt=p[x],edge[t].len=z,p[x]=t;}
int inc(int &x){x++;if (x>n+1) x-=n+1;return x;}
bool spfa(int k)
{memset(f,0,sizeof(f));for (int i=1;i<=n;i++) d[i]=10000000;d[k]=0;memset(cnt,0,sizeof(cnt));int head=0,tail=1;q[1]=k;do{int x=q[inc(head)];f[x]=0;for (int i=p[x];i;i=edge[i].nxt)if (d[x]+edge[i].len<d[edge[i].to]){d[edge[i].to]=d[x]+edge[i].len;if (!f[edge[i].to]){q[inc(tail)]=edge[i].to,f[edge[i].to]=1;cnt[edge[i].to]++;if (cnt[edge[i].to]==n) return 0;}}}while (head!=tail);if (isget[k])for (int i=1;i<=n;i++)if (isget[i]&&d[i]<a[i]-a[k]) return 0;return 1;
}
bool check(double T)
{t=0;memset(p,0,sizeof(p));for (int i=1;i<=m;i++)if (Q[i].op==1){if (Q[i].z>T) addedge(Q[i].x,Q[i].y,-log(Q[i].z-T));}else addedge(Q[i].x,Q[i].y,log(Q[i].z+T));for (int i=1;i<=n;i++)if (!spfa(i)) return 1;return 0;
}
int main()
{
#ifndef ONLINE_JUDGEfreopen("c.in","r",stdin);freopen("c.out","w",stdout);const char LL[]="%I64d\n";
#elseconst char LL[]="%lld\n";
#endifn=read(),m=read(),k=read();for (int i=1;i<=m;i++)Q[i].op=read(),Q[i].x=read(),Q[i].y=read(),Q[i].z=read();l=eps,r=10-eps;ans=-1;for (int i=1;i<=k;i++){int x=read(),y=read();a[x]=log(y);isget[x]=1;}while (l<=r){double mid=(l+r)/2;if (check(mid)) ans=mid,l=mid+eps;else r=mid-eps;}if (ans<0) cout<<-1;else printf("%.8lf",ans);return 0;
}

转载于:https://www.cnblogs.com/Gloid/p/9762749.html

Luogu4926 倍杀测量者(二分答案+差分约束)相关推荐

  1. [NOIP 2015]运输计划-[树上差分+二分答案]-解题报告

    [NOIP 2015]运输计划 题面: A[NOIP2015 Day2]运输计划 时间限制 : 20000 MS 空间限制 : 262144 KB 问题描述 公元 2044 年,人类进入了宇宙纪元. ...

  2. BZOJ 4326 NOIP2015 运输计划(树上差分+LCA+二分答案)

    4326: NOIP2015 运输计划 Time Limit: 30 Sec  Memory Limit: 128 MB Submit: 1388  Solved: 860 [Submit][Stat ...

  3. P2680-运输计划【LCA,树上差分,二分答案】

    正题 题目链接:https://www.luogu.org/problemnew/show/P2680 题目大意 一棵带权无根树,给出若干条路径.选择一条边使其边权变为0,要求路径的长度的最大值最小. ...

  4. 洛谷P2463 [SDOI2008]Sandy的卡片(后缀数组SA + 差分 + 二分答案)

    题目链接:https://www.luogu.org/problem/P2463 [题意] 求出N个串中都出现的相同子串的最长长度,相同子串的定义如题:所有元素加上一个数变成另一个,则这两个串相同,可 ...

  5. luogu P2680 运输计划 (二分答案+树上差分)

    题目背景 公元 20442044 年,人类进入了宇宙纪元. 题目描述 公元20442044 年,人类进入了宇宙纪元. L 国有 nn 个星球,还有 n-1n−1 条双向航道,每条航道建立在两个星球之间 ...

  6. [BZOJ4556][TJOI2016HEOI2016]字符串(二分答案+后缀数组+RMQ+主席树)

    4556: [Tjoi2016&Heoi2016]字符串 Time Limit: 20 Sec  Memory Limit: 128 MB Submit: 1360  Solved: 545 ...

  7. P2463-[SDOI2008]Sandy的卡片【SA,二分答案】

    正题 题目链接:https://www.luogu.com.cn/problem/P2463 题目大意 nnn个长度不同的数字序列,序列的子串相同的定义是该子串相邻的两两差相同. 求公共子串的最长长度 ...

  8. 第十九章:二分查找和二分答案

    二分查找 二分的思想在程序设计中有着广泛的应用,例如,排序算法中的快速排序.归并排序,数据结构中的二叉树.堆.线段树等.二分是一种常用且高效的算法,它的基本用途是在单调序列中进行查找和判定操作. 二分 ...

  9. 0629-树状数组+二分答案-排列

    今天的测试,让我知道自己还有很多很多知识点的掌握不牢,发现自己代码能力很差,思维也不够好,蒟蒻感到深深地难过.但不管怎么样,一切杀不死我的,都会使我变得强大,我不会放弃挣扎的!我相信只要肯钻研,就无论 ...

最新文章

  1. 【Android 组件化】使用 Gradle 实现组件化 ( Gradle 变量定义与使用 )
  2. 牛客网题目——替换空格
  3. c++17(18)-static_cast
  4. 1cocos2dx扩展库UI控件,CCControlSlider,CCScale9Sprite(九妹图),CCControlSwitch,CCControlButton
  5. 机器学习基础-一元线性回归-01
  6. [spark]Spark2.4.6用put写入写入Hbase1.3.1
  7. tomcat 域名配置、中文域名、别名配置
  8. 遇到不适当的参数_高清兽用B超机参数调整——“增益”
  9. ABP教程-打造一个《电话簿项目》-目录-MPA版本-基于ABP1.13版本
  10. 数码照片尺寸计算秘笈
  11. 母牛的故事(C语言)
  12. 非线性优化库NLopt简介
  13. Android 实现人脸识别检测时的扫描动画效果(二维码扫描动画效果同理)
  14. Java修仙,法力无边(光速回顾Java基础~)
  15. Amino-PEG8-alcohol,352439-37-3的化学性质分析
  16. 从200K/s到2M/s,只差这篇文章——使用ProxyeeDown加速百度云盘下载速度
  17. 带你了解现在的LED显示屏技术
  18. python按某列拆分excel表格_把一张Excel表按照固定列分成不同工作薄的小白方法...
  19. 笔画输入法教程――如何学习笔画输入法
  20. 设备更新,工作室搬迁

热门文章

  1. bootstrap-关闭按钮
  2. 物理Data Guard的日常维护
  3. Kafka官方文档翻译——简介
  4. 1. 青蛙跳跳FrogJmp Count minimal number of jumps from position X to Y.
  5. 使用***搭建javaweb环境
  6. 当深度学习遇上异构并行计算
  7. VS2005快捷键大全
  8. Java程序员从笨鸟到菜鸟之(四十四)细谈struts2(七)数据类型转换详解
  9. private用法 java_关于android开发中如何正确使用Private Services安全用法及代码示例...
  10. 词法分析-中文分词技术-正向最大匹配法与逆向最大匹配法