确 实 是 非 常 巧 妙 的 一 题 , 开 始 一 直 想 着 二 分 R M Q 什 么 的 确实是非常巧妙的一题,开始一直想着二分RMQ什么的 确实是非常巧妙的一题,开始一直想着二分RMQ什么的
实 际 上 直 接 模 拟 即 可 。 实际上直接模拟即可。 实际上直接模拟即可。
− − − − − − − − − − − − − − − 分 割 一 切 O ( ∩ ∩ ) O − − − − − − − − − − − \color{Orange}{---------------分割一切O(∩_∩)O-----------} −−−−−−−−−−−−−−−分割一切O(∩∩)O−−−−−−−−−−−
贪 心 的 想 , 第 一 次 可 以 到 最 远 的 位 置 是 什 么 呢 ? 贪心的想,第一次可以到最远的位置是什么呢? 贪心的想,第一次可以到最远的位置是什么呢?
我 们 可 以 预 处 理 出 体 力 为 x 时 力 量 的 最 大 值 记 作 b e t t e r [ x ] 我们可以预处理出体力为x时力量的最大值记作better[x] 我们可以预处理出体力为x时力量的最大值记作better[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;
}
}