原文链接https://www.cnblogs.com/zhouzhendong/p/CF1097E.html

题解

首先我们求出 $k = f(n) = \max\{x|\frac{x(x+1)}2\leq n\}$ 。

具体构造方案是:(以 $n = 15$ 为例)

11 12 13 14 15          7 8 9 10        4 5 6        2 3       1

我们考虑如何构造。

求出当前序列的 LIS 长度(假设为 $len$)。如果 $len\geq k$ ,那么直接取出这个LIS,把问题转化成更小规模的问题: $n^\prime = n-len\leq n-k$ 而且 $k^\prime \leq k-1$ 。

否则由dilworth引理得到一定可以把序列分成 $len$ 个递减序列。考虑按照以每一个点为结尾的上升序列长度将所有分组,对于同一组的按顺序连起来,这样得到 $len$ 组就好了。证明的比较简单:如果不是递减的,那么后一个的值至少是前一个+1,他们的就不会被分到同一组。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL read(){
LL x=0;
char ch=getchar();
while (!isdigit(ch))
ch=getchar();
while (isdigit(ch))
x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return x;
}
const int N=100005;
int T,n,m;
int a[N],v[N],p[N],vis[N];
int f(int n){
int ans=0;
while (ans*(ans+1)<=n*2)
ans++;
return ans-1;
}
int c[N];
void Add(int x,int id){
for (;x<=n;x+=x&-x)
c[x]=v[c[x]]<v[id]?id:c[x];
}
int Ask(int x){
int ans=0;
for (;x;x-=x&-x)
ans=v[ans]<v[c[x]]?c[x]:ans;
return ans;
}
vector <vector <int> > ans;
vector <int> vec_empty;
void Main(){
ans.clear();
n=read();
for (int i=1;i<=n;i++)
a[i]=read();
m=n;
while (m>0){
int k=f(m);
// cout<<"k="<<k<<endl;
for (int i=0;i<=n;i++)
c[i]=0;
for (int i=1;i<=m;i++){
vis[i]=0;
p[i]=Ask(a[i]);
v[i]=v[p[i]]+1;
Add(a[i],i);
}
int tail=Ask(n),len=v[tail];
if (len>k){
ans.push_back(vec_empty);
for (int i=tail;i;i=p[i])
vis[i]=1,ans.back().push_back(a[i]);
reverse(ans.back().begin(),ans.back().end());
int _m=0;
for (int i=1;i<=m;i++)
if (!vis[i])
a[++_m]=a[i];
m=_m;
}
else {
int c=(int)ans.size()-1;
for (int i=1;i<=len;i++)
ans.push_back(vec_empty);
for (int i=1;i<=m;i++)
ans[c+v[i]].push_back(a[i]);
break;
}
}
printf("%d\n",(int)ans.size());
for (auto s : ans){
printf("%d",(int)s.size());
for (auto v : s)
printf(" %d",v);
puts("");
}
}
int main(){
T=read();
while (T--)
Main();
return 0;
}

  

Codeforces 1097E. Egor and an RPG game 构造的更多相关文章

  1. 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+ ...

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

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

  3. Educational Codeforces Round 7 D. Optimal Number Permutation 构造题

    D. Optimal Number Permutation 题目连接: http://www.codeforces.com/contest/622/problem/D Description You ...

  4. Codeforces Gym 100342H Problem H. Hard Test 构造题,卡迪杰斯特拉

    Problem H. Hard TestTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100342/at ...

  5. Codeforces 791C. Bear and Different Names 模拟构造

    C. Bear and Different Names time limit per test:1 second memory limit per test:256 megabytes input:s ...

  6. Codeforces Round #339 (Div. 1) C. Necklace 构造题

    C. Necklace 题目连接: http://www.codeforces.com/contest/613/problem/C Description Ivan wants to make a n ...

  7. Codeforces - 814B - An express train to reveries - 构造

    http://codeforces.com/problemset/problem/814/B 构造题烦死人,一开始我还记录一大堆信息来构造p数列,其实因为s数列只有两项相等,也正好缺了一项,那就把两种 ...

  8. Codeforces Gym101341I:Matrix God(随机化构造矩阵降维)***

    http://codeforces.com/gym/101341/problem/I 题意:给三个N*N的矩阵,问a*b是否等于c. 思路:之前遇到过差不多的题目,当时是随机行(点),然后验证,不满足 ...

  9. Codeforces 1163E Magical Permutation [线性基,构造]

    codeforces 思路 我顺着图论的标签点进去的,却没想到-- 可以发现排列内每一个数都是集合里的数异或出来的. 考虑答案的上界是多少.如果能用小于\(2^k\)的数构造出\([0,2^k-1]\ ...

随机推荐

  1. 量化交易之下单函数和context对象

    一.下单函数 聚宽设计的函数(如前文所说准确叫法是API)的用法都写在API文档里,位置在聚宽网站导航栏-帮助-API文档 1.order按股数下单 order(security, amount, s ...

  2. 如何破解加密了的word文档

    https://blog.csdn.net/huangbaokang/article/details/79630223 变成xml文件格式之后--查找在documentProtection前面加上un ...

  3. Thinkphp5.1 ORM UML

    Thinkphp5.1 ORM  UML think-orm

  4. spring boot junit controller

    MockMvc 来自Spring Test,它允许您通过一组方便的builder类向 DispatcherServlet 发送HTTP请求,并对结果作出断言.请注意,@AutoConfigureMoc ...

  5. linux系统无法启动或无法登入

    修改root权限: https://blog.csdn.net/houjue2298/article/details/78539827 修改密码: https://www.cnblogs.com/we ...

  6. DMA设计

    目录 DMA设计 DMA框架 手册请看英文手册 芯片特性 请求来源 协议简述 基本时序 模式 协议 数据大小的描述 具体完整的实例时序 代码设计 驱动程序 测试程序 测试 参考链接 title: DM ...

  7. Python的设计模式

    设计模式是什么? 设计模式是经过总结.优化的,对我们经常会碰到的一些编程问题的可重用解决方案.一个设计模式并不像一个类或一个库那样能够直接作用于我们的代码.反之,设计模式更为高级,它是一种必须在特定情 ...

  8. SpringCloud笔记二:搭建项目基础框架

    目录 搭建框架 新建父工程 新建子工程api 新建子工程提供者provider 新建消费者consumer 总结 搭建框架 我们的SpringCloud微服务框架是父子工程,有一个父工程,剩下的都是子 ...

  9. HDU 5963(游戏 博弈+规律)

    题意是: 一群男生和一群女生玩游戏:给出一棵 n 个节点的树,这棵树的每条边有一个权值 0 或 1. 在一局游戏开始时,确定一个节点作为根.从女生开始,双方轮流进行操作. 当一方操作时,要先选择一个不 ...

  10. .NET面试题系列(十六)数据库面试题

    数据库事务的四大特性 原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚.因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响. ...