题目


分析

非传统差分约束??

注意只有结果保证惟一的选法才统计在内

这就为差分约束提供了依据

以左边重为例,假设现在选择的砝码为\(i,j\),

那么\(\because A+B>i+j\therefore A-i>j-B\)

既然结果保证唯一,那么也就是\(min(A-i)>max(j-B)\)

右边重同理,也就是\(max(A-i)<min(j-B)\)

同样重也很显然,就是

\(min(A-i)=max(A-i),min(j-B)=max(j-B),max(A-i)=min(j-B)\)

讲到这里该怎么做,floyd现身了,考虑维护最短路和最长路,

  1. 等号也就是\(i-j\leq 0,i-j\geq 0\)
  2. 大于号也就是\(i-j\leq -1,i-j\geq -2\)
  3. 小于号也就是\(i-j\leq 2,i-j\geq 1\)
  4. 问号也就是\(i-j\geq -2,i-j\leq 2\)

按照这个floyd建图分别跑最短路和最长路即可

这和传统的SPFA有什么区别呢,可以发现它求的是多源最短路,

那么Floyd要比SPFA更加方便


代码

#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
const int N=51; char s[N];
int n,A,B,dmn[N][N],dmx[N][N],ans1,ans2,ans3;
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline signed min(int a,int b){return a<b?a:b;}
inline signed max(int a,int b){return a>b?a:b;}
signed main(){
scanf("%d%d%d",&n,&A,&B);
for (rr int i=1;i<=n;++i){
scanf("%s",s+1),s[i]='=';
for (rr int j=1;j<=n;++j)
switch (s[j]){
case '=':{
dmn[i][j]=0,dmx[i][j]=0;
break;
}
case '+':{
dmn[i][j]=1,dmx[i][j]=2;
break;
}
case '-':{
dmn[i][j]=-2,dmx[i][j]=-1;
break;
}
case '?':{
dmn[i][j]=-2,dmx[i][j]=2;
break;
}
}
}
for (rr int k=1;k<=n;++k)
for (rr int i=1;i<=n;++i)
for (rr int j=1;j<=n;++j)
if ((i^k)&&(i^j)&&(k^j))
dmn[i][j]=max(dmn[i][j],dmn[i][k]+dmn[k][j]),//下界
dmx[i][j]=min(dmx[i][j],dmx[i][k]+dmx[k][j]);//上界
for (rr int i=1;i<=n;++i)
for (rr int j=1;j<i;++j)
if ((i^j)&&(i^A)&&(i^B)&&(j^A)&&(j^B)){
if (dmn[A][i]>dmx[j][B]||dmn[B][i]>dmx[j][A]) ++ans1;
if (dmn[i][A]>dmx[B][j]||dmn[i][B]>dmx[A][j]) ++ans3;
if ((dmn[A][i]==dmx[A][i]&&dmn[j][B]==dmx[j][B]&&dmn[A][i]==dmx[j][B])||
(dmn[A][j]==dmx[A][j]&&dmn[i][B]==dmx[i][B]&&dmn[A][j]==dmx[i][B]))
++ans2;
}
return !printf("%d %d %d",ans1,ans2,ans3);
}

