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)<浅析一类最小割问题& ...
随机推荐
- Replication--复制与CDC和镜像
复制和CDC 都是使用logreader来从日志中读取数据的变更,然后写入到分发库(复制)或变更表中. 1> 单独创建复制发布 在该情况下,会在分发服务器上创建日志读取代理作业(ServerNa ...
- android showDialog用法
protected Dialog onCreateDialog(int id) { // TODO Auto-generated method stub switch(id){ case 10: re ...
- soapUI-DataSource
1.1.1.1 概述 - 数据源 Option Description Properties DataSource属性表 Toolbar DataSource工具栏 Configura ...
- php \r \n 和 <br/> \t
利用\r \n 和 <br/> \t做了个实验,话不多说,看代码就很清楚的知道
- Git 系列——第一步安装 Git
之前也没有用过什么版本控制的工具,唯一用过的就是 SVN 了,不过也只是简单的使用而已,比如写好代码就签入,没了?是的,没了. 于是接触到了 Git 这个分布式版本控制软件,接下来就让我们好好学习,天 ...
- try with resources简洁的异常捕获机制
通过前篇的<Java文件IO流的操作总结>,我们知道了基本输入输出流的使用方式,但是每次都需要在finally处关闭流资源,这样操作起来既啰嗦又麻烦,有没有更简洁的方式呢?本篇就来讲解jd ...
- HDU - 2844 Coins(多重背包+完全背包)
题意 给n个币的价值和其数量,问能组合成\(1-m\)中多少个不同的值. 分析 对\(c[i]*a[i]>=m\)的币,相当于完全背包:\(c[i]*a[i]<m\)的币则是多重背包,考虑 ...
- 587. Erect the Fence(凸包算法)
问题 给定一群树的坐标点,画个围栏把所有树围起来(凸包). 至少有一棵树,输入和输出没有顺序. Input: [[1,1],[2,2],[2,0],[2,4],[3,3],[4,2]] Output: ...
- 两步实现在Git Bash中用Sublime打开文件
每次都要用鼠标点来点去才能用sublime打开文件!太不科学!今天来配置一下在Git bash中用sublime打开文件 方法 新建一个文件命名为你想要的命令,比如 subl(注意不能有后缀名),内容 ...
- 从e.getMessage()为null看Java异常机制
问题:自定义异常触发了,但是自定义的提示信息RuntimeException却没有带过来. throw new RuntimeException("不允许插入报价主项和报价子项同时重复的记录 ...