ARC-100 E - Or Plus Max
阿新 • • 發佈:2018-07-02
def pan AI har TP test pos HR LV
題面在這裏!
我們如果可以求出 f[x] = max{ a[i] + a[j] , i!=j && i or j == x},那麽就可以通過前綴max直接遞推答案了。
但是這個玩意不是很好求QWQ
不過 g[x] = max{ a[i] + a[j] , i!=j && i or x == x && j or x == x} 比較好求,並且通過前綴max g[] 可以得到和 前綴max f[] 一樣的效果 (因為真子集只會更小),所以我們直接FMT求出 g[]然後前綴Max直接做就行了23333.
如果沒有i!=j的話是可以不用FMT,但是有的話求最大和次大就需要保證路徑單一性,就得用FMT拉QWQ
#include<bits/stdc++.h> #define ll long long using namespace std; const int N=300005; inline int read(){ int x=0; char ch=getchar(); for(;!isdigit(ch);ch=getchar()); for(;isdigit(ch);ch=getchar()) x=x*10+ch-‘0‘; return x; } void W(int x){ if(x>=10) W(x/10); putchar(x%10+‘0‘);} int n,a[N],c[N],l,ans[N]; inline void update(int pos,int val){ if(val>a[pos]) c[pos]=a[pos],a[pos]=val; else if(val>c[pos]) c[pos]=val; } inline void solve(){ for(int i=0,to;i<l;i++) for(int j=0;j<n;j++) if(!((1<<i)&j)){ to=j|(1<<i); update(to,a[j]); update(to,c[j]); } } int main(){ scanf("%d",&n),l=n,n=1<<n; for(int i=0;i<n;i++) a[i]=read(),c[i]=0; solve(); for(int i=1;i<n;i++){ ans[i]=max(ans[i-1],a[i]+c[i]); W(ans[i]),puts(""); } return 0; }
ARC-100 E - Or Plus Max