最少反链划分数 = 最长链。实现:每次找出所有极大元作为一个反链。

任意长度小于k * (k + 1) / 2的排列都能被划分为不多于k个单调序列。且这是一个紧的上界。

然后这题就可以切了。

题意:给定长为n的排列,设任长为n的排列都能被划分为不多于k个单调序列,把给定排列划分为不多于k个单调序列。

解:先求出k,然后求LIS,如果LIS >= k那么扔掉LIS递归。否则划分成反链即可。用链表实现。

 #include <bits/stdc++.h>

 const int N = , INF = 0x3f3f3f3f;

 int p[N], cnt;
std::vector<int> v[N]; struct Node {
int nex, pre;
}node[N]; int tp, head = N - , tail = N - ; int stk[N], top, f[N], rest, stk2[N], fr[N];
bool vis[N]; inline void del(int x) {
int nex = node[x].nex, pre = node[x].pre;
node[nex].pre = pre;
node[pre].nex = nex;
return;
} inline int getLIS() {
top = ;
for(int i = node[head].nex; i != tail; i = node[i].nex) {
int l = , r = top;
while(l < r) {
int mid = (l + r + ) >> ;
if(stk[mid] < p[i]) {
l = mid;
}
else {
r = mid - ;
}
}
f[i] = r + ;
fr[i] = stk2[r];
stk[r + ] = p[i];
stk2[r + ] = i;
if(r == top) ++top;
}
return top;
} inline void erase() {
int x = stk2[top];
++cnt;
while(x) {
del(x);
v[cnt].push_back(p[x]);
x = fr[x];
}
std::reverse(v[cnt].begin(), v[cnt].end());
return;
} inline void split() { while(rest) {
++cnt;
int last = -;
for(int i = node[tail].pre; i != head; i = node[i].pre) {
if(p[i] > last) {
v[cnt].push_back(i);
last = p[i];
//printf("inside %d \n", i);
rest--;
}
}
std::reverse(v[cnt].begin(), v[cnt].end());
int len = v[cnt].size();
for(int i = ; i < len; i++) {
del(v[cnt][i]);
//printf("now : %d \n", v[cnt][i]);
v[cnt][i] = p[v[cnt][i]];
//printf("now : %d \n", v[cnt][i]);
}
} return;
} inline void solve() {
int n;
scanf("%d", &n);
for(int i = ; i <= n; i++) {
scanf("%d", &p[i]);
node[i].nex = ;
if(i > ) {
node[i].pre = i - ;
node[i - ].nex = i;
}
else {
node[i].pre = head;
node[head].nex = i;
}
}
node[n].nex = tail;
node[tail].pre = n;
cnt = ;
rest = n;
int K = ;
while(K * (K + ) / <= n) {
++K;
}
//printf("K = %d \n", K);
/// use K-1
while(rest) {
int len = getLIS();
//printf("len = %d \n", len);
if(len >= K) {
erase();
K--;
rest -= len;
}
else {
split();
rest = ;
}
}
printf("%d \n", cnt);
for(int i = ; i <= cnt; i++) {
int len = v[i].size();
printf("%d ", len);
for(int j = ; j < len; j++) {
printf("%d ", v[i][j]);
}
puts("");
v[i].clear();
}
tp = ;
return;
} int main() { int T;
scanf("%d", &T);
while(T--) {
solve();
} return ;
}

AC代码

