题意:给你一个n的排列,起初这些数都不能用, 然后还有一个数组 第 i 个数表示下标为 i 的数能够使用。

问每一个 i 对应的最长上升子序列。

题解:

可以通过倒推,从后往前考虑转化一下 ,然后就是删除一个数,两个数到n个数的最长上升子序列。

比赛的时候不会算复杂度算出来的是n^2log(n) ,完全不敢写,一直在想办法优化

赛后题解就是这个做法,但是题解说 因为数据随机,因此 LIS 的期望长度是 O( √ n),

删除的 x 位于 LIS 中的概率是 √ 1 n,也就 是说期望删除 O( √ n) 个数才会修改 LIS,

那么 LIS 变化的次数不会很多。期望时间复杂度为 O(n √ n log n)。

LIS 的期望长度是 O( √ n),有一个证明 点击这里

(这个故事告诉我们敢写才能过,别想这么多,莽就是了)

这题就是纯暴力的样子了

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <queue>
  4. #include <cmath>
  5. #include <algorithm>
  6. #include <set>
  7. #include <iostream>
  8. #include <map>
  9. #include <stack>
  10. #include <string>
  11. #include <vector>
  12. #define pi acos(-1.0)
  13. #define eps 1e-9
  14. #define fi first
  15. #define se second
  16. #define rtl rt<<1
  17. #define rtr rt<<1|1
  18. #define bug printf("******\n")
  19. #define mem(a,b) memset(a,b,sizeof(a))
  20. #define name2str(x) #x
  21. #define fuck(x) cout<<#x" = "<<x<<endl
  22. #define f(a) a*a
  23. #define sf(n) scanf("%d", &n)
  24. #define sff(a,b) scanf("%d %d", &a, &b)
  25. #define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
  26. #define sffff(a,b,c,d) scanf("%d %d %d %d", &a, &b, &c, &d)
  27. #define pf printf
  28. #define FRE(i,a,b) for(i = a; i <= b; i++)
  29. #define FREE(i,a,b) for(i = a; i >= b; i--)
  30. #define FRL(i,a,b) for(i = a; i < b; i++)+
  31. #define FRLL(i,a,b) for(i = a; i > b; i--)
  32. #define FIN freopen("data.txt","r",stdin)
  33. #define gcd(a,b) __gcd(a,b)
  34. #define lowbit(x) x&-x
  35. #define rep(i,a,b) for(int i=a;i<b;++i)
  36. #define per(i,a,b) for(int i=a-1;i>=b;--i)
  37. using namespace std;
  38. typedef long long LL;
  39. typedef unsigned long long ULL;
  40. const int maxn = + ;
  41. const int maxm = 8e6 + ;
  42. const int mod = 1e9 + ;
  43. const int INF = 0x3f3f3f3f;
  44. int T, n, a[maxn], b[maxn], vis[maxn], ans[maxn], len, dp[maxn], pre[maxn];
  45. void solve() {
  46. for ( int i = ; i <= n ; i++ ) dp[i] = INF, pre[i] = , vis[i] = ;
  47. dp[] = ;
  48. for ( int i = ; i <= n ; i++ ) {
  49. if ( !a[i] ) continue;
  50. int pos = lower_bound ( dp + , dp + + n, a[i] ) - dp;
  51. pre[a[i]] = dp[pos - ];
  52. dp[pos] = a[i];
  53. }
  54. for ( int i = ; i <= n ; i++ ) {
  55. if ( dp[i] != INF ) len = i;
  56. else break;
  57. }
  58. int x = dp[len];
  59. while ( x ) {
  60. vis[x] = ;
  61. x = pre[x];
  62. }
  63. }
  64. int main() {
  65. sf ( T );
  66. while ( T-- ) {
  67. sf ( n );
  68. for ( int i = ; i <= n ; i++ ) sf ( a[i] );
  69. for ( int i = ; i <= n ; i++ ) sf ( b[i] );
  70. reverse ( b + , b + + n );
  71. solve();
  72. ans[] = len;
  73. for ( int i = ; i < n ; i++ ) {
  74. if ( vis[a[b[i]]] ) {
  75. a[b[i]] = ;
  76. solve();
  77. } else a[b[i]] = ;
  78. ans[i + ] = len;
  79. }
  80. reverse ( ans + , ans + + n );
  81. for ( int i = ; i <= n ; i++ ) printf ( "%d%c", ans[i], ( i == n ? '\n' : ' ' ) );
  82. }
  83. return ;
  84. }

