传送你们啊上帝哦请问

确 实 是 非 常 巧 妙 的 一 题 , 开 始 一 直 想 着 二 分 R M Q 什 么 的 确实是非常巧妙的一题,开始一直想着二分RMQ什么的 RMQ

实 际 上 直 接 模 拟 即 可 。 实际上直接模拟即可。

− − − − − − − − − − − − − − − 分 割 一 切 O ( ∩ ∩ ) O − − − − − − − − − − − \color{Orange}{---------------分割一切O(∩_∩)O-----------} O()O

贪 心 的 想 , 第 一 次 可 以 到 最 远 的 位 置 是 什 么 呢 ? 贪心的想,第一次可以到最远的位置是什么呢? ,?

我 们 可 以 预 处 理 出 体 力 为 x 时 力 量 的 最 大 值 记 作 b e t t e r [ x ] 我们可以预处理出体力为x时力量的最大值记作better[x] xbetter[x]

贪 心 的 时 候 , 先 试 一 下 打 死 1 只 怪 物 是 否 可 行 , 再 试 一 下 打 死 2 只 . . . . . . 贪心的时候,先试一下打死1只怪物是否可行,再试一下打死2只...... ,1,2......

反 正 只 要 b e e t e r [ x ] 大 于 路 上 打 败 的 怪 物 的 最 大 值 就 好 了 反正只要beeter[x]大于路上打败的怪物的最大值就好了 beeter[x]

一 旦 发 现 打 不 死 怪 物 了 , 就 不 要 继 续 了 , 因 为 b e e t e r 数 组 是 递 减 的 一旦发现打不死怪物了,就不要继续了,因为beeter数组是递减的 ,,beeter

#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+9;
int a[maxn],power[maxn],day[maxn],better[maxn],n,m;
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int flag=1;
		cin>>n;
		for(int i=1;i<=n;i++)	cin>>a[i];
		cin>>m;
		for(int i=0;i<=n;i++)	better[i]=0;
		for(int i=1;i<=m;i++)
		{
			cin>>power[i]>>day[i];
			better[day[i]]=max(better[day[i]],power[i]);
		}
		for(int i=n-1;i>=1;i--)
			better[i]=max(better[i],better[i+1]);
		int ans=0,pos=1;
		while(pos<=n)
		{
			ans++;
			int maxx=0,temp=pos;
			while(1)
			{
				maxx=max(maxx,a[temp]);
				if(better[temp-pos+1]<maxx)	break;
				temp++;
			}
			if(temp==pos)	{flag=0;break;}
			pos=temp;
		}
		if(flag==0)	cout<<-1<<endl;
		else cout<<ans<<endl;
	}
}