E

假设从小到大排序,每次交换相邻两个,最小次数即冒泡排序也就是逆序对

考虑值域较小,把每个值映射到\([1,20]\)

设\(f_i\)为已经加入集合为\(i\)的值的最小逆序对个数,考虑填表法

即枚举每个在i里的数x,考虑其为最后加进来的数

再枚举其他的数y,考虑在原序列中形似(x,y)的个数,这个很容易预处理出来

#include<bits/stdc++.h>
typedef long long LL;
const LL maxn=1e6+9,inf=0x3f3f3f3f3f3f3f3f;
inline LL Read(){
LL x(0),f(1); char c=getchar();
while(c<'0' || c>'9'){
if(c=='-') f=-1; c=getchar();
}
while(c>='0' && c<='9'){
x=(x<<3)+(x<<1)+c-'0'; c=getchar();
}return x*f;
}
LL n;
LL a[maxn],cnt[29],f[1<<21],sum[29][29];
int main(){
n=Read();
for(LL i=1;i<=n;++i){
a[i]=Read();
++cnt[a[i]];
for(LL j=1;j<=20;++j){
if(j==a[i]) continue;
sum[j][a[i]]+=cnt[j];
}
}
memset(f,inf,sizeof(f));
f[0]=0;
LL up=1<<20;
for(LL i=1;i<up;++i){
for(LL j=1;j<=20;++j){
if(!((1<<j-1)&i)) continue;
LL nw(0);
LL pre(i-(1<<j-1));
for(LL k=1;k<=20;++k){
if(k==j) continue;
if(!((1<<k-1)&i)) continue;
nw+=sum[j][k];
}
f[i]=std::min(f[i],f[pre]+nw);
}
}
printf("%lld\n",f[up-1]);
return 0;
}

F

挖个坑,顺便奶一口CSP考2-sat

最新文章

  1. Logistic回归的使用
  2. SharePoint 2013 表单认证使用ASP.Net配置工具添加用户
  3. 关于adb驱动
  4. linux进程调度方法(SCHED_OTHER,SCHED_FIFO,SCHED_RR)
  5. 微信小程序视频地址
  6. javascript 柯里化
  7. NSS_03 过滤器
  8. python logging 日志轮转文件不删除问题
  9. Linux串口编程详解(转)
  10. LNMP搭建02 -- 编译安装Nginx
  11. 解决win10 VC++6.0 应用程序无法正常运行 0xc0000142
  12. 在vue中关于element UI 中表格实现下载功能,表头添加按钮,和点击事件失效的解决办法。
  13. Pycharm问题:module &#39;pip&#39; has no attribute &#39;main&#39;
  14. HTML5 页面编辑API之Range对象
  15. Int和String互转的方法
  16. windows系统下简单nodejs安装及环境配置
  17. centos7如何安装部署Zabbix
  18. Golang GC原理
  19. Python sys.argv[] 的用法
  20. 3.3 线程---Handler消息传递机制浅析

热门文章

  1. 【转载】C#中List集合使用RemoveRange方法移除指定索引开始的一段元素
  2. 【转载】C#中List集合使用Reverse方法对集合中的元素进行倒序反转
  3. vue中如何判断checkbox是否选中
  4. gitlab异地备份并验证MD5值
  5. Core Animation笔记(动画)
  6. 快速构建ceph可视化监控系统-转载
  7. linux-秘钥生成
  8. 用java刷剑指offer(二叉树中和为某一值的路径)
  9. 小顶堆---非递归C语言来一发
  10. mysqldump简单备份