2019 Multi-University Training Contest 6 Nonsense Time (纯暴力)
题意:给你一个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),有一个证明 点击这里
(这个故事告诉我们敢写才能过,别想这么多,莽就是了)
这题就是纯暴力的样子了
- #include <cstdio>
- #include <cstring>
- #include <queue>
- #include <cmath>
- #include <algorithm>
- #include <set>
- #include <iostream>
- #include <map>
- #include <stack>
- #include <string>
- #include <vector>
- #define pi acos(-1.0)
- #define eps 1e-9
- #define fi first
- #define se second
- #define rtl rt<<1
- #define rtr rt<<1|1
- #define bug printf("******\n")
- #define mem(a,b) memset(a,b,sizeof(a))
- #define name2str(x) #x
- #define fuck(x) cout<<#x" = "<<x<<endl
- #define f(a) a*a
- #define sf(n) scanf("%d", &n)
- #define sff(a,b) scanf("%d %d", &a, &b)
- #define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c)
- #define sffff(a,b,c,d) scanf("%d %d %d %d", &a, &b, &c, &d)
- #define pf printf
- #define FRE(i,a,b) for(i = a; i <= b; i++)
- #define FREE(i,a,b) for(i = a; i >= b; i--)
- #define FRL(i,a,b) for(i = a; i < b; i++)+
- #define FRLL(i,a,b) for(i = a; i > b; i--)
- #define FIN freopen("data.txt","r",stdin)
- #define gcd(a,b) __gcd(a,b)
- #define lowbit(x) x&-x
- #define rep(i,a,b) for(int i=a;i<b;++i)
- #define per(i,a,b) for(int i=a-1;i>=b;--i)
- using namespace std;
- typedef long long LL;
- typedef unsigned long long ULL;
- const int maxn = + ;
- const int maxm = 8e6 + ;
- const int mod = 1e9 + ;
- const int INF = 0x3f3f3f3f;
- int T, n, a[maxn], b[maxn], vis[maxn], ans[maxn], len, dp[maxn], pre[maxn];
- void solve() {
- for ( int i = ; i <= n ; i++ ) dp[i] = INF, pre[i] = , vis[i] = ;
- dp[] = ;
- for ( int i = ; i <= n ; i++ ) {
- if ( !a[i] ) continue;
- int pos = lower_bound ( dp + , dp + + n, a[i] ) - dp;
- pre[a[i]] = dp[pos - ];
- dp[pos] = a[i];
- }
- for ( int i = ; i <= n ; i++ ) {
- if ( dp[i] != INF ) len = i;
- else break;
- }
- int x = dp[len];
- while ( x ) {
- vis[x] = ;
- x = pre[x];
- }
- }
- int main() {
- sf ( T );
- while ( T-- ) {
- sf ( n );
- for ( int i = ; i <= n ; i++ ) sf ( a[i] );
- for ( int i = ; i <= n ; i++ ) sf ( b[i] );
- reverse ( b + , b + + n );
- solve();
- ans[] = len;
- for ( int i = ; i < n ; i++ ) {
- if ( vis[a[b[i]]] ) {
- a[b[i]] = ;
- solve();
- } else a[b[i]] = ;
- ans[i + ] = len;
- }
- reverse ( ans + , ans + + n );
- for ( int i = ; i <= n ; i++ ) printf ( "%d%c", ans[i], ( i == n ? '\n' : ' ' ) );
- }
- return ;
- }
2019 Multi-University Training Contest 6 Nonsense Time (纯暴力)的更多相关文章
- 2019 Nowcoder Multi-University Training Contest 4 E Explorer
线段树分治. 把size看成时间,相当于时间 $l$ 加入这条边,时间 $r+1$ 删除这条边. 注意把左右端点的关系. #include <bits/stdc++.h> ; int X[ ...
- 2019 Nowcoder Multi-University Training Contest 1 H-XOR
由于每个元素贡献是线性的,那么等价于求每个元素出现在多少个异或和为$0$的子集内.因为是任意元素可以去异或,那么自然想到线性基.先对整个集合A求一遍线性基,设为$R$,假设$R$中元素个数为$r$,那 ...
- 2016 Multi-University Training Contest 3-1011.Teacher Bo,暴力!
Teacher Bo Time Limit: 4000/2000 MS (Java/Ot ...
- 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 ...
- 2019 Multi-University Training Contest 8
2019 Multi-University Training Contest 8 C. Acesrc and Good Numbers 题意 \(f(d,n)\) 表示 1 到 n 中,d 出现的次数 ...
- 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 ...
- 2019 Multi-University Training Contest 1
2019 Multi-University Training Contest 1 A. Blank upsolved by F0_0H 题意 给序列染色,使得 \([l_i,r_i]\) 区间内恰出现 ...
- 2019 Multi-University Training Contest 2
2019 Multi-University Training Contest 2 A. Another Chess Problem B. Beauty Of Unimodal Sequence 题意 ...
- 2019 Multi-University Training Contest 5
2019 Multi-University Training Contest 5 A. fraction upsolved 题意 输入 \(x,p\),输出最小的 \(b\) 使得 \(bx\%p&l ...
随机推荐
- Android Android Studio 如何导出 Jar 给 Unity 使用
大致步骤如下: 1.创建新的 Android Studio 工程 2.为此 Android Studio 工程创建 Android Library 类库(也就是一个 Module)(后面就是用它生成 ...
- js基础用法 ,基础语法
js用法: HTML 中的脚本必须位于 <script> 与 </script> 标签之间. 脚本可被放置在 HTML 页面的 <body> 和 <head& ...
- Android中的Serialable和Parcelable的区别
本文主要介绍Parcelable和Serializable的作用.效率.区别及选择,关于Serializable的介绍见<Java中的序列化Serialable高级详解> 1.作用 Ser ...
- NX二次开发-算法篇-冒泡排序(例子:遍历所有点并排序)
NX9+VS2012 #include <uf.h> #include <uf_ui.h> #include <uf_curve.h> #include <u ...
- hive表操作(转)
转载于:http://blog.csdn.net/lovelovelovelovelo/article/details/52234971 数据类型 基本数据类型 集合类型,array.map.stru ...
- jsp-request应用1
用jsp写表单提交数据时需要用到request去读取数据,表单代码如下: <form action="requestresult.jsp" method="post ...
- day 90 跨域和CORS
跨域和CORS 本节目录 一 跨域 二 CORS 三 xxx 四 xxx 五 xxx 六 xxx 七 xxx 八 xxx 一 跨域 同源策略(Same origin policy)是一种约定,它是 ...
- Python3 From Zero——{最初的意识:003~数字、日期、时间}
一.对数值进行取整:round(value,ndigits) >>> round(15.5,-1) #可以取负数 20.0 >>> round(15.5,0) #当 ...
- 函数的属性和方法, 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% ...
- 5个Sublime Text 的插件推荐
Sublime Text 是一个代码编辑器(Sublime Text 2是收费软件,但可以无限期试用),也是HTML和散文先进的文本编辑器.Sublime Text是由程序员Jon Skinner于2 ...