~~~题面~~~

题解:

差分约束学得实在是太烂了,,,,QAQ

这里先记下:

a - b >= x  ---> a >= b + x     ---->        b ---> a = x(b连a,边权为x),      ----> 找最长路, --->f[a][b]对应a - b的最小值,

a - b <=x ---->后面的都反过来就好了

关于这道题:

首先我们可以发现它实际上就是告诉了我们一堆这样的关系:

a > b,

a < b,

a = b,

所以我们应该要想到差分约束,

如果直接连,我们发现连边权都没有,,,,

因此我们要对式子进行转化,

以a > b为例:

a > b ----> a - b > 0 ---> a - b >= 1 ---> a >= b + 1,

这就变成了形如上面的式子,

但是我们发现我们得到了a - b 的最大值和最小值还不够,

于是我们对目标进行转化,

题目要求a + b  ? x + y,其中a + b给定,

那么小于的情况实际上就是a - x < y - b || a - y < x - b,

如果是大于,那直接换符号即可,

如果是等于还要判断a - x的最大最小值相等,因为要确定的结果才能被计入答案,

 #include<bits/stdc++.h>
using namespace std;
#define R register int
#define AC 52
/*考虑差分约束中路的长度的意义。
n很小,所以考虑floyd*/
int n,a,b,ans1,ans2,ans3;
int f_min[AC][AC], f_max[AC][AC];
char c[AC]; inline void upmin(int &a,int b)
{
if(b < a) a = b;
} inline void upmax(int &a,int b)
{
if(b > a) a = b;
} inline void pre()
{
scanf("%d%d%d",&n,&a,&b);
memset(f_min,,sizeof(f_min));
for(R i=;i<=n;i++)
{
scanf("%s",c+);
for(R j=;j<=n;j++)
{
if(c[j] == '=' || i == j)
f_min[i][j] = f_max[i][j] = ;
else if(c[j] == '+')
f_min[i][j] = , f_max[i][j] = ;//s[i] - s[j] <= 2, s[i] - s[j] >= 1(最大是3 - 1 = 2)
else if(c[j] == '-')
f_min[i][j] = -, f_max[i][j] = -;//s[i] - s[j] <= -1, s[i] - s[j] >= -2
else
f_min[i][j] = , f_max[i][j] = -;//s[i] - s[j] <= 2, i - j >= -2
}
} }
#define f_min f_min
#define f_max f_max
void floyd()
{
/*for(R k=1;k<=n;k++)
for(R i=1;i<=n;i++)
{
if(i == k) continue;//防止自己做中转
for(R j=1;j<=n;j++)
{
if(i == j) continue;//自己到自己是没有用的
upmin(f_min[i][j], f_min[i][k] + f_min[k][j]);
upmax(f_max[i][j], f_max[i][k] + f_max[k][j]);
}
}*/
for(int k=;k<=n;k++) //Floyd
for(int i=;i<=n;i++)
{
if(i==k) continue;
for(int j=;j<=n;j++)
{
if(i==j) continue;
f_min[i][j]=min(f_min[i][j],f_min[i][k]+f_min[k][j]);//上界求最短路
f_max[i][j]=max(f_max[i][k]+f_max[k][j],f_max[i][j]);//下界求最长路
}
}
} void work()
{//error!!!额。。。最长路对应最小值,最短路对应最大值
/*for(R i=1;i<=n;i++)
{
for(R j=1;j<=n;j++)
printf("%d ",f_min[i][j]);
printf("\n");
}
printf("\n");
for(R i=1;i<=n;i++)
{
for(R j=1;j<=n;j++)
printf("%d ",f_max[i][j]);
printf("\n");
}*/
for(R i = ; i <= n; i++)//强行枚举每一种可能
{
if(i == a || i == b) continue;//不能选已经选定了的
for(R j = ; j < i; j++)//<i防止重复统计
{
if(j == a || j == b) continue;//同上
if(f_min[a][i] < f_max[j][b] || f_min[a][j] < f_max[i][b]) ++ans3;
if(f_max[a][i] > f_min[j][b] || f_max[a][j] > f_min[i][b]) ++ans1;
if(f_max[a][i] == f_min[a][i] && f_max[j][b] == f_min[j][b] && f_max[a][i] == f_max[j][b]) ++ans2;
else if(f_min[a][j] == f_max[a][j] && f_min[i][b] == f_max[i][b] && f_min[a][j] == f_min[i][b]) ++ans2;
}
}
printf("%d %d %d\n",ans1,ans2,ans3);
} int main()
{
freopen("in.in","r",stdin);
pre();
floyd();
work();
fclose(stdin);
return ;
}

