[CF585E]Marbles
Description:
给定一个序列 \(a_i\) ,每次可以交换相邻两个元素,求使序列变成若干个极大连续段,每个极大连续段内部的值相同且任意两个极大连续段的值互不相同。
\(n\le 4\times 10^5, a_i\le 20\)
Solution:
由于值域很小,启发我们从值域入手,考虑每一种颜色。
设 \(cnt[i][j]\) 表示在只考虑颜色 \(i\) 和 \(j\) 的情况下,把所以颜色 \(i\) 都移到所有颜色 \(j\) 的前面的步数,这个对每一个颜色用 \(\text{vector}\) 存下出现的位置(从小到大),用 \({\rm two\ pointers}\) 扫一下即可求得 。
考虑状压每一种颜色,二进制下为1表示这个位的颜色已经被安排好了。
设 \(dp[S]\) 表示 \(S\) 的颜色已经安排好在序列的前面且两两不交的最小步数,那么转移就枚举一个不在 \(S\) 中的点 \(i\) ,把 \(i\) 放在考虑完的 \(S\) 的后面,那么产生的步数就是把 \(S\) 放在 \(i\) 的前面的步数,通过 \(cnt[][i]\) 可以求得。
Code:
#include <iostream>
#include <vector>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <fstream>
typedef long long LL;
typedef unsigned long long uLL;
#define SZ(x) ((int)x.size())
#define ALL(x) (x).begin(), (x).end()
#define MP(x, y) std::make_pair(x, y)
#define DEBUG(...) fprintf(stderr, __VA_ARGS__)
#define GO cerr << "GO" << endl;
using namespace std;
inline void proc_status()
{
ifstream t("/proc/self/status");
cerr << string(istreambuf_iterator<char>(t), istreambuf_iterator<char>()) << endl;
}
template<class T> inline T read()
{
register T x(0);
register char c;
register int f(1);
while (!isdigit(c = getchar())) if (c == '-') f = -1;
while (x = (x << 1) + (x << 3) + (c xor 48), isdigit(c = getchar()));
return x * f;
}
template<typename T> inline bool chkmin(T &a, T b) { return a > b ? a = b, 1 : 0; }
template<typename T> inline bool chkmax(T &a, T b) { return a < b ? a = b, 1 : 0; }
const int maxN = 4e5;
const int maxM = 20;
int n;
vector<int> col[maxM + 1];
LL cnt[maxM + 1][maxM + 1];
LL dp[1 << maxM];
void Input()
{
n = read<int>();
for (int i = 1; i <= n; ++i)
{
int x = read<int>();
col[x].push_back(i);
}
}
void Init()
{
for (int i = 1; i <= 20; ++i)
for (int j = 1; j <= 20; ++j)
if (i != j)
{
if (!col[i].size() || !col[j].size()) continue;
int l = 0;
for (int k = 0; k < SZ(col[i]); ++k)
{
while (true)
{
if (l == SZ(col[j]) - 1 || col[j][l + 1] > col[i][k])
break;
l++;
}
if (col[j][l] < col[i][k])
cnt[i][j] += l + 1;
}
}
}
void Solve()
{
memset(dp, 0x3f, sizeof dp);
dp[0] = 0;
for (int S = 0; S < 1 << maxM; ++S)
{
for (int i = 0; i < maxM; ++i)
if (!(S >> i & 1))
{
LL sum(0);
for (int j = 0; j < maxM; ++j)
if (S >> j & 1)
sum += cnt[j + 1][i + 1];
chkmin(dp[S | (1 << i)], dp[S] + sum);
}
}
cout << dp[(1 << maxM) - 1] << endl;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("CF585E.in", "r", stdin);
freopen("CF585E.out", "w", stdout);
#endif
Input();
Init();
Solve();
return 0;
}
[CF585E]Marbles的更多相关文章
- Marbles启动信息
body-parser deprecated undefined extended: provide extended option app.js:40:20 -------------------- ...
- UVA 10090 - Marbles 拓展欧几里得
I have some (say, n) marbles (small glass balls) and I am going to buy some boxes to store them. The ...
- Codeforces Round #336 Marbles
E. Marbles time limit per test: 2 seconds memory limit per test: 256 megabytes input: standard in ...
- uva 10090 Marbles
Problem F Marbles Input: standard input Output: standard output I have some (say, n) marbles (small ...
- UVA11125 - Arrange Some Marbles(dp)
UVA11125 - Arrange Some Marbles(dp) option=com_onlinejudge&Itemid=8&category=24&page=sho ...
- CF585E. Present for Vitalik the Philatelist [容斥原理 !]
CF585E. Present for Vitalik the Philatelist 题意:\(n \le 5*10^5\) 数列 \(2 \le a_i \le 10^7\),对于每个数\(a\) ...
- 基于ubuntu16.04部署IBM开源区块链项目-弹珠资产管理(Marbles)
前言 本教程基本上是对Marbles项目的翻译过程. 如果英文比较好的话,建议根据官方操作说明,一步步进行环境部署.当然你也可以参考本教程在自己的主机上部署该项目. Marbles 介绍 关于 Mar ...
- UVA 10090 Marbles(扩展欧几里得)
Marbles Input: standard input Output: standard output I have some (say, n) marbles (small glass ball ...
- 【AtCoder】ARC086 E - Smuggling Marbles
[题目]E - Smuggling Marbles [题意]给定n+1个点的树(root=0),每个点可以选择放或不放弹珠,每一轮顺序进行以下操作: 1.将根节点0的弹珠加入答案. 2.每个点的弹珠移 ...
随机推荐
- 用Chrome 浏览器调试移动端网页 chrome://inspect/#devices
谷歌输入(chrome://inspect/#devices) 我使用的是小米(红米NOTE2 ),电脑是win 10 系统,以下几步就可以轻松使用浏览器内置的功能调试移动端网页了: 1. 手机开启调 ...
- 按照行数分割excel
本来是想通过NOPI自己编写个小工具分割excel的,但是不想去研究API,就百度了一下,找了很久,有几个软件说是为了这个功能而生,实际上要么不能使用,要么出错,所以暂时没有公开可用的软件. 然后我就 ...
- Ubuntu18.04下更改apt源为阿里云源
1.复制源文件备份,以防万一 我们要修改的文件是sources.list,它在目录/etc/apt/下,sources.list是包管理工具apt所用的记录软件包仓库位置的配置文件,同样类型的还有位于 ...
- 2019春Python程序设计作业2(0326--0401)
1-1 已知st="Hello World!",使用print(st[0:-1])语句可以输出字符串变量st中的所有内容. (2分) T F 1-2 Python程 ...
- python – 如何禁用Django的CSRF验证?
如果只需要一些视图不使用CSRF,可以使用@csrf_exempt: from django.views.decorators.csrf import csrf_exempt @csrf_exempt ...
- BZOJ 2217: [Poi2011]Lollipop 构造 + 思维
Description 有一个长度为n的序列a1,a2,...,an.其中ai要么是1("W"),要么是2("T").现在有m个询问,每个询问是询问有没有一个连 ...
- floor函数用法
floor(x),也写做Floor(x),其功能是“向下取整”,或者说“向下舍入”,即取不大于x的最大整数(与“四舍五入”不同,下取整是直接取按照数轴上最接近要求值的左边值,即不大于要求值的最大的那个 ...
- mac 的 ping 命令怎么停掉?
Widnows下的Ping不会只Ping4次,mac 会不停的Ping下去,需要停止,按下键盘上的 control+c 键即可停掉 Ping 过程.
- 3D Computer Grapihcs Using OpenGL - 19 Vertex Array Object(顶点数组对象)
大部分OpenGL教程都会在一开始就讲解VAO,但是该教程的作者认为这是很不合理的,因为要理解它的作用需要建立在我们此前学过的知识基础上.因此直到教程已经进行了一大半,作者才引入VAO这个概念.在我看 ...
- Proxy-代理器(预计vue3.0实现双向绑定的方式)
todo 常见的基于数据劫持的双向绑定有两种实现,一个是目前Vue在用的Object.defineProperty,另一个是ES2015中新增的Proxy,而Vue的作者宣称将在Vue3.0版本后加入 ...