luoguP6622 [省选联考 2020 A/B 卷] 信号传递(状压dp)

Luogu

题外话:

我可能是傻逼,

但不管我是不是傻逼,

我永远单挑出题人。

题解时间

看数据范围可以确定状压dp。

$ dp[s] $ 表示s集合去代替前几个数的话现有部分的最小结果。

将数组转化成数字之间的带权图,预处理集合和点之间的单向边数量就能解决。

对于一对相邻的转化完之后数 $ a,b $ ,贡献为

\[-a+b(a<b)\\
ka+kb(a>b)
\]

由此状压dp得出解。

时间复杂度实际上比 $ O( m 2^{m} ) $ 低的多可以过,

但这样由于空间限制只有70pts:

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. using namespace std;
  5. typedef long long lint;
  6. template<typename TP>inline void read(TP &tar)
  7. {
  8. TP ret=0,f=1;char ch=getchar();
  9. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  10. while(ch>='0'&&ch<='9'){ret=ret*10+(ch-'0');ch=getchar();}
  11. tar=ret*f;
  12. }
  13. namespace RKK
  14. {
  15. const int N=21,S=1<<21;
  16. int n,m,c,ful;
  17. int lb[S],cb[S];
  18. int a[100011];
  19. int mg[N][N],mp[S][N],mn[N][S];
  20. int dp[S];
  21. int main()
  22. {
  23. read(n),read(m),read(c),ful=1<<m;
  24. for(int i=1;i<ful;i++) lb[i]=(i&1)?0:lb[i>>1]+1,cb[i]=cb[i>>1]+(i&1);
  25. for(int i=1;i<=n;i++) read(a[i]),a[i]--;
  26. for(int i=2;i<=n;i++) mg[a[i-1]][a[i]]++;
  27. for(int i=0;i<m;i++)for(int s=1;s<ful;s++)
  28. {
  29. mp[s][i]=mp[s^(s&-s)][i]+mg[lb[s]][i];
  30. mn[i][s]=mn[i][s^(s&-s)]+mg[i][lb[s]];
  31. }
  32. memset(dp,0x3f,sizeof(dp)),dp[0]=0;
  33. for(int s=1,t=s,i,ss,su;s<ful;s++,t=s)
  34. {
  35. while(t)
  36. {
  37. i=lb[t],t^=(t&-t),ss=s^(1<<i),su=(ful-1)^s;
  38. dp[s]=min(dp[s],dp[ss]+cb[s]*(mp[ss][i]+c*mn[i][ss]-mn[i][su]+c*mp[su][i]));
  39. }
  40. }
  41. printf("%d\n",dp[ful-1]);
  42. return 0;
  43. }
  44. }
  45. int main(){return RKK::main();}

稍微(确信)改造一下,让上面预处理出来的连边值随着dp不断更新就能解决空间问题。

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. using namespace std;
  5. typedef long long lint;
  6. template<typename TP>inline void read(TP &tar)
  7. {
  8. TP ret=0,f=1;char ch=getchar();
  9. while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
  10. while(ch>='0'&&ch<='9'){ret=ret*10+(ch-'0');ch=getchar();}
  11. tar=ret*f;
  12. }
  13. namespace RKK
  14. {
  15. const int N=23,S=1<<23;
  16. int n,m,c,ful;
  17. int lb[S],cb[S];
  18. int a[100011];
  19. int mn[N][N],mp[N][N],lst[N][N],nw[N];
  20. int dp[S];
  21. int main()
  22. {
  23. read(n),read(m),read(c),ful=1<<m;
  24. for(int i=1;i<ful;i++) lb[i]=(i&1)?0:lb[i>>1]+1,cb[i]=cb[i>>1]+(i&1);
  25. for(int i=1;i<=n;i++) read(a[i]),a[i]--;
  26. for(int i=2;i<=n;i++)if(a[i]!=a[i-1])
  27. mn[a[i-1]][a[i]]+=-1,mn[a[i]][a[i-1]]+=c,
  28. mp[a[i]][a[i-1]]+=1,mp[a[i-1]][a[i]]+=c;
  29. for(int i=0;i<m;i++)
  30. {
  31. for(int j=0;j<m;j++) lst[i][j]=mn[i][j]-mp[i][j],nw[i]+=mn[i][j];
  32. for(int j=1;j<m;j++) lst[i][j]+=lst[i][j-1];
  33. }
  34. memset(dp,0x3f,sizeof(dp)),dp[0]=0;
  35. for(int s=0,t,i;s<ful-1;s++)
  36. {
  37. if(s)for(i=0;i<m;i++) nw[i]+=mp[i][lb[s]]-mn[i][lb[s]];
  38. if(lb[s])for(i=0;i<m;i++) nw[i]+=lst[i][lb[s]-1];
  39. t=(ful-1)^s;while(t)
  40. {
  41. i=lb[t],t^=t&-t;
  42. dp[s|(1<<i)]=min(dp[s|(1<<i)],dp[s]+nw[i]*cb[s|(1<<i)]);
  43. }
  44. }
  45. printf("%d\n",dp[ful-1]);
  46. return 0;
  47. }
  48. }
  49. int main(){return RKK::main();}

