ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[SCOI2008]天平

2022-01-29 15:35:39  阅读:112  来源: 互联网

标签:le min int max 天平 ne SCOI2008 砝码


本题加深了对差分约束的理解,并不是绝对的模板题目,但是其核心还是最短路/最长路

砝码间的关系

  1. \(i<j\): 由此可以得到\(1\le i+1\le j\le 3\),即\(1\le j-i\le 2\)

  2. \(i=j\): \(j-i=0\)

  3. \(i>j\): \(-1\le j-i\le -2\)

  4. \(i\)和\(j\)关系未知: \(-2\le j-i\le 2\)

得到砝码之间的所有关系后,我们可以建图,跑最短路和最长路,从而确定砝码的上下界

天平两边的关系

\(A+B<C_i+D_J(i\ne j)\)

通过变换,可以得到两个不等式关系:

\(A-C_i<D_j-B\)和\(A-D_j<C_i-B\)

若想这两个式子恒成立,那么必定满足\(\max(A-C_i)<\min(D_j-B)\)或\(\max(A-D_j)<min(C_i-B)\),统计符合条件的情况即可

\(A+B=C_i+D_J(i\ne j)\)

类似上面的形式,统计满足\(\max(A-C_i)=\min(A-C_i)=\max(D_j-B)=\min(D_j-B)\)或\(\max(A-D_j)=\min(A-D_j)=\max(C_i-B)=\min(C_i-B)\)的情况

\(A+B>C_i+D_J(i\ne j)\)

同理,统计满足\(\min(A-C_i)>\max(D_j-B)\)或\(\min(A-D_j)>\max(C_i-B)\)的情况

代码

#include <bits/stdc++.h>
using namespace std;

inline void Max(int &a, int b) { a = a > b ? a : b; }
inline void Min(int &a, int b) { a = a < b ? a : b; }

constexpr int N = 55;
int maxd[N][N], mind[N][N];
int n, a, b;
char s[N];

int main() {
  scanf("%d%d%d", &n, &a, &b);

  for (int i = 1; i <= n; i++) {
    scanf("%s", s + 1);
    for (int j = 1; j <= n; j++) 
      if (s[j] == '+') {
        maxd[i][j] = 2;
        mind[i][j] = 1;
      } else if (s[j] == '-') {
        maxd[i][j] = -1;
        mind[i][j] = -2;
      } else if (s[j] == '=' or i == j){
        maxd[i][j] = 0;
        mind[i][j] = 0;
      } else {
        maxd[i][j] = 2;
        mind[i][j] = -2;
      }
  }

  for (int k = 1; k <= n; k++)
    for (int i = 1; i <= n; i++) {
      for (int j = 1; j <= n; j++) {
        Min(maxd[i][j], maxd[i][k] + maxd[k][j]);
        Max(mind[i][j], mind[i][k] + mind[k][j]);
      }
    }
  int c[3] = {0};

  for (int i = 1; i <= n; i++) {
    if (i == a or i == b) continue;
    for (int j = 1; j < i; j++) {
      if (j == a or j == b) continue;
      c[0] += maxd[j][b] < mind[a][i] or maxd[i][b] < mind[a][j];
      c[1] += 
        (maxd[a][i] == mind[a][i] and 
         maxd[j][b] == mind[j][b] and 
         maxd[a][i] == mind[j][b]) or 
        (maxd[a][j] == mind[a][j] and 
         maxd[i][b] == mind[i][b] and 
         maxd[a][j] == mind[i][b]);
      c[2] += maxd[a][i] < mind[j][b] or maxd[a][j] < mind[i][b];
    }
  }

  for (int i : c) printf("%d ", i);

  return 0;
}

标签:le,min,int,max,天平,ne,SCOI2008,砝码
来源: https://www.cnblogs.com/FrankOu/p/15855155.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有