创作乐曲

题目链接

  • 寻找性质优化DP:对于一个音高为\(a_i\)的音符,在最优解中,接在其后面的音符一定是离这个音符最近的音高在【\(a_i-k,a_i\)】或【\(a_i,a_i+k\)】内的音符
  • 这个音符是可以通过线段树预处理求出来的
点击查看代码
#include <bits/stdc++.h>
using namespace std;
long long a[100005],raw[100005],b[100005];
int A[100005],L[100005],R[100005],q1[100005],q2[100005];
unordered_map<long long,int>v;
int f[100005];
struct t1
{
	int l,r,v;
}t[17*100000+5];
int tot;
int New()
{
	tot++;
	t[tot].l=t[tot].r=0;
	t[tot].v=0;
	return tot;
}
void change(int p,int l,int r,int x,int va)
{
	if(l==r)
	{
		t[p].v=max(t[p].v,va);
		return; 
	}
	int mid=(l+r)>>1;
	if(x<=mid)
	{
		if(!t[p].l)
		{
			t[p].l=New();
		}
		change(t[p].l,l,mid,x,va);
	}
	else
	{
		if(!t[p].r)
		{
			t[p].r=New();
		}
		change(t[p].r,mid+1,r,x,va);
	}
	t[p].v=max(t[t[p].l].v,t[t[p].r].v);
}
int ask(int p,int l,int r,int u,int v)
{
	if(p==0)
	{
		return 0;
	}
	if(u<=l&&v>=r)
	{
		return t[p].v;
	}
	int mid=(l+r)>>1;
	int va=0;
	if(u<=mid)
	{
		va=max(va,ask(t[p].l,l,mid,u,v));
	}
	if(v>mid)
	{
		va=max(va,ask(t[p].r,mid+1,r,u,v));
	}
	return va;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	int T;
	cin>>T;
	while(T--)
	{
		int n;
		long long M,w;
		cin>>n>>M>>w;
		for(long long i=1;i<=n;i++)
		{
			cin>>a[i];
			b[i]=a[i];
		}
		sort(b+1,b+n+1);
		int m=unique(b+1,b+n+1)-(b+1);
		for(int i=1;i<=m;i++)
		{
			raw[i]=b[i];
			v[b[i]]=i;
		}
		tot=-1;
		tot=New();
		tot=New();
		for(int i=1;i<=n;i++)
		{
			A[i]=v[a[i]];
			L[i]=lower_bound(b+1,b+m+1,a[i]-w)-b;
			R[i]=upper_bound(b+1,b+m+1,a[i]+w)-b;
			R[i]--;
			q1[i]=ask(1,1,m,L[i],A[i]);
			q2[i]=ask(1,1,m,A[i],R[i]);
			change(1,1,m,A[i],i);
		}
		int Q;
		cin>>Q;
		for(int i=1;i<=Q;i++)
		{
			int l,r;
			cin>>l>>r;
			f[l]=1;
			int ans=1;
			for(int j=l+1;j<=r;j++)
			{
				if(q1[j]<l&&q2[j]<l)
				{
					f[j]=1;
				}
				else if(q1[j]<l)
				{
					f[j]=f[q2[j]]+1;
				}
				else if(q2[j]<l)
				{
					f[j]=f[q1[j]]+1;
				}
				else
				{
					f[j]=max(f[q1[j]]+1,f[q2[j]]+1);
				}
				ans=max(ans,f[j]);
			}
			cout<<(r-l+1)-ans<<endl;
		}
	}
	return 0;
}
posted @ 2024-08-11 17:05  D06  阅读(6)  评论(0编辑  收藏  举报