Codeforces 1208F - Bits And Pieces(高維字首和)
阿新 • • 發佈:2020-12-24
題意:求 \(\max\limits_{i<j<k}a_i|(a_j\&a_k)\)。
\(1\leq n \leq 10^6,1\leq a_i\leq 2\times 10^6\)
u1s1 這題算高維字首和裡不那麼 sb 的題,雖然程式碼也很簡單。
很容易想到一個貪心,從高到低列舉每一位,能填 \(1\) 就填 \(1\),不能填 \(1\) 就填 \(0\)。
於是本題轉化為一個問題:是否存在某個 \(i,j,k\) 使得 \(x\) 為 \(a_i|(a_j\&a_k)\) 的子集。列舉 \(a_i\) 包含 \(x\) 中的哪些位,然後貪心地取下標最小的 \(i\)
至於怎樣求下標最小的 \(i\) 和下標最大的 \(j,k\)。記 \(mn_x\) 為下標最小的包含 \(x\) 的 \(a_i\),\(mx_x\) 為下標最大的兩個包含 \(x\) 的 \(a_i\)。高位字首和隨便一搞就行了。
#include <bits/stdc++.h> using namespace std; #define fi first #define se second #define fz(i,a,b) for(int i=a;i<=b;i++) #define fd(i,a,b) for(int i=a;i>=b;i--) #define ffe(it,v) for(__typeof(v.begin()) it=v.begin();it!=v.end();it++) #define fill0(a) memset(a,0,sizeof(a)) #define fill1(a) memset(a,-1,sizeof(a)) #define fillbig(a) memset(a,63,sizeof(a)) #define pb push_back #define ppb pop_back #define mp make_pair template<typename T1,typename T2> void chkmin(T1 &x,T2 y){if(x>y) x=y;} template<typename T1,typename T2> void chkmax(T1 &x,T2 y){if(x<y) x=y;} typedef pair<int,int> pii; typedef long long ll; template<typename T> void read(T &x){ x=0;char c=getchar();T neg=1; while(!isdigit(c)){if(c=='-') neg=-1;c=getchar();} while(isdigit(c)) x=x*10+c-'0',c=getchar(); x*=neg; } const int MAXN=1e6; const int LOG_N=21; const int LIM=(1<<LOG_N)-1; int n,a[MAXN+5],tmp[4],mn[LIM+5]; pii mx[LIM+5]; pii merge(pii x,pii y){ tmp[0]=x.fi,tmp[1]=x.se,tmp[2]=y.fi,tmp[3]=y.se; sort(tmp,tmp+4);reverse(tmp,tmp+4);return mp(tmp[0],tmp[1]); } bool check(int x){ for(int i=x;i;i=(i-1)&x) if(mn[x^i]<mx[i].se) return 1; return (mn[x]<mx[0].se); } int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); memset(mn,63,sizeof(mn)); for(int i=1;i<=n;i++) mn[a[i]]=min(mn[a[i]],i); for(int i=1;i<=n;i++) mx[a[i]]=merge(mx[a[i]],mp(i,0)); for(int i=0;i<LOG_N;i++) for(int j=LIM;~j;j--) if(!(j>>i&1)){ mn[j]=min(mn[j],mn[j^(1<<i)]);mx[j]=merge(mx[j],mx[j^(1<<i)]); } int cur=0;for(int i=LOG_N;~i;i--) if(check(cur|(1<<i))) cur|=(1<<i); printf("%d\n",cur); return 0; }
上帝不要懲罰我刷水題(