2019 Multi-University Training Contest 6 Nonsense Time (纯暴力)的更多相关文章

  1. 2019 Nowcoder Multi-University Training Contest 4 E Explorer

    线段树分治. 把size看成时间,相当于时间 $l$ 加入这条边,时间 $r+1$ 删除这条边. 注意把左右端点的关系. #include <bits/stdc++.h> ; int X[ ...

  2. 2019 Nowcoder Multi-University Training Contest 1 H-XOR

    由于每个元素贡献是线性的,那么等价于求每个元素出现在多少个异或和为$0$的子集内.因为是任意元素可以去异或,那么自然想到线性基.先对整个集合A求一遍线性基,设为$R$,假设$R$中元素个数为$r$,那 ...

  3. 2016 Multi-University Training Contest 3-1011.Teacher Bo,暴力!

    Teacher Bo                                                         Time Limit: 4000/2000 MS (Java/Ot ...

  4. HDU校赛 | 2019 Multi-University Training Contest 6

    2019 Multi-University Training Contest 6 http://acm.hdu.edu.cn/contests/contest_show.php?cid=853 100 ...

  5. 2019 Multi-University Training Contest 8

    2019 Multi-University Training Contest 8 C. Acesrc and Good Numbers 题意 \(f(d,n)\) 表示 1 到 n 中,d 出现的次数 ...

  6. 2019 Multi-University Training Contest 7

    2019 Multi-University Training Contest 7 A. A + B = C 题意 给出 \(a,b,c\) 解方程 \(a10^x+b10^y=c10^z\). tri ...

  7. 2019 Multi-University Training Contest 1

    2019 Multi-University Training Contest 1 A. Blank upsolved by F0_0H 题意 给序列染色,使得 \([l_i,r_i]\) 区间内恰出现 ...

  8. 2019 Multi-University Training Contest 2

    2019 Multi-University Training Contest 2 A. Another Chess Problem B. Beauty Of Unimodal Sequence 题意 ...

  9. 2019 Multi-University Training Contest 5

    2019 Multi-University Training Contest 5 A. fraction upsolved 题意 输入 \(x,p\),输出最小的 \(b\) 使得 \(bx\%p&l ...

随机推荐

  1. Android Android Studio 如何导出 Jar 给 Unity 使用

    大致步骤如下: 1.创建新的 Android Studio 工程 2.为此 Android Studio 工程创建 Android Library 类库(也就是一个 Module)(后面就是用它生成 ...

  2. js基础用法 ,基础语法

    js用法: HTML 中的脚本必须位于 <script> 与 </script> 标签之间. 脚本可被放置在 HTML 页面的 <body> 和 <head& ...

  3. Android中的Serialable和Parcelable的区别

    本文主要介绍Parcelable和Serializable的作用.效率.区别及选择,关于Serializable的介绍见<Java中的序列化Serialable高级详解> 1.作用 Ser ...

  4. NX二次开发-算法篇-冒泡排序(例子:遍历所有点并排序)

    NX9+VS2012 #include <uf.h> #include <uf_ui.h> #include <uf_curve.h> #include <u ...

  5. hive表操作(转)

    转载于:http://blog.csdn.net/lovelovelovelovelo/article/details/52234971 数据类型 基本数据类型 集合类型,array.map.stru ...

  6. jsp-request应用1

    用jsp写表单提交数据时需要用到request去读取数据,表单代码如下: <form action="requestresult.jsp" method="post ...

  7. day 90 跨域和CORS

    跨域和CORS   本节目录 一 跨域 二 CORS 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 跨域 同源策略(Same origin policy)是一种约定,它是 ...

  8. Python3 From Zero——{最初的意识:003~数字、日期、时间}

    一.对数值进行取整:round(value,ndigits) >>> round(15.5,-1) #可以取负数 20.0 >>> round(15.5,0) #当 ...

  9. 函数的属性和方法, apply和call的区别及bind的使用

    ==>我的新博客中 http://www.suanliutudousi.com/2017/08/27/%E5%87%BD%E6%95%B0%E7%9A%84%E5%B1%9E%E6%80%A7% ...

  10. 5个Sublime Text 的插件推荐

    Sublime Text 是一个代码编辑器(Sublime Text 2是收费软件,但可以无限期试用),也是HTML和散文先进的文本编辑器.Sublime Text是由程序员Jon Skinner于2 ...