sicily 1375 Balanced lineup

    题目地址:http://soj.me/1375

    题目分类中说是要考察的哈希的,但是我却没看出怎么要考察哈希,我的想法是把Id(原文中id为0和1,为了统计数量一样把0转为-1,这样只要他们的和为0,就表示一样多了)和x坐标封装成一个结构体,然后按坐标对结构体进行排序,接着以每个点为起点,找到和为0的那一段的横坐标相差的最大值(PS:要找和为0的那一段,可以求出前缀和sum[i],如果sum[i] = sum[j],则i~j这一段的和为0,如果求出了前缀和,只需O(n)的时间就可以找出j-i的最大值,请参考这里:http://soj.me/viewsource.php?sid=1278111,看了代码之后,发现这种做法可能会出现溢出,但的确不失为一种好方法),附上我的O(n^2)复杂度的代码吧:

#include 
#include 
#define MAX 50001
using namespace std;
struct Node {
  int ps;
  int value;
};
Node array[MAX];
int sum[MAX] = {0};
int max_[MAX] = {0};
bool cmp(Node a, Node b) {
  return a.ps < b.ps;
}
int main() {
  int n;
  cin >> n;
  for (int i = 0; i < n; i++) {
    int value_, ps_;
    cin >> value_ >> ps_;
    if (value_)
      array[i].value = value_;
    else
      array[i].value = -1;
    array[i].ps = ps_;
  }
  sort(array, array+n, cmp);
  for (int i = 0; i < n; i++) {
    for (int j = i; j < n; j++) {
      sum[i] += array[j].value;
      if (sum[i] == 0)
        max_[i] = array[j].ps - array[i].ps;
    }
  }
  int m = -100000;
  for (int i = 0; i < n; i++)
    if (m < max_[i])
      m = max_[i];
  cout << m << endl;
  //stem("pause");
  return 0;
}


你可能感兴趣的:(Sicily,Sicily,1375,Balanced)