Автор задачі: | Hasan Saleh (MathModel) |
Підготував: | Hadi Takla (TaklaOI) |
Відредагував: | Hadi Takla (TaklaOI) |
Розв'язок
Факт 1 : оскільки ми можемо застосовувати операцію будь-яку кількість разів , ми можемо переставляти обидва масиви як завгодно.
Умова [a_1 , a_2 , ... , a_n] = [b_1 , b_2 , ... , b_i] для кожного (1 \le i \le \text{min}(n,m)) означає, що довжина найдовшого спільного префікса між та має дорівнювати \text{min}(n,m).
Тепер нехай — довжина найдовшого спільного префікса, freq[x][0] — частота числа у масиві , а freq[x][1] — частота числа у масиві .
Тепер, якщо ми хочемо збільшити на , використовуючи значення , ми повинні взяти елементів зі значенням з масиву та елементів зі значенням з масиву ; максимальне , яке ми можемо отримати, дорівнює \text{min}(freq[x][0] , freq[x][1]), тому кожне число збільшує на \text{min}(freq[x][0] , freq[x][1]).
Після використання всіх чисел , де (1 \le x \le n+m), якщо дорівнює \text{min}(n,m), відповідь — «YES», інакше — «NO».
Часова складність : \mathcal{O}(n+m).
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
#define F first
#define S second
using namespace std;
const int N = 2e5 + 1;
const int M = 1e9 + 7;
signed main()
{
ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int tc = 1;
cin>>tc;
while(tc--)
{
int n,m;
cin>>n>>m;
int freq[n+m+1][2] , len = 0;
memset(freq , 0 , sizeof freq);
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
freq[x][0]++;
}
for(int i=1;i<=m;i++)
{
int x;
cin>>x;
freq[x][1]++;
}
for(int i=1;i<=n+m;i++)
{
len += min(freq[i][0] , freq[i][1]);
}
cout<<(len == min(n , m) ? "YES" : "NO")<<endl;
}
}