传送门

今天\(PKUWC\)试机的题

看着边上的大佬们一个个\(A\)穿咱还是不会……

我们考虑枚举最大前缀和,如果一个前缀\(1\)到\(p\)是最大前缀和,那么\(p\)后面的所有前缀和都要小于\(0\)

于是我们设\(sum_S\)为子集\(S\)中所有元素的和,\(f_S\)为满足最大前缀和为\(sum_S\)的\(S\)的排列个数,那么我们可以枚举这个排列中位于第一个的数,只要剩下的数之和\(sum_{S-\{x\}}\)大于\(0\),那么\(f_S\)就可以加上\(f_{S-\{x\}}\)

然后设\(g_S\)为满足最大前缀和小于\(0\)的\(S\)的排列个数,和上面差不多,只要枚举位于最后的元素是哪个就行了

  1. //minamoto
  2. #include<bits/stdc++.h>
  3. #define R register
  4. #define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
  5. #define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
  6. inline int max(const R int &x,const R int &y){return x>y?x:y;}
  7. inline int min(const R int &x,const R int &y){return x<y?x:y;}
  8. using namespace std;
  9. char buf[1<<21],*p1=buf,*p2=buf;
  10. inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
  11. int read(){
  12. R int res=1,f=1;R char ch;
  13. while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
  14. for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
  15. return res*f;
  16. }
  17. const int N=(1<<20)+5,P=998244353;
  18. inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
  19. inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
  20. inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
  21. int ksm(R int x,R int y){
  22. R int res=1;
  23. for(;y;y>>=1,x=mul(x,x))if(y&1)res=mul(res,x);
  24. return res;
  25. }
  26. int f[N],g[N],sum[N],a[N];
  27. int n,res,lim;
  28. int main(){
  29. n=read(),lim=(1<<n)-1;
  30. fp(i,0,n-1)a[1<<i]=read();
  31. fp(i,1,lim)sum[i]=sum[i^(i&-i)]+a[i&-i];
  32. g[0]=1;
  33. fp(i,0,lim)if(sum[i]<=0){
  34. R int j=i;
  35. while(j)g[i]=add(g[i],g[i^(j&-j)]),j^=j&-j;
  36. }
  37. fp(i,0,n-1)f[1<<i]=1;
  38. fp(i,0,lim){
  39. if(sum[i]>0){
  40. R int j=lim^i;
  41. while(j)f[i|(j&-j)]=add(f[i|(j&-j)],f[i]),j^=j&-j;
  42. }
  43. // printf("%d %d\n",i,f[i]);
  44. res=add(res,1ll*f[i]*(sum[i]+P)%P*g[lim^i]%P);
  45. }
  46. printf("%d\n",res);
  47. return 0;
  48. }

