BZOJ.4245.[ONTAK2015]OR-XOR(貪心)
阿新 • • 發佈:2018-10-09
main n) xor 前綴和 端點 strong fin class typedef
題目鏈接
從高到低位貪心,判斷答案的該位能否為0。
求一個前綴和sum。對於最高位,答案的這一位可以為0當且僅當至少存在m個位置滿足sum[i]在這一位上為0。
註意sum[n]這一位必須為0。
如果確定高位為0,則高位為1的sum[i]就不能再選(即不能做右端點)。
這樣求一遍所有位即可。復雜度\(O(n\log a)\)。
//5508kb 768ms #include <cstdio> #include <cctype> #include <algorithm> //#define gc() getchar() #define MAXIN 300000 #define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++) typedef long long LL; const int N=5e5+5; const LL LIM=(1ll<<61)-1ll; int n,m; bool ban[N]; LL sum[N]; char IN[MAXIN],*SS=IN,*TT=IN; inline LL read() { LL now=0;register char c=gc(); for(;!isdigit(c);c=gc()); for(;isdigit(c);now=now*10+c-'0',c=gc()); return now; } bool OK(int bit) { if(sum[n]>>bit&1) return 0; int cnt=0; for(int i=1; i<=n; ++i) if(!ban[i]&&!(sum[i]>>bit&1)) if(++cnt==m) break; if(cnt<m) return 0; for(int i=1; i<=n; ++i) if(sum[i]>>bit&1) ban[i]=1; return 1; } int main() { n=read(),m=read(); for(int i=1; i<=n; ++i) sum[i]=sum[i-1]^read(); if(m==1) return printf("%lld\n",sum[n]),0; LL ans=0; for(int i=60; ~i; --i) if(!OK(i)) ans|=1ll<<i; printf("%lld\n",ans); return 0; }
BZOJ.4245.[ONTAK2015]OR-XOR(貪心)