[SCOI2008]天平 差分约束的更多相关文章

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

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

  2. [luogu2474 SCOI2008]天平(floyd差分约束)

    传送门 Solution 由于重量只有三种情况,那么想到用差分约束. 由于范围比较小,想到可以floyed求差分约束,暴力求天平另一边 Code #include <cstdio> #in ...

  3. 【洛谷】2474:[SCOI2008]天平【差分约束系统】

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

  4. 2021.07.23 P2474 天平(差分约束)

    2021.07.23 P2474 天平(差分约束) [P2474 SCOI2008]天平 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 已知A,B和每两个点点权,求点权i, ...

  5. 【BZOJ1077】天平(差分约束)

    [BZOJ1077]天平(差分约束) 题面 BZOJ 洛谷 题解 利用矩阵可以很容易得到两个点之间的最大差和最小差,再利用这个信息判断即可.差分约束用\(Floyd\)计算.时间复杂度\(O(n^3) ...

  6. 洛谷P2474 [SCOI2008]天平

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

  7. [SCOI2008]天平

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

  8. Candies-POJ3159差分约束

    Time Limit: 1500MS Memory Limit: 131072K Description During the kindergarten days, flymouse was the ...

  9. poj3159 差分约束 spfa

    //Accepted 2692 KB 1282 ms //差分约束 -->最短路 //TLE到死,加了输入挂,手写queue #include <cstdio> #include & ...

随机推荐

  1. tensorflow学习一

    1.用图(graph)来表示计算任务 2.用op(opreation)来表示图中的计算节点,图有默认的计算节点,构建图的过程就是在其基础上加节点. 3.用tensor表示每个op的输入输出数据,可以使 ...

  2. Putty远程连接Ubuntu14.04

    步骤一.在ubuntu系统中安装ssh,可使用如下的命令进行安装: sudo apt-get install openssh-server 步骤二.为了保险起见,安装完成后重启一下ssh服务,命令如下 ...

  3. JMeter自学笔记2-图形界面介绍

    一.写在前面的话: 上篇我们已经学会了如何安装JMeter和打开JMeter,那么这篇我们将对JMeter的图形界面做一个简单的介绍.大家只要简单的了解即可,无需死记硬背,在今后的学习和使用中慢慢熟悉 ...

  4. Solr与Elasticsearch区别

    Elasticsearch Elasticsearch是一个实时的分布式搜索和分析引擎.它可以帮助你用前所未有的速度去处理大规模数据. 它可以用于全文搜索,结构化搜索以及分析. 优点 Elastics ...

  5. lintcode 二叉树前序遍历

    二叉树的前序遍历    给出一棵二叉树,返回其节点值的前序遍历. 您在真实的面试中是否遇到过这个题? Yes 样例 给出一棵二叉树 {1,#,2,3}, 1 \ 2 / 3 返回 [1,2,3]. / ...

  6. (原)HUD绘画贴图解析

    @小道:临时存放       1\主过程 说明: a\调用DrawTextureSimple时,会将UTexure封装成CavarsItem, 若是正交投射函数执行双,最后CavarsItem.Dra ...

  7. nginx 应用篇

    nginx 信号控制(commanLine) kill singel  pid ps aux|grep nginx nginx 有两个进程,一个 master 一个worker 一个master管理一 ...

  8. JS判断是IOS还是Android以及如何解决h5打包后在ios下内容与状态栏重叠问题

    h5打包后在ios下内容与状态栏重叠问题: 1:知道设备的类型: var u = navigator.userAgent, app = navigator.appVersion; var isAndr ...

  9. Java学习个人备忘录之多态

    对象的多态性 class 动物 {} class 猫 extends 动物 {} class 狗 extends 动物 {} 猫 x = new 猫();//意思是建立本类的对象 new 猫(),并通 ...

  10. mysql唯一查询

    MySQL单一字段唯一其他字段差异性忽略查询.在使用MySQL时,有时需要查询出某个字段不重复的记录,虽然mysql提供 有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返 ...