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