P2474 [SCOI2008]天平(dp或差分约束)
发布日期:2021-06-30 10:30:30 浏览次数:3 分类:技术文章

本文共 2028 字,大约阅读时间需要 6 分钟。

可以直接跑差分约束得到合法解的最小解和最大解…但是没有用,求不出方案数

考虑直接把变量看成两个砝码的差值

f [ i ] [ j ] f[i][j] f[i][j]表示 m a x ( w i − w j ) max(w_i-w_j) max(wiwj),令 g [ i ] [ j ] = m i n ( w i − w j ) g[i][j]=min(w_i-w_j) g[i][j]=min(wiwj)

看作一个 d p dp dp来求解

对于 + + +,有 w i − w j = 1 或 w i − w j = 2 w_i-w_j=1或w_i-w_j=2 wiwj=1wiwj=2

f [ i ] [ j ] = 2 ,      g [ i ] [ j ] = 1 f[i][j]=2,\ \ \ \ g[i][j]=1 f[i][j]=2,    g[i][j]=1

对于 − - ,令 f [ i ] [ j ] = − 1 f[i][j]=-1 f[i][j]=1, g [ i ] [ j ] = − 2 g[i][j]=-2 g[i][j]=2

对于 = = =,令 f [ i ] [ j ] = g [ i ] [ j ] = 0 f[i][j]=g[i][j]=0 f[i][j]=g[i][j]=0

对于 ? ? ?,令 f [ i ] [ j ] = 2 , g [ i ] [ j ] = − 2 f[i][j]=2,g[i][j]=-2 f[i][j]=2,g[i][j]=2

我们需要求 f f f每个变量的最大值,在这些约束之下求最短路

使用 f l o y d floyd floyd可以松弛 f , g f,g f,g数组

那么对于 A + B > C + D A+B>C+D A+B>C+D可以改写成 A − C > D − B A-C>D-B AC>DB

那么一定满足 g ( A , C ) > f ( D , B ) g(A,C)>f(D,B) g(A,C)>f(D,B),说明是一组合法的解

那么对于 A + B < C + D A+B<C+D A+B<C+D可以改写成 A − C < D − B A-C<D-B AC<DB

那么一定满足 f ( A , C ) < g ( D , B ) f(A,C)<g(D,B) f(A,C)<g(D,B),说明是一组合法的解

那么对于 A + B = = C + D A+B==C+D A+B==C+D可以改写成 A − C = = D − B A-C==D-B AC==DB

那么一定满足 f ( A , C ) = = g ( A , C ) = = f ( D , B ) = = g ( D , B ) f(A,C)==g(A,C)==f(D,B)==g(D,B) f(A,C)==g(A,C)==f(D,B)==g(D,B),说明是一组合法的解

所以直接枚举 C , D C,D C,D暴力判断即可

#include 
using namespace std;const int N = 55;int n,A,B,mi[N][N],mx[N][N];char a[N][N];int main(){
cin >> n >> A >> B; for(int i=1;i<=n;i++) cin >> ( a[i]+1 ); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) {
if( a[i][j]=='?' ) mi[i][j] = -2, mx[i][j] = 2; else if( a[i][j]=='+' ) mi[i][j] = 1, mx[i][j] = 2; else if( a[i][j]=='-' ) mi[i][j] = -2,mx[i][j] = -1; else if( a[i][j]=='=' ) mi[i][j] = mx[i][j] = 0; } for(int k=1;k<=n;k++) for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) {
mi[i][j] = max( mi[i][j],mi[i][k]+mi[k][j] ); mx[i][j] = min( mx[i][j],mx[i][k]+mx[k][j] ); } int ans1 = 0, ans2 = 0, ans3 = 0; for(int i=1;i<=n;i++) for(int j=1;j
C+D //A-C>D-B或者A-D>C-B if( mi[A][i]>mx[j][B] || mi[A][j]>mx[i][B] ) ans1++; //A+B

转载地址:https://issue-is-vegetable.blog.csdn.net/article/details/114491268 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:QT操作mysql数据库(创建,插入,更新,删除)
下一篇:Codeforces Round #705 (Div. 2)【A-D详细题解】

发表评论

最新留言

表示我来过!
[***.240.166.169]2024年04月23日 18时19分51秒