bzoj1077
题解
这道题n的范围很小,所以我们可以考虑枚举+判定
设放在天平右边的是C,D.
以A+B<C+D为例,因为差分约束必须是差的形式,所以我们将式子变形
B−C<D−A然后枚举D,A的取值,就得到了一个关于两个数差的不等式。设枚举的A的值为x,那么x<=A<=x 这个式子要想转换成差分的形式,需要引入一个新变量0,设dis[0]=0,那么式子可以变成x<=A−0<=x
注意每个点都只能从[1,3]中取值,所以隐含的限制就是1<=dis[i]−dis[0]<=3。
题目中说只有结果保证惟一的选法才统计在内,意思是对于同一对C,D只能计算一次,且如果枚举的C,D的值不同,得到的与A+B的关系不同的话,那么方案不合法。
代码:
#include<bits/stdc++.h>
const int N=;
using namespace std;
int tot,ne[N],fi[N],zz[N],c[N],mp[][],ans[];
int can[N],dis[N],n,B,A,rec[],pd;
void add(int x,int y,int z)
{
tot++;
ne[tot]=fi[x];
fi[x]=tot;
zz[tot]=y;
c[tot]=z;
}
void spfa(int x)
{
can[x]=;
for (int i=fi[x];i;i=ne[i])
if (dis[zz[i]]>dis[x]+c[i])
{
dis[zz[i]]=dis[x]+c[i];
if (can[zz[i]])
{
pd=;
return;
}
spfa(zz[i]);
if (pd) return;
}
can[x]=;
}
void build()
{
pd=;
for (int i=;i<=n;i++) dis[i]=1e9,can[i]=;
dis[]=;
}
int check1(int c,int d,int vd,int va)
{
build();
rec[]=tot; rec[]=fi[A]; rec[]=fi[B];
rec[]=fi[c]; rec[]=fi[d]; rec[]=fi[];
int t=vd-va-;
add(c,B,t);
add(,d,vd); add(d,,-vd);
add(,A,va); add(A,,-va);
spfa();
tot=rec[]; fi[A]=rec[]; fi[B]=rec[];
fi[c]=rec[]; fi[d]=rec[]; fi[]=rec[];
return pd;
}
int check2(int c,int d,int vd,int va)
{
build();
rec[]=tot; rec[]=fi[A]; rec[]=fi[B];
rec[]=fi[c]; rec[]=fi[d]; rec[]=fi[];
int t=va-vd-;
add(B,c,t);
add(,d,vd); add(d,,-vd);
add(,A,va); add(A,,-va);
spfa();
tot=rec[]; fi[A]=rec[]; fi[B]=rec[];
fi[c]=rec[]; fi[d]=rec[]; fi[]=rec[];
return pd;
}
int check3(int c,int d,int vd,int va)
{
build();
rec[]=tot; rec[]=fi[A]; rec[]=fi[B];
rec[]=fi[c]; rec[]=fi[d]; rec[]=fi[];
int t=vd-va;
add(c,B,t); add(B,c,-t);
add(,d,vd); add(d,,-vd);
add(,A,va); add(A,,-va);
spfa();
tot=rec[]; fi[A]=rec[]; fi[B]=rec[];
fi[c]=rec[]; fi[d]=rec[]; fi[]=rec[];
return pd;
}
int main()
{
scanf("%d%d%d",&n,&A,&B);
for (int i=;i<=n;i++)
{
char s[];
scanf("%s",s+);
for (int j=;j<=n;j++)
{
if (s[j]=='+') add(i,j,-);
if (s[j]=='-') add(j,i,-);
if (s[j]=='=') add(j,i,),add(i,j,);
}
}
for (int i=;i<=n;i++) add(,i,),add(i,,-);
for (int i=;i<n;i++)
for (int j=i+;j<=n;j++)
{
if (i==A||j==B||i==B||j==A) continue;
int v1=,v2=,v3=;
for (int d=;d<=;d++)
for (int a=;a<=;a++)
{
int t1=check1(i,j,d,a);
int t2=check2(i,j,d,a);
int t3=check3(i,j,d,a);
if (!t1) v1++;
if (!t2) v2++;
if (!t3) v3++;
}
if (v1&&!v2&&!v3) ans[]++;
if (!v1&&v2&&!v3) ans[]++;
if (!v1&&!v2&&v3) ans[]++;
}
printf("%d %d %d\n",ans[],ans[],ans[]);
}
bzoj1077的更多相关文章
- 【BZOJ1077】天平(差分约束)
[BZOJ1077]天平(差分约束) 题面 BZOJ 洛谷 题解 利用矩阵可以很容易得到两个点之间的最大差和最小差,再利用这个信息判断即可.差分约束用\(Floyd\)计算.时间复杂度\(O(n^3) ...
- BZOJ1077 : [SCOI2008]天平
首先通过差分约束系统建图,用Floyed算法求出任意两个砝码差值的上下界. 然后暴力枚举放在右边的砝码C,D,通过与A,B差值的上下界分类讨论统计方案. 时间复杂度$O(N^3)$. #include ...
- BZOJ1077 并查集
1077: [SCOI2008]天平 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 416 Solved: 224[Submit][Status][ ...
- [bzoj1077]天平
先考虑如何求出任意两数的最大差值和最小差值,直接差分约束建图跑floyd求最短路和最长路即可然后枚举i和j,考虑dA+dB和di+dj的关系,分两种情况移项,转化成dA-di和dj-dB的关系或dA- ...
- BZOJ第1页养成计划
嗯,用这篇博客当一个目录,方便自己和学弟(妹?)们查阅.不定期更新. BZOJ1000 BZOJ1001 BZOJ1002 BZOJ1003 BZOJ1004 BZOJ1005 ...
- bzoj网络流
近期看了一些bzoj的网络流,深感智商不够.不过对于网络流又有了进一步的理解. 还是mark一下吧. 献上几篇论文:1)<最小割模型在信息学竞赛中的应用> 2)<浅析一类最小割问题& ...
随机推荐
- Grafana+Prometheus监控
添加模板一定要看说明以及依赖 监控redis https://blog.52itstyle.com/archives/2049/ http://www.cnblogs.com/sfnz/p/65669 ...
- 【云安全与同态加密_调研分析(8)】同态加密技术及其应用分析——By Me
◆同态加密技术(Homomorphic Encryption, HE)及其应用◆ ◆加密方案◆ ◆应用领域◆ ◆厂商◆ ◆同态加密现有产品形态和工程实现◆ ◆参考链接◆ ◆备注(其他参考信息)◆ 同态 ...
- python用pyinstaller打包成exe文件
版本为Python2.7 一.安装Pyinstaller 1.安装pywin32 下载安装文件:查找到跟自己适用的python版本及window系统版本匹配的pywin32,下载后安装 使用pip命 ...
- 整合最优雅SSM框架:SpringMVC + Spring + MyBatis 基础
在写代码之前我们先了解一下这三个框架分别是干什么的? 相信大以前也看过不少这些概念,我这就用大白话来讲,如果之前有了解过可以跳过这一大段,直接看代码! SpringMVC:它用于web层,相当于con ...
- WebMagic简介和使用
概览 WebMagic是一款简单灵活的爬虫框架.基于它你可以很容易的编写一个爬虫. WebMagic项目代码分为核心和扩展两部分. 核心部分(webmagic-core)是一个精简的.模块化的爬虫实现 ...
- mysqldump 导出统一限制每张数据表导出的记录数
mysqldump 导出统一限制每张数据表导出的记录数 在工作过程中,需要将生产的数据导出到本地开发环境,我希望可以导出部分数据.而服务器数据量比较大(上千万),如果选择直接从服务器导出数据, 正在运 ...
- docker——安全防护与配置
Docker是基于Linux操作系统实现的应用虚拟化.运行在容器内的进程,跟运行在本地系统的进程本质上并无区别,配置不合适的安全策略将可能给本地系统带来安全风险,因此,Docker的安全性在生产环境中 ...
- pyenv常用命令
pyenv使用教程 安装 Mac brew install pyenv brew install pyenv-virtualenv 配置 echo 'eval "$(pyenv init - ...
- Python 日历模块calendar.monthrange 获取某一个月有多少天
import calendar monthRange = calendar.monthrange(2018, 10) (0, 31) 输出的是一个元组: 第一个元素,数字0是这个月的第一天是星期天(上 ...
- qml学习笔记(二):可视化元素基类Item详解(上半场anchors等等)
原博主博客地址:http://blog.csdn.net/qq21497936本文章博客地址:http://blog.csdn.net/qq21497936/article/details/78516 ...