牛客,似花还似非花(dp优化)

Posted thusloop

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了牛客,似花还似非花(dp优化)相关的知识,希望对你有一定的参考价值。

似花还似非花
这个题实际上是求解两个排列的包含某一特定元素的情况下的最长公共子序列长度。
最长上升子序列用树状数组优化

//#pragma GCC optimize(2)
//#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
#define int long long
#define fi first
#define se second
#define pb push_back
#define pii pair<int,int>
#define yes cout<<"Yes\\n"
#define no cout<<"No\\n"
#define yesno if(fg)yes;else no;
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
const int inf=8e18;
const int maxn=2e5+100;
int a[maxn],b[maxn],c[maxn],c2[maxn],pos[maxn];
int dp[maxn],dp2[maxn];
int lowbit(int x)

	return x&(-x);

void update(int x,int val)

	while(x<maxn)
	
		c[x]=max(c[x],val);
		x+=lowbit(x);
	

void update2(int x,int val)

	while(x>0)
	
		c2[x]=max(c2[x],val);
		x-=lowbit(x);
	

int ask(int x)

	int ans=0;
	while(x>0)
	
		ans=max(ans,c[x]);
		x-=lowbit(x);
	
	return ans;

int ask2(int x)

	int ans=0;
	while(x<maxn)
	
		ans=max(ans,c2[x]);
		x+=lowbit(x);
	
	return ans;

signed main()

	IOS
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	
		int x;
		cin>>x;
		pos[x]=i;
	
	for(int i=1;i<=n;i++)
	
		int x;
		cin>>x;
		a[i]=pos[x];
		b[x]=i;
	
	for(int i=1;i<=n;i++)
	
		dp[i]=ask(a[i])+1;
		update(a[i],dp[i]);
	
	for(int i=n;i>=1;i--)
	
		dp2[i]=ask2(a[i])+1;
		update2(a[i],dp2[i]);
	

	int q;
	cin>>q;
	while(q--)
	
		int x;
		cin>>x;
		x=b[x];
		cout<<n-dp[x]-dp2[x]+1<<"\\n";
	


以上是关于牛客,似花还似非花(dp优化)的主要内容,如果未能解决你的问题,请参考以下文章

牛客,似花还似非花(dp优化)

一些诗词摘抄qwq

2021牛客多校6 - Gambling Monster(分治FWT优化期望dp)

牛客练习赛56 C.小魂和他的数列 树状数组优化dp

2021牛客暑期多校训练营1 I.Increasing Subsequence(期望,维护后缀和优化dp)

牛客练习赛85 F.音游家的谱面(Hard version)(dp的多种优化)