hdu 6635 2019杭电多校六 1002 Nonsense Time

阅读: 评论:0

hdu 6635 2019杭电多校六 1002 Nonsense Time

hdu 6635 2019杭电多校六 1002 Nonsense Time

从最后一个修改往前遍历,每次如果冻结的是记录中的最长上升子序列,就重新暴力一遍最长上升子序列并记录,注意记录的时候用path,lis只能求出长度,里面的数字不一定是最长上升子序列,复杂度因为是随机生成的序列,所以最长上升子序列长度平均为sqrt(n),修改的时候正好去掉当今最长上升子序列中的数的概率不高,出题人不卡特殊数据还把时间开了14秒,所以复杂度为n*sqrt(n)logn
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <vector>
#include <time.h>
#include <algorithm>
typedef long long ll;
using namespace std;
const ll mod=998244353;
const int maxn=1e5+100;int n;
int p[maxn],k[maxn],ans[maxn];
int vis[maxn],path[maxn];
vector<int>lis;int f()
{memset(vis,0,sizeof vis);memset(path,0,sizeof path);lis.clear();for(int i=1;i<=n;i++){if(p[i]==-1)continue;if(lis.size()==0 || p[i]>lis[lis.size()-1]){lis.push_back(p[i]);path[i]=lis.size();}else{int pos=lower_bound(lis.begin(),d(),p[i])-lis.begin();lis[pos]=p[i];path[i]=pos+1;}}int tmp=lis.size();for(int i=n;i>=1;i--){if(tmp==0)break;if(path[i]==tmp){vis[p[i]]=1;tmp--;}}return lis.size();
}int main() {
//    freopen(&#","r",stdin);
//    freopen(&#","w",stdout);int t;scanf("%d",&t);while(t--){scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&p[i]);for(int i=1;i<=n;i++)scanf("%d",&k[i]);ans[n]=f();for(int i=n-1;i>=1;i--){int x=p[k[i+1]];p[k[i+1]]=-1;if(vis[x]==1)ans[i]=f();else ans[i]=ans[i+1];}for(int i=1;i<=n;i++){printf("%d",ans[i]);printf("%c",i==n?'n':' ');}}return 0;
}

本文发布于:2024-01-31 16:18:14,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170668909429804.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:hdu   杭电多校六   Time   Nonsense
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23