先考虑如何求出任意两数的最大差值和最小差值,直接差分约束建图跑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 }
