题目链接
思路:解题关键是十天能完成的两天肯定也可以,取最大值。
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
typedef long long ll;
ll u,v,a[maxn],b[maxn];
int main()
{
int T,n,m;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%lld",&a[i]);
scanf("%d",&m);
while(m--){
scanf("%lld%lld",&u,&v);
b[v]=max(b[v],u);
}
for(int i=n;i>=1;--i) b[i]=max(b[i],b[i+1]);//精华所在
ll ans=0,now=1,pos=1,cnt,flag=0;
while(pos<=n)
{
ans++;
cnt=0;
now=pos;
while(1)
{
cnt=max(cnt,a[now]);
if(cnt>b[now-pos+1]) break;
now++;
}
if(now==pos) {flag=1;break;}
pos=now;
}
printf("%lld\n",flag?-1:ans);
for(int i=1;i<=n;++i) b[i]=0;
}
}