#差分约束,Floyd#洛谷 2474 [SCOI2008]天平的更多相关文章

  1. 洛谷2474 [SCOI2008] 天平 差分约束->枚举

    题目描述 你有n个砝码,均为1克,2克或者3克.你并不清楚每个砝码的重量,但你知道其中一些砝码重量的大小关系.你把其中两个砝码A 和B 放在天平的左边,需要另外选出两个砝码放在天平的右边.问:有多少种 ...

  2. 洛谷P2474 [SCOI2008]天平

    P2474 [SCOI2008]天平 题目背景 2008四川NOI省选 题目描述 你有n个砝码,均为1克,2克或者3克.你并不清楚每个砝码的重量,但你知道其中一些砝码重量的大小关系.你把其中两个砝码A ...

  3. 差分约束算法————洛谷P4878 [USACO05DEC] 布局

    题目: 不难看出题意主要是给出ml+md个格式为xi-xj<=ak的不等式,xi-xj为i,j俩头牛的距离,要我们求x1-xn的最大值. 经过上下加减我们可以将这几个不等式化成x1-xn< ...

  4. 【最短路·差分约束】洛谷P1250

    题目描述 一条街的一边有几座房子.因为环保原因居民想要在路边种些树.路边的地区被分割成块,并被编号成1..N.每个部分为一个单位尺寸大小并最多可种一棵树.每个居民想在门前种些树并指定了三个号码B,E, ...

  5. 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)

    洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...

  6. BZOJ1079或洛谷2476 [SCOI2008]着色方案

    一道记忆化搜索 BZOJ原题链接 洛谷原题链接 发现对于能涂木块数量一样的颜色在本质上是一样的,所以可以直接压在一个状态,而这题的数据很小,直接暴力开\(6\)维. 定义\(f[a][b][c][d] ...

  7. 洛谷P2405 non天平

    题目背景 non最近正在为自己的体重而苦恼,他想称量自己的体重.于是,他找来一个天平与许多砝码. 题目描述 砝码的重量均是n的幂次,n^1.n^2.n^3.n^4.n^5的……non想知道至少要多少个 ...

  8. 洛谷 P2473 [SCOI2008]奖励关 解题报告

    P2473 [SCOI2008]奖励关 题目描述 你正在玩你最喜欢的电子游戏,并且刚刚进入一个奖励关.在这个奖励关里,系统将依次随机抛出\(k\)次宝物,每次你都可以选择吃或者不吃(必须在抛出下一个宝 ...

  9. 洛谷 P2507 [SCOI2008]配对

    P2507 [SCOI2008]配对 题目背景 四川NOI2008省选 题目描述 你有 n 个整数Ai和n 个整数Bi.你需要把它们配对,即每个Ai恰好对应一个Bp[i].要求所有配对的整数差的绝对值 ...

  10. 洛谷P2507 [SCOI2008]配对

    题目背景 四川NOI2008省选 题目描述 你有 n 个整数Ai和n 个整数Bi.你需要把它们配对,即每个Ai恰好对应一个Bp[i].要求所有配对的整数差的绝对值之和尽量小,但不允许两个相同的数配对. ...

随机推荐

  1. 2021-06-28 CSS变量设置颜色

    说明 css变量只能以[–]开头. 距离当前dom元素层级最近的父元素作用域css变量的值更容易生效. css变量在css文件中只能以var()函数来使用. 代码 <!DOCTYPE html& ...

  2. linux下安装nginx(编译安装)及反向代理及负载均衡

    首先卸载掉之前用yum命令下载的nginx yum remove nginx 安装nginx需要的依赖库 yum install -y gcc patch libffi-devel python-de ...

  3. 【Azure Redis 缓存】关于Azure Cache for Redis 服务在传输和存储键值对(Key/Value)的加密问题

    问题描述 Azure Cache for Redis 服务在传输和存储数据时是如何加密呢? 问题回答 一:关于Azure cache for Redis服务在数据传输过程中是如何加密的? 为了确保在A ...

  4. SpringBoot2.x 启动过程详解

    spring 简化了java应用开发, 而springboot则简化了 spring应用的开发,用约定优于配置优于编码的方式快速构建spring对其他框架的整合. 官方文档 探究Hello,World ...

  5. Android 安装手机程序有问题/点击runAPP 程序安装不了手机

    可以在 gradle.properties 里添加   android.injected.testOnly=false   点击同步  就可以运行了 如下:

  6. Java 线程通信 例子:使用俩个线程打印1-100.线程1 线程2 交替打印

    1 package bytezero.threadcommunication; 2 3 /** 4 * 线程通信的例子:使用俩个线程打印1-100.线程1 线程2 交替打印 5 * 6 * 涉及到的三 ...

  7. centos7 开机自动执行脚本

    1.因为在centos7中/etc/rc.d/rc.local的权限被降低了,所以需要赋予其可执行权 chmod +x /etc/rc.d/rc.local 2.赋予脚本可执行权限假设/usr/loc ...

  8. 【数据结构】C语言实现动态扩容数组

    // resizable array /* Think about a set of functions that provide a mechanism of resizable array of ...

  9. 一个简单的HTTP服务器的实现

    我们继续我们的HTTP服务器的实现(使用别的代码来实现), 这个HTTP服务器的实现,我们主要就是关注TCP服务器中的recv还有send的处理. 首先,看一下HTTP,我们在用浏览器访问我们的TCP ...

  10. day01-项目介绍和功能实现

    项目练习01 1.项目介绍 这是一个简单的项目练习,用于掌握新学习的SpringBoot技术. 项目操作界面 ● 技术栈 Vue3+ElementPlus+Axios+MyBatisPlus+Spri ...