Advertisement
Dang_Quan_10_Tin

VOPIG

Dec 9th, 2020
223
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.51 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cmath>
  4. #include <cstring>
  5. #include <algorithm>
  6. #include <map>
  7. #define bit(i, x) (((x) >> (i)) & 1)
  8. #define task ""
  9.  
  10. using namespace std;
  11. using ll = long long;
  12.  
  13. const int N = 2e6 + 2;
  14. ll n, m, a[N];
  15. int Sub, maxn, dp[65][2];
  16. int dp3[5003];
  17. int dp4[N];
  18. bool ck[N];
  19.  
  20. void Read(){
  21.     cin >> n >> m;
  22.     if(n >= 1e9){
  23.         if(m == (1ll << 60) - 1)
  24.             Sub = 1;
  25.         else
  26.             Sub = 2;
  27.     }
  28.     else{
  29.         for(int i = 1; i <= n; ++i)
  30.             cin >> a[i];
  31.         if(n <= 5000)
  32.             Sub = 3;
  33.         else
  34.             Sub = 4;
  35.     }
  36. }
  37.  
  38. int f(int i, bool ok){
  39.     if(i < 0) return 0;
  40.     if(dp[i][ok] != -1) return dp[i][ok];
  41.     dp[i][ok] = 0;
  42.     dp[i][ok] = max(dp[i][ok], f(i - 1, ok || bit(i, n) == 1));
  43.     if(ok || bit(i, n) == 1) dp[i][ok] = max(dp[i][ok], f(i - 1, ok) + 1);
  44.     return dp[i][ok];
  45. }
  46.  
  47. void Sub_1(){
  48.     maxn = log2(n);
  49.     memset(dp, -1, sizeof dp);
  50.     cout << f(maxn, 0);
  51. }
  52.  
  53. void Sub_2(){
  54.  
  55. }
  56.  
  57. void Sub_3(){
  58.     for(int i = 1; i <= n; ++i)
  59.         a[i] &= m;
  60.     sort(a + 1, a + n + 1);
  61.     int ans(0);
  62.     for(int i = 1; i <= n; ++i){
  63.         for(int j = 0; j < i; ++j)
  64.             if((a[i] & a[j]) == a[j])
  65.                 dp3[i] = max(dp3[i], dp3[j] + 1);
  66.         ans = max(ans, dp3[i]);
  67.     }
  68.     cout << ans;
  69. }
  70.  
  71. template<class T>
  72. inline void Maximize(T &x, T y){
  73.     if(x < y) x = y;
  74. }
  75.  
  76. void Standard(ll &x){
  77.     ll v = x;
  78.     x = 0;
  79.     int j = 0;
  80.     for(int i = 0; i < 30; ++i)
  81.         if(bit(i, m)){
  82.             x |= (bit(i, v)) << j;
  83.             ++j;
  84.         }
  85. }
  86.  
  87. void Sub_4(){
  88.     for(int i = 1; i <= n; ++i){
  89.         a[i] &= m;
  90.         Standard(a[i]);
  91.         ck[a[i]] = 1;
  92.     }
  93.     for(int i = 1; i < (1 << 20); ++i)
  94.         if(!ck[i])
  95.             a[++n] = i;
  96.     sort(a + 1, a + n + 1);
  97.     int ans(0);
  98.     for(int i = 0; i <= n; ++i){
  99.         if(ck[a[i]]) Maximize(ans, dp4[a[i]]);
  100.         for(int j = 0; j < 20; ++j)
  101.             if(!bit(j, a[i]))
  102.                 Maximize(dp4[a[i] | (1 << j)], dp4[a[i]] + ck[a[i] | (1 << j)]);
  103.         if(ck[a[i]])
  104.             ++dp4[a[i]];
  105.     }
  106.     cout << ans;
  107. }
  108.  
  109. int32_t main(){
  110.     if(fopen(task".INP", "r")){
  111.         freopen(task".INP", "r", stdin);
  112.     freopen(task".OUT", "w", stdout);
  113.     }
  114.     ios_base::sync_with_stdio(0);
  115.     cin.tie(0);
  116.     cout.tie(0);
  117.     Read();
  118.     if(Sub == 1) Sub_1();
  119.     else if(Sub == 2) Sub_2();
  120.     else if(Sub == 3) Sub_3();
  121.     else Sub_4();
  122. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement