原文链接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,他们的就不会被分到同一组。

代码

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long LL;
  4. LL read(){
  5. LL x=0;
  6. char ch=getchar();
  7. while (!isdigit(ch))
  8. ch=getchar();
  9. while (isdigit(ch))
  10. x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
  11. return x;
  12. }
  13. const int N=100005;
  14. int T,n,m;
  15. int a[N],v[N],p[N],vis[N];
  16. int f(int n){
  17. int ans=0;
  18. while (ans*(ans+1)<=n*2)
  19. ans++;
  20. return ans-1;
  21. }
  22. int c[N];
  23. void Add(int x,int id){
  24. for (;x<=n;x+=x&-x)
  25. c[x]=v[c[x]]<v[id]?id:c[x];
  26. }
  27. int Ask(int x){
  28. int ans=0;
  29. for (;x;x-=x&-x)
  30. ans=v[ans]<v[c[x]]?c[x]:ans;
  31. return ans;
  32. }
  33. vector <vector <int> > ans;
  34. vector <int> vec_empty;
  35. void Main(){
  36. ans.clear();
  37. n=read();
  38. for (int i=1;i<=n;i++)
  39. a[i]=read();
  40. m=n;
  41. while (m>0){
  42. int k=f(m);
  43. // cout<<"k="<<k<<endl;
  44. for (int i=0;i<=n;i++)
  45. c[i]=0;
  46. for (int i=1;i<=m;i++){
  47. vis[i]=0;
  48. p[i]=Ask(a[i]);
  49. v[i]=v[p[i]]+1;
  50. Add(a[i],i);
  51. }
  52. int tail=Ask(n),len=v[tail];
  53. if (len>k){
  54. ans.push_back(vec_empty);
  55. for (int i=tail;i;i=p[i])
  56. vis[i]=1,ans.back().push_back(a[i]);
  57. reverse(ans.back().begin(),ans.back().end());
  58. int _m=0;
  59. for (int i=1;i<=m;i++)
  60. if (!vis[i])
  61. a[++_m]=a[i];
  62. m=_m;
  63. }
  64. else {
  65. int c=(int)ans.size()-1;
  66. for (int i=1;i<=len;i++)
  67. ans.push_back(vec_empty);
  68. for (int i=1;i<=m;i++)
  69. ans[c+v[i]].push_back(a[i]);
  70. break;
  71. }
  72. }
  73. printf("%d\n",(int)ans.size());
  74. for (auto s : ans){
  75. printf("%d",(int)s.size());
  76. for (auto v : s)
  77. printf(" %d",v);
  78. puts("");
  79. }
  80. }
  81. int main(){
  82. T=read();
  83. while (T--)
  84. Main();
  85. return 0;
  86. }

  

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. 【CQOI2017】【BZOJ4813】小Q的棋盘 DFS

    题目描述 有一棵树,你要从\(0\)号点开始走,你可以走\(m\)步,问你最多能经过多少个不同的点. \(n\leq 100\) 题解 出题人的做法是DP(一个简单的树形DP),但是可以直接通过一次D ...

  2. 【JVM】关于类加载器准备阶段的一道面试题目

    一个经典的延伸问题 我们来看一个经典的延伸问题,准备阶段谈到静态变量,那么对于常量和不同静态变量有什么区别? 需要明确的是,没有人能够精确的理解和记忆所有信息,如果碰到这种问题,有直接答案当然最好:没 ...

  3. Help Me Escape ZOJ - 3640

    Background     If thou doest well, shalt thou not be accepted? and if thou doest not well, sin lieth ...

  4. java正则表达式取出匹配字符串

    import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexMatches { public s ...

  5. wp系统笔记

    1.了解了justified-image-grid是wp插件,继而查看wp,wp是一个免费建站系统.内置主题和插件.博客,CMS,企业站等.php+mysql 环境至少5.0以上 2.在zh-word ...

  6. 消息框MessageBox+遍历控件

    消息对话框:主要用来显示信息,也可以警告.用户确认取消等. MessageBox.Show("展示内容","标题",MessageBoxButtons.按钮种类 ...

  7. DirectX11 With Windows SDK--01 DirectX11初始化

    前言 由于个人觉得龙书里面第4章提供的Direct3D 初始化项目封装得比较好,而且DirectX SDK Samples里面的初始化程序过于精简,不适合后续使用,故选择了以Init Direct3D ...

  8. JAVA发红包案例

    模拟拼手气红包* 对于指定总金额以及红包个数,可以生成不同金额的红包,*,每个红包金额随机生成. * 分析这个题目:* 1.首先需要一个分发红包的方法.输入的参数是 总金额 以及 红包个数.* 按照这 ...

  9. [物理学与PDEs]第2章习题4 习题 3 的变分

    设 ${\bf u}$ 为满足第 3 题中条件的解. 证明 ${\bf u}$ 为如下变分问题 $$\bex \min_{{\bf w}\in A}\cfrac{1}{2}\int_\Omega |{ ...

  10. Pipeline build step with parameters

    build step https://jenkins.io/doc/pipeline/steps/pipeline-build-step/#build-build-a-job 一个任务的执行触发,另外 ...