sicily 1375 Balanced lineup

来源:互联网 发布:瑙鲁域名 编辑:程序博客网 时间:2024/06/16 21:10

    题目地址: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 <iostream>#include <algorithm>#define MAX 50001using 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;}


0 0