CF-D题求助
  • 板块灌水区
  • 楼主__ycx2010__
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/1/4 01:28
  • 上次更新2023/10/24 05:38:53
查看原帖
CF-D题求助
819929
__ycx2010__楼主2023/1/4 01:28

用st表维护,wa on test2

#pragma GCC optimize(2)
#include <bits/stdc++.h>

using namespace std;

const int N = 200010;
int a[N], b[N];
int st[N][25];

void solve()
{
	unordered_map<int, vector<int>> S;
	unordered_map<int, int> Have;
 	int n, m;
 	scanf("%d", &n);
 	for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);	
 	for (int i = 1; i <= n; i ++ ) scanf("%d", &b[i]);
	scanf("%d", &m);
	for (int i = 1, y; i <= m; i ++ )
	{
		scanf("%d", &y);
		Have[y] ++ ;
	}
 	for (int i = 1; i <= n; i ++ )
 		if (a[i] < b[i])
 		{
 			puts("NO");
 			return;
		}
	for (int i = 1; i <= n; i ++ )
	{
		st[i][0] = b[i];
		for (int j = 1; j <= 20; j ++ )
			if (i - (1 << j) >= 0)
				st[i][j] = max(st[i][j - 1], st[i - (1 << j - 1)][j - 1]);
	}
	for (int i = 1; i <= n; i ++ )
	{
		if (S[b[i]].size() == 0) 
		{
			S[b[i]].push_back(i);
			if (a[i] == b[i]) continue;
			Have[b[i]] -- ;
			if (Have[b[i]] < 0)
			{
 				puts("NO");
 				return;				
			}
			continue;
		}
		if (S[b[i]].back() + 1 == i) continue;
		int l = S[b[i]].back() + 1;
		int g = (int)log2(i - l);
		int h = max(st[i - 1][g], st[l + (1 << g) - 1][g]);
		if (h > b[i]) 
		{
			S[b[i]].push_back(i);
			if (a[i] == b[i]) continue;
			Have[b[i]] -- ;
			if (Have[b[i]] < 0)
			{
 				puts("NO");
 				return;				
			}
		}
	}
	puts("YES");
}

int main()
{
 	int T;
 	scanf("%d", &T);
 	while (T -- ) solve();
 	return 0;
}

2023/1/4 01:28
加载中...