~~~题面~~~

题解:

差分约束学得实在是太烂了,,,,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. CakePHP中回调函数的使用

    我们知道模型主要是用来处理数据的,有时我们想在模型操作之前或之后做一些额外逻辑处理,这时候就可以使用回调函数. 回调函数有很多种,beforeFind,afterFind,beforeValidate ...

  2. 机器学习常用算法(LDA,CNN,LR)原理简述

    1.LDA LDA是一种三层贝叶斯模型,三层分别为:文档层.主题层和词层.该模型基于如下假设:1)整个文档集合中存在k个互相独立的主题:2)每一个主题是词上的多项分布:3)每一个文档由k个主题随机混合 ...

  3. VIN码识别/车牌识别:是入口,是门面

    汽车后市场高速发展下,汽车用品.零配件及售后服务已经从实体店延伸至线上,无论是整车厂.4S店.传统的汽修店,还是汽配商,都渴望用更合理的.高效的方式,实现运营管理上的突破. 广州云实信息科技有限公司( ...

  4. caffe Mac 安装

    参考了 https://zhuanlan.zhihu.com/p/24853767 安装caffe的依赖项 brew install --fresh -vd snappy leveldb gflags ...

  5. Unity编辑器 - 输入控件聚焦问题

    Unity编辑器整理 - 输入控件聚焦问题 EditorGUI的输入控件在聚焦后,如果在其他地方改变值,聚焦的框不会更新,而且无法取消聚焦,如下图: 在代码中取消控件的聚焦 取消聚焦的"时机 ...

  6. python中出现ascii编码问题的解决办法

    一劳永逸,一次性全盘解决的办法 环境变量中去设置 以centos 7为例: vim /etc/profile export PYTHONIOENCODING=utf-8 source /etc/pro ...

  7. 子序列 (All in All,UVa10340)

    题目描述:算法竞赛入门经典习题3-9 题目思路:循环匹配 //没有按照原题的输入输出 #include <stdio.h> #include <string.h> #defin ...

  8. java length属性、length()、size()

    length属性 length是属性,用于说明数组的长度. String []list={"wo","shi","shuaibi"}; Sy ...

  9. mac上golang编译出现clang错误

    错误现象 几周前,突然发现我的go 项目编译开始报一种以前从来没有出现过的错误: # runtime/cgo clang: warning: argument unused during compil ...

  10. BZOJ 1503 郁闷的出纳员(平衡树)(NOI 2004)

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1503 Description OIER公司是一家大型专业化软件公司,有着数以万计的员工.作 ...