首页 > 其他分享 >Compatible Numbers

Compatible Numbers

时间:2023-08-07 18:47:49浏览次数:46  
标签:int 构造 Compatible cdots Numbers 互换 dp

Compatible Numbers

思路

对于一个数 \(x\),如果想要构造一个数 \(y\) 使得 \(x \& y = 0\) 那么显然对于 \(x\) 的每一位:

  1. 如果当前位是 0,那么 \(y\) 这一位可以填 \(1,0\)
  2. 如果当前位是 1,那么 \(y\) 这一位可以填 \(0\)

那么对于用这种方式构造出来的数的一些位是可以互换的,而互换后的数显然也是满足要求的,所以问题就变成了,\(a_1,a_2,a_3,\cdots\cdots,a_n\),通过一些位的互换是否可以换成用上面的方法构造出来的数。

对于两个用上面的方法构造出来的数,如果较小的那个能够用互换来换成,那么较大的那个肯定也可以换出来(只要将一些本来是 0 的位置换成 1 即可,不会有后效性),那么我们就可以判断说通过上面大方法构造出来的数的最大值,是否可以被 \(a_1, a_2, a_3, \cdots\cdots,a_n\) 中的任意一个数通过一些位的互换换出,那么要构造出最大值其实就是按位取反。

然后对于每一个数,我们把它看成二进制,搜索每一位是否换,然后换后得出的新数标记是否存在,最后对每个数按位取反后判是否曾经换出来了即可。

然后搜索部分是可以用 dp 来实现的,所以将搜索换成 dp 即可。

code

点击查看代码
#include <iostream>

using namespace std;

const int MaxN = 1e6 + 10, MaxM = 9e6 + 10;

int dp[MaxM], a[MaxN], n;

int main() {
  ios::sync_with_stdio(0), cin.tie(0);
  cin >> n;
  for (int i = 1; i <= n; i++) {
    cin >> a[i], dp[a[i]] = a[i];
  }
  for (int i = 0; i < MaxM; i++) { 
    if (dp[i]) {
      for (int j = 0; (1 << j) < MaxM; j++) {
        if (!(i & (1 << j)) && (i | (1 << j)) < MaxM) {
          dp[(i | (1 << j))] = max(dp[(i | (1 << j))], dp[i]);
        }
      }
    }
  }
  for (int i = 1; i <= n; i++) {
    cout << (dp[(1 << 22) - 1 - a[i]] ? dp[(1 << 22) - 1 - a[i]] : -1) << " ";
  }
  return 0;
}

标签:int,构造,Compatible,cdots,Numbers,互换,dp
From: https://www.cnblogs.com/ybtarr/p/17612410.html

相关文章

  • CF449D Jzzhu and Numbers
    有一个很蠢但是很好写的做法。就是你先令\(t_i\)为与起来恰好为\(i\)的方案数,然后\(g_i\)为与起来子集中有\(i\)的方案数。然后\(g_S=\sum\limits_{T\subseteqS}t_T\),反演一下变成\(t_{S}=\sum\limits_{T\subseteqS}(-1)^{|S|-|T|}g_{T}\)。注意到可以\(O(w)\)枚......
  • CF1808C Unlucky Numbers 题解
    可以证明答案是\(l\)或\(r\)的一段前缀,拼上后面全部相同的一段字符\(d\),证明方式类似数位dp。能够自由填的数字一定是相等的,这样不会影响幸运值。前面那些不能自由填写的,就是\(l\)或\(r\)的一段前缀。假如不是\(l\)或\(r\)的一段前缀,必然填写相等的更好,而这种情况已......
  • 题解 CF1842H【Tenzing and Random Real Numbers】
    看了题解。好难受,想用积分求概率,算了半天。发现没啥规律,不是不能算,就是太可怕了。Problem有\(n\)个\([0,1]\)范围内的均匀随机变量\(x_{1\cdotsn}\)和\(m\)条限制,每条限制形如\(x_i+x_j\le1\)或\(x_i+x_j\ge1\)。请你求出所有限制均满足的概率。对\(998244353\)......
  • PROPERTIES OF SQUARE NUMBERS
     Whenanumberismultipliedbyitself,theresultingnumberiscalledasasquarenumber. Forexample,whenwemultiply5by5,weget52 =25.Here,25isasquarenumber.Ingeometry,theareaofasquareisthefinestexampleofasquarenumber.Are......
  • PAT (Advanced Level)_1100 Mars Numbers (20分)(C++_模拟)
    PeopleonMarscounttheirnumberswithbase13:ZeroonEarthiscalled"tret"onMars.Thenumbers1to12onEarthiscalled"jan,feb,mar,apr,may,jun,jly,aug,sep,oct,nov,dec"onMars,respectively.Forthenexthigherdigi......
  • Educational Codeforces Round 150 (Rated for Div. 2) C. Ranom Numbers
    #include<iostream>#include<string>#include<cstring>#include<algorithm>#include<cmath>usingnamespacestd;constintN=2e5+10;typedeflonglongll;//记录每个字母的最前面的位置和最后面的位置intFast[5],End[5];strings,c;llres=-0x3......
  • CodeForces 1841C Ranom Numbers
    洛谷传送门CF传送门先反转\(s\)串,然后考虑dp,设\(f_{i,j,0/1}\)为考虑了\([1,i]\),前缀最大值为\(j\),是否修改过字符的最大得分。转移讨论是否在这个位置修改即可。时间复杂度\(O(n)\)。code//Problem:C.RanomNumbers//Contest:Codeforces-Educational......
  • 【pyqt】报错TypeError: decorated slot has no signature compatible with RecorderP
    一、场景  运行pyqt报错TypeError:decoratedslothasnosignaturecompatiblewithRecorderPlayerProxy.sig_mode_update[object] 二、代码@Slot(int)defupdate_mode(self,mode):...... 三、解决方法  将int去除即可  参考链接:p......
  • Codeforces Round #232 (Div. 2)-B. On Corruption and Numbers
    原题链接B.OnCorruptionandNumberstimelimitpertestmemorylimitpertestinputoutputAlexey,amerryBerlandentrant,gotsickofthegrayrealityandhezealouslywa......
  • django 中存储手机号的字段, 使用 Django 库 pip install django-phonenumber-field[ph
    原文参见:https://www.delftstack.com/zh/howto/django/django-phone-number-field/使用第三方Django应用程序的 PhoneNumberField 存储电话号码要存储电话号码,我们可以使用实现此字段的第三方Django应用程序或库:PhoneNumberField。你可以在此处找到此库或应用程序的Git......