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