求助,我先去睡了,明天七点半之前会看。
#include <bits/stdc++.h>
#define int long long
using namespace std;
namespace Enkindled_Hope{template<typename T>inline T read(){T x=0,w=1;char c=0;while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}while(c>='0'&&c<='9'){x=x*10+(c-'0');c=getchar();}return x*w;}template<typename T>inline void write(T x){if(x<0){x=-x;putchar('-');}if(x>9)write(x/10);putchar(x%10+'0');}inline int getInt(){return read<int>();}inline int putInt(int x,char c){write<int>(x),putchar(c);return 0;}const int mod=998244353;int pw(int a,int b,int p=mod){int res=1;while(b){if(b&1)res=res*a%p;a=a*a%p;b>>=1;}return res;}int exgcd(int a,int b,int&x,int&y){if(!b){x=1,y=0;return a;}int res=exgcd(b,a%b,y,x);y-=(a/b*x);return res;}int inv(int x,int p=mod){exgcd(x,p,x,*new int);return(x%p+p)%p;}}using namespace Enkindled_Hope;
const int N = 200005;
const int LOGN = 20;
int f[N][LOGN], n, q, a[N], lo2[N], b[N], tmp[N], ttmp[N];
void init(int a[]) {
for(int j = 1; (1 << j) <= n; j++) {
for(int i = 1; i + (1 << j) - 1 <= n; i++) {
f[i][j] = 0;
}
}
for(int i = 1; i <= n; i++) f[i][0] = a[i];
for(int j = 1; (1 << j) <= n; j++) {
for(int i = 1; i + (1 << j) - 1 <= n; i++) {
f[i][j] = max(f[i][j - 1], f[i + (1 << j - 1)][j - 1]);
}
}
}
int rmq(int l, int r) { return max(f[l][lo2[r - l + 1]], f[r - (1 << lo2[r - l + 1]) + 1][lo2[r - l + 1]]); }
int solve() {
n = getInt();
for(int i = 1; i <= n; i++) a[i] = getInt();
for(int i = 1; i <= n; i++) ttmp[i] = tmp[i] = b[i] = getInt();
sort(tmp + 1, tmp + n + 1);
for(int i = 1; i <= n; i++) b[i] = lower_bound(tmp + 1, tmp + n + 1, b[i]) - tmp;
map<int, int> tr;
for(int i = 1; i <= n; i++) tr[ttmp[i]] = b[i];
init(b);
int m = getInt();
map<int, int> mp;
for(int i = 1; i <= m; i++) { int x = getInt(); mp[x]++; }
for(int i = 1; i <= n; i++) {
if(ttmp[i] > a[i]) return puts("No");
}
for(int i = 1; i <= n; i++) {
if(ttmp[i] != a[i] && !mp[ttmp[i]]) return puts("No");
}
vector<int> G[n + 1];
for(int i = 1; i <= n; i++) {
if(a[i] != b[i]) G[b[i]].push_back(i);
}
for(auto x : mp) {
int X = tr[x.first], T = x.second;
if(X == 0) continue;
int s = 1;
for(int i = 1; i < G[X].size(); i++) {
if(rmq(G[X][i - 1], G[X][i]) > X) s++;
}
if(s > T) return puts("No");
}
puts("Yes");
return 0;
}
signed main() {
for(int i = 2; i < N; i++) lo2[i] = lo2[i >> 1] + 1;
int t = getInt();
while(t--) solve();
return 0;
}