CF1097E Egor and an RPG game的更多相关文章

  1. 【CF1097E】Egor and an RPG game(动态规划,贪心)

    [CF1097E]Egor and an RPG game(动态规划,贪心) 题面 洛谷 CodeForces 给定一个长度为\(n\)的排列\(a\),定义\(f(n)\)为将一个任意一个长度为\( ...

  2. Codeforces 1097E. Egor and an RPG game 构造

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF1097E.html 题解 首先我们求出 $k = f(n) = \max\{x|\frac{x(x+1)}2 ...

  3. Codeforces 1097E. Egor and an RPG game

    传送门 首先考虑怎么算 $f(n)$ (就是题目里面那个 $f(n)$) 发现可以构造一组序列大概长这样: ${1,3,2,6,5,4,10,9,8,7,15,14,13,12,11,...,n(n+ ...

  4. Hello 2019 (D~G)

    目录 Codeforces 1097 D.Makoto and a Blackboard(DP 期望) E.Egor and an RPG game(思路 LIS Dilworth定理) F.Alex ...

  5. codeforces 1097 Hello 2019

    又回来了.. A - Gennady and a Card Game 好像没什么可说的了. #include<bits/stdc++.h> using namespace std; cha ...

  6. 2013 Asia Changsha Regional Contest---Josephina and RPG(DP)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=4800 Problem Description A role-playing game (RPG and ...

  7. 【经典】C++&RPG对战游戏

    博文背景: 还记大二上学期的时候看的这个C++&RPG游戏(博主大一下学期自学的php,涵盖oop内容),一个外校的同学他们大一学的C++,大二初期C++实训要求做一个程序填空,就是这个 RP ...

  8. 2013长沙赛区现场赛 J - Josephina and RPG

    J - Josephina and RPG Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I6 ...

  9. RPG的错排

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission( ...

随机推荐

  1. git学习记录1(本地库管理)

    学习参考地址:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 本编随笔只是自己对 ...

  2. Spring源码由浅入深系列三 refresh

    spring中的refresh是一个相当重要的方法.它完成IOC的第一个阶段,将xml中的bean转化为beanDefinition.详细说明如上图所示. 在上图中,创建obtainFreshBean ...

  3. JAVA IntelliJ IDEA for mac/jdk的安装及环境配置、运行

    现在配置完之后再回头看看,其实挺简单, 但我还是弄了好几个小时才配置出来, 不过好在是自己配置出来的, 每天都在慢慢进步. 安装及配置步骤如下: JAVA的IDE的话去jetbrains的官网上对应下 ...

  4. linux mysql udf 提权

    连接远程数据库 查看插件库路径 show variables like '%plugin%'; 写入udf库到插件目录: 32位: select unhex('7F454C46020101000000 ...

  5. log4j架构

    Log4j API设计为分层结构,其中每一层提供了不同的对象,对象执行不同的任务.这使得设计灵活,根据将来需要来扩展. 有两种类型可用在Log4j的框架对象. 核心对象: 框架的强制对象和框架的使用. ...

  6. Codeforces Round #525 E - Ehab and a component choosing problem

    题目大意: 在一棵树中 选出k个联通块 使得 这k个联通块的点权总和 / k 最大 并且这k个联通块不相互覆盖(即一个点只能属于一个联通块) 如果有多种方案,找到k最大的那种 给定n 有n个点 给定n ...

  7. Unity中DoTween的使用

    在Unity手游开发中,经常用到插值运算,我们可以使用Mathf.Lerp自行去实现效果,但是使用插件提高了我们的开发效率,这里归结一下DoTween的基本使用方式以及效果说明: 直接代码: usin ...

  8. tp5.0x代码执行

    1.拿到站首先平复一下心情 看了一下robots.txt结构像dedecms,网站还存在CDN,日了狗看到这里其实都想放弃来着,懒癌晚期,然后接着使用云悉平台走了一波,看了一下得到真实IP,看来只给w ...

  9. 3、docker 容器管理

    Docker容器相对于OpenStack的云主机实例,虽然他们本质上不同.我们需要基于镜像来创建容器.容器是独立运行的一个或一组应用,以及它们的运行环境.对应的,虚拟机可以理解为模拟运行的一整套操作系 ...

  10. iOS_iPhone App自动化测试

    无线客户端的发展很快,特别针对是android和ios两款无线操作系统的客户端应用,相应的测试工具也应运而生,这里主要给大家介绍一些针对 iPhone App的自动化测试工具.          首先 ...