一个0,一个80 求助
查看原帖
一个0,一个80 求助
1037997
_TGWQ12_楼主2024/3/30 15:38

0分

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5,M=1e6+5;
int f[N][3];
			
int a[N],n,ans,k,maxs;
int b[N],c[N];
int sz[M][3];//树状数组
int lowbit(int x)
{
	return x&(-x);
}
int da(int x,int t)
{
	int p=0;
	for(;x;x-=lowbit(x)) p=max(p,sz[x][t]);
	return p;	
} 
void gai(int x,int y,int t)
{
	if(x==0) x++; 
	for(int i=x;i<M;i+=lowbit(i))
		sz[i][t]=max(sz[i][t],y);
}
int main()
{

	cin>>n>>k;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	for(int i=1;i<=n;i++)
	{
		int o=da(a[i],1)+1;
		b[i]=max(b[i-1],o);
		gai(a[i],o,1);
	}
	for(int i=n;i>=1;i--)
	{
		int o=da(M-a[i],2)+1;
		c[i]=max(c[i+1],o);
		gai(M-a[i],o,2);
	}
	//for(int i=1;i<=n;i++) cout<<b[i]<<' '<<c[i]<<'\n';
	for(int i=0,j=i+k+1;j<=n;i++,j++)
	{
		ans=max(ans,b[i]+c[j]+k);
	}
		
	cout<<ans; 
 	return 0;
}
/*
7 2
11 45 99 19 19 88 100

*/

80分

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5,M=1e6+5;
int dp[N][4];//dp[i][0]没使用过技能最长序列
			//dp[i][1]使用过技能最长序列
			
int a[N],n,ans,k,b[N],maxs;

int sz[M][3];//树状数组
int lowbit(int x)
{
	return x&(-x);
}
int da(int x,int t)
{
	int p=0;
	for(;x;x-=lowbit(x)) p=max(p,sz[x][t]);
	return p;	
} 
void gai(int x,int y,int t)
{
	for(int i=x;i<=maxs;i+=lowbit(i))
	{
		sz[i][t]=max(sz[i][t],y);
	}
		
}
int main()
{

	cin>>n>>k;
	for(int i=1;i<=n;i++)
		cin>>a[i],maxs=max(maxs,a[i]);
	
	for(int i=1;i<=n;i++)
	{
		dp[i][0]=dp[i][1]=1;
		gai(a[i],1,0);
		gai(a[i],1,1);
		int o=da(a[i],0),
			p=da(a[i],1);
		dp[i][0]=o+1;
		dp[i][1]=p+1;
		if(i-k>=1&&a[i-k]<=a[i])
			dp[i][1]=max(dp[i][1],dp[i-k][0]+k);
		gai(a[i],dp[i][1],1);
		gai(a[i],dp[i][0],0);
		
		ans=max(max(dp[i][1],dp[i][0]),ans);
	}
	cout<<ans; 
 	return 0;
}
/*
7 2
11 45 99 19 19 88 100

*/
2024/3/30 15:38
加载中...