C. Fishingprince Plays With Array
题意
题意:给我们一个含有n个元素的数组a,然后再给我们一个含有k个元素的数组b,我们可以对于任何一个元素都相等并且,长度是m的序列进行合并操作,或者分解操作。比如,我们的m=3,我们就可以将3,3,3合并成9,但是3,3就不能合并成6,因,3,3,不够m个。分解也是如此我们必须把规定的数分解成,全部相等的m个数。问我们是否有可能把前面的a数组化成b数组。
思路
思路:对于这个题来说的话,我们首先按照上述的操作硬凑是肯定不行的,所以我们可以把a和b数组能分解的数,全部分解,这样的话我们最后判断一下两个数组里面的数是否完全相同就可以了,但是数据范围比较大开不了这么大的空间,所以我们需要开pair一个存数,另一个存个数这样的话就会小很多。
AC代码
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 5e4 + 10;
void solve()
{
vector<pair<LL, LL>> a, b;
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
LL x;
cin >> x;
LL cnt = 1;
while (x % m == 0)
{
cnt *= m;
x /= m;
}
if (a.empty() || a.back().first != x)
a.push_back(make_pair(x, cnt));
else
a.back().second += cnt;
}
int k;
cin >> k;
for (int i = 1; i <= k; i++)
{
LL x;
cin >> x;
LL cnt = 1;
while (x % m == 0)
{
cnt *= m;
x /= m;
}
if (b.empty() || b.back().first != x)
b.push_back(make_pair(x, cnt));
else
b.back().second += cnt;
}
if (a == b)
cout << "Yes" << endl;
else
cout << "No" << endl;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int T;
cin >> T;
while (T--)
{
solve();
}
return 0;
}