首页 > 其他分享 >「杂题乱刷2」CF1702F

「杂题乱刷2」CF1702F

时间:2024-07-03 17:20:47浏览次数:15  
标签:forl CF1702F cin long 序列 杂题 ll define

哎哎哎,题解区里怎么没我的做法啊 /yun。

于是就有了这篇题解。

题目链接

CF1702F Equate Multisets (luogu)

CF1702F Equate Multisets (codeforces)

解题思路

首先我们发现,\(a\) 序列中的数字的末尾的 \(0\) 是无意义的,因此我们可以将 \(a\) 序列中的每一个数字一直除以 \(2\) 直到这个数字为奇数。

我们发现,将 \(b\) 序列的数字一直乘上 \(2\) 是一定没有损失的,于是我们首先肯定是通过将 \(b\) 序列的数字乘 \(2\) 的方式与 \(a\) 序列中的数字匹配的。

处理完乘的操作,同样地,我们可以通过一直将 \(b\) 序列中的数字一直除以 \(2\) 直到匹配的方式来处理除的操作。

无解的情况很好判断,只需要判断是否最终均可以匹配即可。

时间复杂度 \(O(n \log_2 V)\),其中 \(V\) 为值域。

参考代码

点击查看代码
#include<bits/stdc++.h>
using namespace std;
//#define map unordered_map
#define re register
#define ll long long
#define forl(i,a,b) for(re ll i=a;i<=b;i++)
#define forr(i,a,b) for(re ll i=a;i>=b;i--)
#define forll(i,a,b,c) for(re ll i=a;i<=b;i+=c)
#define forrr(i,a,b,c) for(re ll i=a;i>=b;i-=c)
#define lc(x) x<<1
#define rc(x) x<<1|1
#define mid ((l+r)>>1)
#define cin(x) scanf("%lld",&x)
#define cout(x) printf("%lld",x)
#define lowbit(x) (x&-x)
#define pb push_back
#define pf push_front
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define endl '\n'
#define QwQ return 0;
#define db long double
#define ull unsigned long long
#define lcm(x,y) x/__gcd(x,y)*y
#define Sum(x,y) 1ll*(x+y)*(y-x+1)/2
#define aty cout<<"Yes\n";
#define atn cout<<"No\n";
#define cfy cout<<"YES\n";
#define cfn cout<<"NO\n";
#define xxy cout<<"yes\n";
#define xxn cout<<"no\n";
#define printcf(x) x?cout<<"YES\n":cout<<"NO\n";
#define printat(x) x?cout<<"Yes\n":cout<<"No\n";
#define printxx(x) x?cout<<"yes\n":cout<<"no\n";
ll t;
/*
显然先做乘法再做除法。 
*/
ll n;
ll a[1000010],b[1000010];
map<ll,ll>mp;
ll vis[1000010]; 
void solve()
{
	mp.clear();
	cin>>n;
	forl(i,1,n)
	{
		cin>>a[i];
		while(a[i]%2==0)
			a[i]/=2;
	}
	forl(i,1,n)
		cin>>b[i],vis[i]=0;
	sort(a+1,a+1+n);
	sort(b+1,b+1+n);
	forl(i,1,n)
		mp[a[i]]++;
	forl(i,1,n)
	{
		ll num=b[i],lst=-1;
		while(num<=5e9)
		{
			if(mp[num])
				lst=num;
			num*=2;
		}
		if(lst!=-1)
			mp[lst]--,vis[i]=1;
	}
	forl(i,1,n)
		if(!vis[i])
		{
			ll num=b[i],pd=0;
			while(num>0)
			{
				num/=2;
				if(mp[num])
				{
					pd=1;
					mp[num]--;
					vis[i]=1;
					break;
				}
			}
		}
	forl(i,1,n)
		if(!vis[i])
		{
			cfn;
			return ;
		}
	cfy;
}
int main()
{
	IOS;
	t=1;
 	cin>>t;
	while(t--)
		solve();
	QwQ;
}

标签:forl,CF1702F,cin,long,序列,杂题,ll,define
From: https://www.cnblogs.com/wangmarui/p/18282219

