D. Yet Another Monster Killing Problem


昨天打的我好困,,,写到后面实在撑不住了早早溜掉了,,,

D题当时迷迷糊糊想到了一个做法,大致思路就是排序+后缀数组(但是我好困摔(′д` )…彡…彡,觉得有点绕就屁颠屁颠去写E了摔
遍历怪物,检查从当前怪物走最远能走到哪里,
记录前一步怪物的位置,对每一个怪物检查当前战斗力大于等于当前路径上怪物最大战斗力的英雄的最大持久力是否大于当前需要走的步数。
int n,m;
int a[MAXN],x[MAXN],f[MAXN];//
pii b[MAXN];
void solve()
{
	rd(n);
	for (int i = 1; i <= n ; ++i)  rd(a[i]);	
	rd(m);
	for (int i = 1; i <= m; ++i)  rd(b[i].fi),rd(b[i].se),x[i]=b[i].fi;	
	sort(b+1,b+m+1);sort(x,x+1+m);
	f[m+1]=0;
	for(int i=m;i>=1;--i) f[i]=max(f[i+1],b[i].se);//后缀最大值
	for (int i = 1; i <=n; ++i)
	{
		if(a[i]>x[m])
		{
			printf("-1\n");
			return ;
		}
	}
	int ans=0;
	for(int i=1;i<=n;++i)
	{
		++ans;
		int j=i;
		int val=a[i];
		while(j<=n)
		{
			int vt = lower_bound(x + 1, x + m + 1,val) - x;
			if(f[vt]<j-i+1) break;
			++j;
			val=max(val,a[j]);
		}
		i=j-1;
	}
	cout << ans << '\n';
}
int main()
{

	int t;rd(t);
	while(t--) solve();
    return  0;
}

E. The Contest


是个很好玩的思维题
每次操作可以把一个数字从一个数列移动到另一个数列,
最后要使数列整体有序(第一个数列的值是最小的几个数,第三个数列的数是最大的几个数),
而且最后的数列数可以是1,2,3个;
问最小的操作数;
最后得到的肯定是1,2,3,4,5,6。。n
设这个大数组为v
dp[i][x]表示到 i 位置,当前位置为第 x 数列的操作最小值