[bzoj1077]天平

先考虑如何求出任意两数的最大差值和最小差值,直接差分约束建图跑floyd求最短路和最长路即可
然后枚举i和j,考虑dA+dB和di+dj的关系,分两种情况移项,转化成dA-di和dj-dB的关系或dA-dj和di-dB的关系(只要有一个关系确定即确定)即可考虑(由于不等式都是两个变量,因此一定无法形成dA-dj和dB-di的固定关系)

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,x,y,c1,c2,c3,mx[105][105],mn[105][105];
 4 char s[105];
 5 int main(){
 6     scanf("%d%d%d",&n,&x,&y);
 7     x--;
 8     y--;
 9     for(int i=0;i<n;i++){
10         scanf("%s",s);
11         for(int j=0;j<n;j++){
12             mx[i][j]=2;
13             mn[i][j]=-2;
14             if (s[j]=='+')mn[i][j]=1;
15             if (s[j]=='-')mx[i][j]=-1;
16             if ((i==j)||(s[j]=='='))mx[i][j]=mn[i][j]=0;
17         }
18     }
19     for(int i=0;i<n;i++)
20         for(int j=0;j<n;j++)
21             for(int k=0;k<n;k++){
22                 mn[j][k]=max(mn[j][k],mn[j][i]+mn[i][k]);
23                 mx[j][k]=min(mx[j][k],mx[j][i]+mx[i][k]);
24             }
25     for(int i=0;i<n;i++)
26         for(int j=0;j<i;j++){
27             if ((i==x)||(i==y)||(j==x)||(j==y))continue;
28             if ((mn[x][i]>mx[j][y])||(mn[x][j]>mx[i][y]))c1++;
29             if ((mx[x][i]<mn[j][y])||(mx[x][j]<mn[i][y]))c3++;
30             if ((mx[x][i]==mn[x][i])&&(mx[j][y]==mn[j][y])&&(mx[x][i]==mx[j][y])||
31                 (mx[x][j]==mn[x][j])&&(mx[i][y]==mn[i][y])&&(mx[x][j]==mx[i][y]))c2++;
32         }
33     printf("%d %d %d",c1,c2,c3);
34 }
View Code
原文地址:https://www.cnblogs.com/PYWBKTDA/p/11797740.html