码迷,mamicode.com
首页 > 其他好文 > 详细

ARC100E. Or Plus Max

时间:2019-11-21 11:52:11      阅读:73      评论:0      收藏:0      [点我收藏+]

标签:amp   multiple   time   int   update   uniq   bit   inf   date   

题目

好题。没想出解法。
官方题解:
技术图片

这个解法和 Small Multiple 那道题的解法有异曲同工之妙。

代码

int main() {
  int n;
  scan(n);
  vi a(1 << n);
  scan(a);
  vpii b(1 << n);
  rng (i, 0, 1 << n) {
    b[i] = {i, -1};
  }
 
  auto cmp = [&](int x, int y) {
    if (x == y) return false;
    if (x == -1) return false;
    if (y == -1) return true;
    return a[x] > a[y];
  };
 
  auto update = [&](pii &a, pii b) {
    vi x{a.first, a.second, b.first, b.second};
    sort(all(x), cmp);
    UNIQ(x);
    a = {x[0], x[1]};
  };
 
  rng (i, 0, 1 << n) {
    rng (j, 0, n) {
      if (!get_bit(i, j)) {
        update(b[i | 1 << j], b[i]);
      }
    }
  }
 
  int ans = 0;
  rng (i, 1, 1 << n) {
    chkmax(ans, a[b[i].first] + a[b[i].second]);
    println(ans);
  }
 
  return 0;
}

Exec Time: 206 ms.

但是改成

int main() {
  int n;
  scan(n);
  vi a(1 << n);
  scan(a);
  vv<int> b(1 << n);
  rng (i, 0, 1 << n) {
    b[i] = {i};
  }
 
  auto cmp = [&](int x, int y) {
    return a[x] > a[y];
  };
 
  auto update = [&](vi &a, vi &b) {
    vi tmp = a;
    tmp.insert(tmp.end(), all(b));
    sort(all(tmp), cmp);
    UNIQ(tmp);
    a = {tmp[0], tmp[1]};
  };
 
  rng (i, 0, 1 << n) {
    rng (j, 0, n) {
      if (!get_bit(i, j)) {
        update(b[i | 1 << j], b[i]);
      }
    }
  }
  
  int ans = 0;
  rng (i, 1, 1 << n) {
    chkmax(ans, a[b[i][0]] + a[b[i][1]]);
    println(ans);
  }

  return 0;
}

Exec Time 416 ms.

仅仅是把pair<int,int>改为vector<int>,为何二者运行时间悬殊?

ARC100E. Or Plus Max

标签:amp   multiple   time   int   update   uniq   bit   inf   date   

原文地址:https://www.cnblogs.com/Patt/p/11904401.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!