相关文章

  • 「杂题乱刷2」CF607B
    代码恢复训练2024.7.2.链接(codeforces)链接(luogu)一道很基础的区间dp。只讲状态定义,\(dp_{i,j}\)表示\(i\simj\)区间需要的最少消除次数。时间复杂度\(O(n^2)\)。点击查看代码/*Tips:你数组开小了吗?你MLE了吗?你觉得是贪心,是不是该想想dp?一个小时没调出来......
  • 「杂题乱刷」AT_abc360_d
    题目链接AT_abc360_d(luogu)AT_abc360_d(atcoder)解题思路一个性质是,往左边走的蚂蚁无论怎么样都追不到左边的蚂蚁,而往右边走的蚂蚁无论怎么样都追不上右边的蚂蚁。因此我们考虑将蚂蚁分为往左往右走的两堆。发现对于每个蚂蚁都能走过一段区间,因此直接二分将右端点减去左......
  • 「杂题乱刷」P10678
    哎哎哎,原来的题解没怎么写证明被叉了/yun所以我来补下证明。题目链接P10678『STA-R6』月解题思路时间复杂度优于官解的做法。首先我们观察到一个性质就是\(\suma_i=2\times(n-1)\),因为一个树有\(n-1\)条边。注意到一棵树必定有叶子结点。于是我们每次给树......
  • 杂题乱刷1
    杂题乱刷目录杂题乱刷P7231COCI2015-2016#3]DOMINOCF888GXor-MSTCF1886E题目大意solutionCF1209G2IntoBlocks(hardversion)题目大意solutionCSP-S2019Emiya家今天的饭题目大意preface正解WhatIhavegotP4151[WC2011]最大XOR和路径[CF510D]FoxAndJumping题目大意so......
  • 杂题乱刷2
    杂题乱刷目录杂题乱刷P10141[USACO24JAN]MergingCellsP题目大意solutionP4770[NOI2018]你的名字题目大意CF1037HSecurity[ABC215G]ColorfulCandies2题目描述solution[USACO24FEB]LazyCowP题目描述solutionP1410子序列&P4728[HNOI2009]双递增序列题目大意solution......
  • 「杂题乱刷」AT_abc358_g
    代码恢复训练2024.6.15(补)链接(luogu)链接(atcoder)abc最水的G了吧。你发现,你最后肯定全在在同一个点上不动,而且你一定可以在\(n\timesm\)回合内走到这个点,因此我们直接\(dp_{i,x,y}\)表示走\(i\)步到\((x,y)\)这个格子所能得到的最大值即可。时间复杂度\(O(......
  • 2024年6月杂题乱写
    6.5P3214[HNOI2011]卡农设\(f_i\)表示选了\(m\)个集合的答案,简单观察发现,只要确定了\(m-1\)个集合,最后一个集合就是确定的,不是偶数次数的出现,偶数次数的不出现,选\(m\)个集合有\(C_{2^n-1}^{m-1}\)种方案,考虑下面两种不合法的情况。这\(m-1\)个集合已经合法,最后......
  • 「杂题乱刷」AT_abc161_d
    代码恢复训练2024.6.14.bfs板子题。链接(luogu)链接(atcoder)代码:点击查看代码/*Tips:你数组开小了吗?你MLE了吗?你觉得是贪心,是不是该想想dp?一个小时没调出来,是不是该考虑换题?打cf不要用umap!!!记住,rating是身外之物。该冲正解时冲正解!Problem:算法:思......
  • 「杂题乱刷」CF1985F
    代码恢复训练2024.6.13.题目链接CF1985F(CF)CF1985F(luogu)解题思路由于一个回合可以用所有无冷却的技能,因此我们对于技能肯定是能用就用的。进而推出答案具有单调性。直接二分答案即可,注意二分边界问题,这里我开了__int128来避免这个问题。参考代码点击查看代码#i......
  • 杂题选讲 #1:二分图边着色
    Vizing定理定义考虑如下的问题:对一个无向图的边进行着色,要求相邻的边染不同种颜色。问需要的最少的颜色数是多少。解决上述问题需要借助Vizing定理(又称维金定理)。在开始之前,我们先进行一些符号的规定。\(\Delta(G)\):无向图\(G=(V,E)\)的最大度数,即\(\Delta(G)=\max_......