loj#6433. 「PKUSC2018」最大前缀和(状压dp)的更多相关文章

  1. LOJ 6433 「PKUSC2018」最大前缀和——状压DP

    题目:https://loj.ac/problem/6433 想到一个方案中没有被选的后缀满足 “该后缀的任一前缀和 <=0 ”. 于是令 dp[ S ] 表示选了点集 S ,满足任一前缀和 & ...

  2. LOJ#6433. 「PKUSC2018」最大前缀和 状压dp

    原文链接https://www.cnblogs.com/zhouzhendong/p/LOJ6433.html 题解 枚举一个集合 S ,表示最大前缀和中包含的元素集为 S ,然后求出有多少个排列是这 ...

  3. loj 6433 「PKUSC2018」最大前缀和 题解【DP】【枚举】【二进制】【排列组合】

    这是个什么集合DP啊- 想过枚举断点但是不会处理接下来的问题了- 我好菜啊 题目描述 小 C 是一个算法竞赛爱好者,有一天小 C 遇到了一个非常难的问题:求一个序列的最大子段和. 但是小 C 并不会做 ...

  4. Loj 6433. 「PKUSC2018」最大前缀和 (状压dp)

    题面 Loj 题解 感觉挺难的啊- 状压\(dp\) 首先,有一个性质 对于一个序列的最大前缀和\(\sum_{i=1}^{p} A[i]\) 显然对于每个\(\sum_{i=p+1}^{x}A[i] ...

  5. Loj#6433「PKUSC2018」最大前缀和(状态压缩DP)

    题面 Loj 题解 先转化题意,其实这题在乘了\(n!\)以后就变成了全排列中的最大前缀和的和(有点拗口).\(n\leq20\),考虑状压\(DP\) 考虑一个最大前缀和\(\sum\limits_ ...

  6. [LOJ #6433]「PKUSC2018」最大前缀和

    题目大意:给你一个$n(n\leqslant20)$项的数列$A$,设重排后的数列为$A'$,令$pre_p=\sum\limits_{i=1}^pA'_i$,求$max\{pre_i\}$的期望,乘 ...

  7. 【LOJ】#6433. 「PKUSC2018」最大前缀和

    题解 神仙的状压啊QAQ 设一个\(f[S]\)表示数字的集合为\(S\)时\(sum[S]\)为前缀最大值的方案数 \(g[S]\)表示数字集合为\(S\)时所有前缀和都小于等于0的方案数 答案就是 ...

  8. loj2540 「PKUWC2018」随机算法 【状压dp】

    题目链接 loj2540 题解 有一个朴素三进制状压\(dp\),考虑当前点三种状态:没考虑过,被选入集合,被排除 就有了\(O(n3^{n})\)的转移 但这样不优,我们考虑优化状态 设\(f[i] ...

  9. BZOJ1688 「USACO05OPEN」Disease Manangement 背包+状压DP

    问题描述 BZOJ1688 题解 背包,在转移过程中使用状压. \(\mathrm{Code}\) #include<bits/stdc++.h> using namespace std; ...

随机推荐

  1. VS2013修改resource之后产生designer1.cs

    1. Unload project2. Edit the csproj file.3. Search for <LastGenOutput>test1.Designer.cs</La ...

  2. css3加载spinner

    使用代码制作一个加载旋转器spinner 实现的原理是: 1.两个圆圈,其中一个圆圈是使用pseudo元素(:before)产生 2.由pseudo元素生成的圆通过负数的z-index而作用在下面 3 ...

  3. 12 Python 函数

    初识函数定义与调用 定义:def 关键词开头,空格之后接函数名称和圆括号(),最后还有一个":". def 是固定的,不能变,必须是连续的def三个字母,不能分开...它们要相亲相 ...

  4. 51nod 1829(函数)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1829 本题目相当于: n个不同的小球,放入到m个可区分的盒子 ...

  5. 使用Chrome采集摄像头并生成视频下载

    主要使用2个技术点:WebRtc 的 getUserMedia 和 MediaRecorder 注意点 开始录制调用 start 方法要传入一个采样间隔,这样录制的媒体会按照你设置的值进行分割成一个个 ...

  6. Convolutional Neural Networks for Visual Recognition 8

    Convolutional Neural Networks (CNNs / ConvNets) 前面做了如此漫长的铺垫,现在终于来到了课程的重点.Convolutional Neural Networ ...

  7. [原]NYOJ-房间安排168

    大学生程序代写 /*房间安排 时间限制:3000 ms  |  内存限制:65535 KB 难度:2 描述 2010年上海世界博览会(Expo2010),是第41届世界博览会.于2010年5月1日至1 ...

  8. 浅谈Huffman树

    所谓Huffman树,就是叶子结点带权的\(K\)叉树,假设每个叶子的权值为\(v\),到根的距离为\(dep\),那么最小化\(\sum v_i*dep_i\)就是\(Huffman\)树的拿手好戏 ...

  9. POJ2069:Super Star

    我对模拟退火的理解:https://www.cnblogs.com/AKMer/p/9580982.html 我对爬山的理解:https://www.cnblogs.com/AKMer/p/95552 ...

  10. UILabel UiButton 文字下面加下划线

    NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:@"直接进入" ...