codeforces#1215E. Marbles(状压dp)
题目链接:
http://codeforces.com/contest/1215/problem/E
题意:
至少多少次操作可以使得相同的数都是相邻的
每次操作可以交换两个相邻的数
数据范围:
$1\leq n \leq 400000$
$1\leq a_i \leq 20$
分析:
定义$dp[i]$,$i$是状态,如果某位是1,那么就固定好了该颜色
$dp[i]$为$i$状态下需要交换的最少次数
定义$ma[i][j]$,只考虑$i,j$两种颜色时,把$i$放前面$j$放后面的最少移动次数
每次固定一个颜色在已固定颜色的末尾,计算当前颜色和已经固定颜色的贡献,然后转移
$ans=dp[(1<<20)-1]$
ac代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pii pair<int,int>
const int maxn=2e5+10;
ll ma[22][22],dp[(1<<20)+7];
vector<int>ve[22];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
ve[x].push_back(i);
} for(int i=1;i<=20;i++){
for(int j=1;j<=20;j++){
if(i==j)continue;
for(int k=0;k<ve[i].size();k++){
// cout<<"sda"<<endl;
int v=ve[i][k];
if(ve[j].size()==0||ve[j][0]>v)continue;
int st=0,en=ve[j].size()-1;
while(st!=en){
int md=(st+en)/2;
if(ve[j][md+1]<v)st=md+1;
else en=md;
}
ma[i][j]+=st+1;
// cout<<"sda"<<endl;
}
}
}
int len=(1<<20);
for(int i=1;i<len;i++)dp[i]=1e18;
for(int i=0;i<len;i++){
//cout<<i<<endl;
for(int j=1;j<=20;j++){
if((i&(1<<(j-1)))==0){
ll res=0;
for(int k=1;k<=20;k++)
if((i&(1<<(k-1))))res+=ma[k][j];
dp[i+(1<<(j-1))]=min(res+dp[i], dp[i+(1<<(j-1))]);
}
}
}
printf("%lld\n",dp[len-1]);
return 0;
}
codeforces#1215E. Marbles(状压dp)的更多相关文章
- codeforces#1215E. Marbles(状压DP)
题目大意:给出一个由N个整数组成的序列,通过每次交换相邻的两个数,使这个序列的每个相同的数都相邻.求最小的交换次数. 比如给出序列:1 2 3 2 1 ,那么最终序列应该是 1 1 2 2 3 ,最小 ...
- E. Marbles 状压dp
E. Marbles 这个是一个状压dp 题目大意是:给你一个数组,数组的数在1到20之间,有一个操作就是交换相邻的两个数,问 让所有相同的数相邻的最小操作次数 dp[s] 表示s状态下的操作次数,w ...
- codeforces 11D(状压dp)
传送门:https://codeforces.com/problemset/problem/11/D 题意: 求n个点m条边的图里面环的个数 题解: 点的范围只有19,很容易想到是状压. dp[sta ...
- Codeforces Round #585 (Div. 2) E. Marbles(状压dp)
题意:给你一个长度为n的序列 问你需要多少次两两交换 可以让相同的数字在一个区间段 思路:我们可以预处理一个数组cnt[i][j]表示把i放到j前面需要交换多少次 然后二进制枚举后 每次选择一个为1的 ...
- Codeforces 1215E 状压DP
题意:给你一个序列,你可以交换序列中的相邻的两个元素,问最少需要交换多少次可以让这个序列变成若干个极大的颜色相同的子段. 思路:由于题目中的颜色种类很少,考虑状压DP.设dp[mask]为把mask为 ...
- Codeforces Round #585 (Div. 2) E. Marbles (状压DP),BZOJ大理石(同一道题)题解
题意 林老师是一位大理石收藏家,他在家里收藏了n块各种颜色的大理石,第i块大理石的颜色为ai.但是林老师觉得这些石头在家里随意摆放太过凌乱,他希望把所有颜色相同的石头放在一起.换句话说,林老师需要对现 ...
- codeforces Diagrams & Tableaux1 (状压DP)
http://codeforces.com/gym/100405 D题 题在pdf里 codeforces.com/gym/100405/attachments/download/2331/20132 ...
- Codeforces Gym 100015F Fighting for Triangles 状压DP
Fighting for Triangles 题目连接: http://codeforces.com/gym/100015/attachments Description Andy and Ralph ...
- Codeforces Gym 100610 Problem K. Kitchen Robot 状压DP
Problem K. Kitchen Robot Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/10061 ...
- 状压dp Codeforces Beta Round #8 C
http://codeforces.com/contest/8/problem/C 题目大意:给你一个坐标系,给你一个人的目前的坐标(该坐标也是垃圾桶的坐标),再给你n个垃圾的坐标,这个人要捡完所有的 ...
随机推荐
- (六)Activiti之实现学生请假流程
一.实现学生请假流程 1.1 用activiti插件生成bpmn和png文件 1.2 部署流程定义 package com.shyroke.activiti.firstActiviti; import ...
- HTTP抓包
1 概述 wireshark:全平台抓包工具,需要图形化界面,十分强大: httpry:http抓包插件,功能一般,操作简单: tcpdump:强大的抓包插件,支持多种网络协议. 2 httpry ( ...
- .netcore项目中使用log4net
log4net配置文件 引入log4net包,创建一个config目录,专门用来放配置文件,添加log4net.config文件. 编写配置文件. <?xml version="1.0 ...
- javaweb常识
Tomcat下载地址www.apache.org 在电脑中查看java版本:cmd中输入java -version tomcat解压后目录 bin:放可执行文件(如startup.bat shut ...
- springboot启动流程(十一)aop切面处理过程
所有文章 https://www.cnblogs.com/lay2017/p/11478237.html 正文 spring的两大核心就是ioc和aop.在关于ioc依赖注入的文章中,我们了解了如何根 ...
- menustrip选项怎么设置竖向分割线
效果图: 解决方案: 选中一个项--[右键]--[插入]--[separator]
- Python使用selenium模拟点击(一)
本文适合有点Python基础阅读,(没基础的话,相对的比较蒙蔽,争取能让小白能一步一步跟上来) 2019-03-05 14:53:05 前几天由于需要到一个网站进行签到~~听说Python能够模拟请求 ...
- nginx动静分离简单实例实现
什么是动静分离? Nginx 动静分离简单来说就是把动态和静态请求分开,不能理解成只是将动态页面和静态页面物理分离.严格意义上说应该是动态请求和静态请求分开,可以理解成使用 nginx 处理静态页面, ...
- toolbox 中创建nginx服务器,使用localhost不能访问
使用toolbox 工具使用docker创建nginx 容器,使用localhost不能访问? 使用docker run --rm -d --name dweb -p 80:80 nginx 命令执 ...
- mongodb的基本操作之更新不存在的数据
查找y为100的数据 db.test_collection.find({y:100}) 发现没有,这时候将y为100的数据更新为y为999的数据 db.test_collection.update({ ...