CF1702F

Equate Multisets - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

一道很妙的思维题:

此题的关于在认识到:奇数只能被除出来,不能被乘出来

认识到这点之后,我们把A,B中的所有偶数都除成一个奇数。

此时我们考虑,取出A中最大的奇数mxa 和 B中最大的奇数mxb

如果mxa > mxb ,显然没有构造方法

如果mxa = mxb ,这两个刚好相对应

如果mxa < mxb,此时mxb不能构造出mxa,我们把 mxb不断除2,直到变成一个新的奇数。

再重复上面的过程。我们可以用两个堆来维护上面的过程。

Code:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mp make_pair
#define pb push_back   //vector函数
#define popb pop_back  //vector函数
#define fi first
#define se second
const int N=1e5+10;
const int M=1e9;
//const int inf=0x3f3f3f3f;     //一般为int赋最大值,不用于memset中
//const ll INF=0x3ffffffffffff; //一般为ll赋最大值,不用于memset中
int T,n,a[N],b[N];
ll qp2;
pair<int,int> c[N];
vector< pair<int,int> > v[N];
unordered_map<int,int> id;
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    return x*f;
}
int main()
{
//    freopen("","r",stdin);
//    freopen("","w",stdout);
    T=read();
    while(T--)
    {
        n=read();
        priority_queue<int> a,b;
        for(int i=1;i<=n;i++) 
        {
            int x=read();
            while(x%2==0) x/=2;
            a.push(x);
        }
        for(int i=1;i<=n;i++) 
        {
            int x=read();
            while(x%2==0) x/=2;
            b.push(x);
        }
        bool ok=1;
        while(!a.empty()&&!b.empty())
        {
            int mxa=a.top(),mxb=b.top();
            a.pop();b.pop();
            if(mxa>mxb) { ok=0;break; }
            else if(mxa<mxb)
            {
                a.push(mxa);
                mxb/=2;
                while(mxb%2==0) mxb/=2;
                b.push(mxb); 
            }
        }
        if(ok) puts("YES");
        else puts("NO");
    }
    return 0;
}

 

posted @ 2023-01-29 23:39  QAQ啥也不会  阅读(6)  评论(0编辑  收藏  举报