zoukankan      html  css  js  c++  java
  • [ARC100]E:Or Plus Max(FZT)

    https://arc100.contest.atcoder.jp/tasks/arc100_c

    一个很自然的想法是,对于每个K求出i or j=k的所有a[i]+a[j]的最大值ans[k],答案就是ans[]的前缀最大值。

    但问题是很难快速找到所有i or j=k的a[i]+a[j]最大值,考虑换一个求法,变为:

    对于每个K求出$i or j subseteq k$的所有a[i]+a[j]的最大值ans[k],再输出前缀最大和。

    显然这两个问题是等价的,复杂度仅为$O(n2^n)$。

    这种方法题解上叫$Fast Zeta Transform$,感觉和FMT有很大的共同之处。

    另外再给一个类似FZT的例子:CF165E

    考虑x的答案,将x取反,那么能成为x的答案的数k一定满足$k subseteq x$,于是对于每个数都枚举包含它的集合即可。

     1 #include<cstdio>
     2 #include<algorithm>
     3 #define rep(i,l,r) for (int i=(l); i<=(r); i++)
     4 using namespace std;
     5 
     6 const int N=300010;
     7 int n,m,a[N],r[N],mx[N];
     8 
     9 int main(){
    10     scanf("%d",&m); int n=1<<m;
    11     for (int i=0; i<n; i++) scanf("%d",&a[i]);
    12     for (int i=0; i<n; i++)
    13         for (int j=i; j<n; j=(j+1)|i)
    14             r[j]=max(r[j],a[i]+mx[j]),mx[j]=max(mx[j],a[i]);
    15     for (int i=1; i<n; i++) printf("%d
    ",r[i]=max(r[i],r[i-1]));
    16     return 0;
    17 }
  • 相关阅读:
    柳下品茗
    游百花诗意亭有感
    爱情如酒
    笑傲IT文坛
    面对诱惑,你会屈从吗?
    拓展人脉的三十六计
    世界经理人推荐:拓展人脉的两大法宝
    我还能做什么
    诗缘
    有谁陪我风雨同舟
  • 原文地址:https://www.cnblogs.com/HocRiser/p/9287209.html
Copyright © 2011-2022 走看看