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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】