luoguP6622 [省选联考 2020 A/B 卷] 信号传递(状压dp)的更多相关文章

  1. 题解 P6622 [省选联考 2020 A/B 卷] 信号传递

    洛谷 P6622 [省选联考 2020 A/B 卷] 信号传递 题解 某次模拟赛的T2,考场上懒得想正解 (其实是不会QAQ), 打了个暴力就骗了\(30pts\) 就火速溜了,参考了一下某位强者的题 ...

  2. luoguP6619 [省选联考 2020 A/B 卷]冰火战士(线段树,二分)

    luoguP6619 [省选联考 2020 A/B 卷]冰火战士(线段树,二分) Luogu 题外话1: LN四个人切D1T2却只有三个人切D1T1 很神必 我是傻逼. 题外话2: 1e6的数据直接i ...

  3. [省选联考 2020 A/B 卷] 冰火战士

    一.题目 点此看题 二.解法 其实这道题也不是特别难吧 \(......\) 但树状数组上二分是我第一次见. 我们把冰人和火人都按温度排序,那么考虑一个分界线 \(x\) ,问题就是求冰数组 \(x\ ...

  4. [省选联考 2020 A 卷] 组合数问题

    题意 [省选联考 2020 A 卷] 组合数问题 想法 自己在多项式和数论方面还是太差了,最近写这些题都没多少思路,看完题解才会 首先有这两个柿子 \(k*\dbinom{n}{k} = n*\dbi ...

  5. luoguP6623 [省选联考 2020 A 卷] 树(trie树)

    luoguP6623 [省选联考 2020 A 卷] 树(trie树) Luogu 题外话: ...想不出来啥好说的了. 我认识的人基本都切这道题了. 就我只会10分暴力. 我是傻逼. 题解时间 先不 ...

  6. luoguP6620 [省选联考 2020 A 卷] 组合数问题(斯特林数)

    luoguP6620 [省选联考 2020 A 卷] 组合数问题(斯特林数) Luogu 题外话: LN切这题的人比切T1的多. 我都想到了组合意义乱搞也想到可能用斯特林数为啥还是没做出来... 我怕 ...

  7. luoguP6624 [省选联考 2020 A 卷] 作业题(莫比乌斯反演,矩阵树定理)

    luoguP6624 [省选联考 2020 A 卷] 作业题(莫比乌斯反演,矩阵树定理) Luogu 题外话: Day2一题没切. 我是傻逼. 题解时间 某种意义上说刻在DNA里的柿子,大概是很多人学 ...

  8. [省选联考 2021 A/B 卷] 卡牌游戏

    垃圾福建垫底选手来看看这题. 大家怎么都写带 \(log\) 的. 我来说一个线性做法好了. 那么我们考虑枚举 \(k\) 作为翻转完的最小值. 那么构造出一个满足条件的操作,我们在 \(a_i\) ...

  9. 洛谷P6623——[省选联考 2020 A 卷] 树

    传送门:QAQQAQ 题意:自己看 思路:正解应该是线段树/trie树合并? 但是本蒟蒻啥也不会,就用了树上二次差分 (思路来源于https://www.luogu.com.cn/blog/dengy ...

随机推荐

  1. Solution -「LOCAL」「cov. 牛客多校 2020 第三场 I」礼物

    \(\mathcal{Description}\)   给定排列 \(\{a_n\}\),求字典序第 \(K\) 大的合法排列 \(\{b_n\}\).称一个排列 \(\{p_n\}\) 合法,当且仅 ...

  2. .NET官方封装的Win32API类库

    大部分朋友在使用C#.NET调用Win32API时都不清楚API函数的声明,要么就是抄网上的代码,但是总会遇到各种各样奇奇怪怪难以解决的问题,打算自己封装又发现工作量实在太大. 其实完全没有必要自己动 ...

  3. head 插件 Content-Type header [application/x-www-form-urlencoded] is not supported

    { "error": "Content-Type header [application/x-www-form-urlencoded] is not supported& ...

  4. 添加删除系统右键菜单(就是上下文菜单,也就是Context Menu)中的一些选项

    随着电脑安装的东西越来越多,右侧菜单也原来越长,很不方面.所以打算清理一下 我删除的大约以下几个,友好一点的都可以配置.当然也可以通过注册表直接删除. 特:注册表备份,即导入导出,避免一失足成千古恨. ...

  5. 「BUAA OO Pre」 Pre 2总结回顾概览

    「BUAA OO Pre」 Pre 2总结回顾概览 目录 「BUAA OO Pre」 Pre 2总结回顾概览 Part 0 前言 写作背景 定位 您可以在这里期望获得 您在这里无法期望获得 对读者前置 ...

  6. const 和指针之间的姻缘

    const和指针到底有何姻缘呢? char const *p = NULL; //char const 和 const char 是一样的,p 是一个指向常整型的指针变量 ,指针变量的值不能改变 ch ...

  7. 内网流量操控---pingtunnel建立icmp隧道

    一.pingtunnel工作原理 在上面的实验环境中,我们将分别在攻击机kali 2020和webserver上部署pingtunnel工具,在量太主机之间实现icmp隧道,再在kali2020上监听 ...

  8. python数据结构:数组和列表

    线性结构有两种:数组和列表 array和list 其中list各项操作的时间复杂度如下 因为insert是在头部插入 所以列表所有元素后移,时间复杂度为O(n) remove移除列表中某个值的第一个匹 ...

  9. 打破刻板印象,了解真正的商业智能BI

    ​在技术飞速发展的过程中,人们越来越怀疑传统的数据分析方法.可以通过对商业智能的各种误解来解释这一点,如今,这种误解正在作为有效的真理传播.例如,数据仓库已达到其目标.而数据质量似乎也正在失去其相关性 ...

  10. 如何利用Smartbi做数据分析:2018内5月热销乘用车分析报告

    在2018年第一季度热销乘用车分析报告中,SUV以总体销量15.4%的同比增长率让人不可小觑,Smartbi刚得到5月分析的数据就迫不及待的来看看是否热度不减,结果在5月这个所谓汽车销售淡季,轿车以9 ...