Захопливі масиви#12460

Захопливі масиви (Розбір)

Автор задачі:

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;
    }
}