[SCOI2008]天平 差分约束
题解:
差分约束学得实在是太烂了,,,,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]天平 差分约束的更多相关文章
- 洛谷2474 [SCOI2008] 天平 差分约束->枚举
题目描述 你有n个砝码,均为1克,2克或者3克.你并不清楚每个砝码的重量,但你知道其中一些砝码重量的大小关系.你把其中两个砝码A 和B 放在天平的左边,需要另外选出两个砝码放在天平的右边.问:有多少种 ...
- [luogu2474 SCOI2008]天平(floyd差分约束)
传送门 Solution 由于重量只有三种情况,那么想到用差分约束. 由于范围比较小,想到可以floyed求差分约束,暴力求天平另一边 Code #include <cstdio> #in ...
- 【洛谷】2474:[SCOI2008]天平【差分约束系统】
P2474 [SCOI2008]天平 题目背景 2008四川NOI省选 题目描述 你有n个砝码,均为1克,2克或者3克.你并不清楚每个砝码的重量,但你知道其中一些砝码重量的大小关系.你把其中两个砝码A ...
- 2021.07.23 P2474 天平(差分约束)
2021.07.23 P2474 天平(差分约束) [P2474 SCOI2008]天平 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 已知A,B和每两个点点权,求点权i, ...
- 【BZOJ1077】天平(差分约束)
[BZOJ1077]天平(差分约束) 题面 BZOJ 洛谷 题解 利用矩阵可以很容易得到两个点之间的最大差和最小差,再利用这个信息判断即可.差分约束用\(Floyd\)计算.时间复杂度\(O(n^3) ...
- 洛谷P2474 [SCOI2008]天平
P2474 [SCOI2008]天平 题目背景 2008四川NOI省选 题目描述 你有n个砝码,均为1克,2克或者3克.你并不清楚每个砝码的重量,但你知道其中一些砝码重量的大小关系.你把其中两个砝码A ...
- [SCOI2008]天平
题目描述 你有n个砝码,均为1克,2克或者3克.你并不清楚每个砝码的重量,但你知道其中一些砝码重量的大小关系.你把其中两个砝码A 和B 放在天平的左边,需要另外选出两个砝码放在天平的右边.问:有多少种 ...
- Candies-POJ3159差分约束
Time Limit: 1500MS Memory Limit: 131072K Description During the kindergarten days, flymouse was the ...
- poj3159 差分约束 spfa
//Accepted 2692 KB 1282 ms //差分约束 -->最短路 //TLE到死,加了输入挂,手写queue #include <cstdio> #include & ...
随机推荐
- Calendar 实现日历实例
import java.text.ParseException; import java.util.Calendar; import java.util.GregorianCalendar; impo ...
- autocomplete.jquery 点击或进入默认显示所有结果
注意使用的是autocomplete.jquery,官网地址是:https://github.com/devbridge/jQuery-Autocomplete.而不是JqueryUI的autocom ...
- ubuntu16安装过程中的硬盘分区
硬盘分区主要是三个区,如下图,分别是/,swap交换空间,/home,其中第一个分区/是主分区,建议至少8GB,要不ubuntu安装的时候放不下.
- MongoDB 安装 增删改查
MongoDB 一 介绍 1.高性能的数据存储解决方案是大多数大型Web应用程序和服务的核心.后端数据库负责存储一切东西,从用户账户的信息到购物车中的商品,以及博客和评论数据等.好的Web应用需要 ...
- libevent学习六(Connect listeners )
创建与释放 //backlog需要查询平台说明,在linux2.2以后 backlog就变成了已完成连接但未accept的队列的最大值(原来是处于syn状态的,现在换成sysctl 控制的参数tc ...
- 「日常训练」More Cowbell(Codeforces Round #334 Div.2 B)
题意与分析(CodeForces 604B) 题意是这样的:\(n\)个数字,\(k\)个盒子,把\(n\)个数放入\(k\)个盒子中,每个盒子最多只能放两个数字,问盒子容量的最小值是多少(水题) 不 ...
- Qt-序列号生成器
一直想做一个序列号的生成器,今天终于有了开始了,目前只有读取硬件生成,还没有做生成序列号的规则. 目前实现的功能就是读取系统磁盘卷加上CPU ID 和自己的加密字符串,在利用MD5加密,转换成标准32 ...
- Selenium(Python)驱动Chrome浏览器
Chrome浏览器与chromedriver.exe驱动可以是官网上最新的, 随意! Chrome.py: from selenium import webdriverfrom selenium.we ...
- 跟浩哥学自动化测试Selenium -- 我的第一个Demo (2)
我的第一个Demo 开始写第一个 Demo 之前,先熟悉一下编写 Selenium 脚本的四个步骤: 驱动路径写法分析:System.setProperty 主要做用是设置系统属性,第一个参数为系统属 ...
- C指针函数中的局部变量返回
所谓指针函数其实就是 :一个函数的返回值为指针. 指针函数定义:返回类型标识符* 函数名(形参列表){函数体} eg: int* fun1(int n){} 指针函数和局部变量返回解析: 简 ...