ICode9

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

「codeforces - 1208F」Bits and Pieces

2022-08-02 12:35:21  阅读:194  来源: 互联网

标签:1208F pii int max cap codeforces Bits dp first


link。

考虑把原问题写成一个在 \(\left(\log_2 \max v \right) \times n\) 的矩阵里选出三列,我们首先预处理出 \(j \cap q\)。具体,我们需要对于每一个权值 \(v\) 求出一个最大的下标 \(p\)(\(1 \leqslant p \leqslant n\))满足存在极大的 \(q < p\) 且 \(v \cap a_p \cap a_q = v\),即 \(v \subseteq \left(a_p \cap a_q\right)\),这个可以做一个二元组 dp,即设 \(f_v\) 为对于 \(v\) 而言的答案,注意到 \(p\) 和 \(q\) 的实际意义是「满足左右两边存在有一个位置做并操作后是 \(v\) 的超集的位置下标」的最大值和次大值,所以更新答案是容易的。

考虑如何转移。对于一个左闭右开区间 \([0, 2^n)\),我们分治求出 \([0, 2^{n-1})\) 和 \([2^{n-1}, 2^n)\) 的 dp,当然左边区间的 dp 值不会对右边区间产生影响,所以我们考虑右边区间对左边区间的影响。\(\forall i \in [l, m)\),我们需要从 \(i\) 的超集转移到 \(i\),因为在 dp 时我们实际上是把所有贡献放到一个点上,又注意到 \(i-l+m\) 和 \(i\) 的关系就是二进制意义下多了一个最高位的 \(1\),所以只需要从 \(i-l+m\) 转移到 \(i\) 即可(有点谜语,但就这样吧)。

然后就贪心取最高位,挨个取 max 就行了。

int n, a[1000100], qwq;
pii dp[3000100];
pii upd(const pii& x, const pii& y) {
  if (x.first > y.first) {
    return pii(x.first, max(y.first, x.second));
  }
  else {
    return pii(y.first, max(x.first, y.second));
  }
}
void sos_dp(int l, int r) {
  if (r-l == 1) {
    return;
  }
  int mid = (l+r)/2;
  sos_dp(l, mid), sos_dp(mid, r);
  for (int i=l; i<mid; ++i) {
    dp[i] = upd(dp[i], dp[i-l+mid]);
  }
}
signed main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cin >> n;
  for (int i=1; i<=n; ++i) {
    cin >> a[i];
    dp[a[i]] = upd(dp[a[i]], pii(i, 0));
  }
  qwq = 1;
  for (int up=*max_element(a+1, a+n+1); (1<<qwq) <= up;) {
    qwq++;
  }
  sos_dp(0, 1<<qwq);
  int ans = 0;
  for (int i=1; i<=n; ++i) {
    int offset = 0;
    bool f = 0;
    for (int j=qwq; j>=0; --j) {
      if (~(a[i]>>j)&1 && dp[offset|(1<<j)].second > i) {
        offset |= 1<<j, f = 1;
      }
    }
    if (dp[offset].second > i) {
      f = 1;
    }
    if (f) {
      cmax(ans, a[i]|offset);
    }
  }
  cout << ans << "\n";
}

标签:1208F,pii,int,max,cap,codeforces,Bits,dp,first
来源: https://www.cnblogs.com/orchid-any/p/16543332.html

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

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

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

ICode9版权所有