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

「杂题乱刷2」CF1615C Menorah

时间:2024-07-15 21:09:53浏览次数:9  
标签:Menorah -- s2 s1 sum1 sum0 CF1615C 杂题 define

题目链接

CF1615C Menorah (luogu)

CF1615C Menorah (codeforces)

解题思路

这题有三个重要的性质:

  1. 在同一个点做两次操作与不在这个点做操作是等价的。

  2. 给两个不同的点做操作等价于交换这两个点。

  3. 给一个字符串做偶数次操作,这个字符串的 \(0\) 的数量和 \(1\) 的数量不会改变。

知道这三个性质,这题就很好做了,直接分操作次数的奇偶性来讨论即可,详见代码。

时间复杂度 \(O(n)\)。

参考代码

点击查看代码
#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 IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
#define endl '\n'
#define QwQ return 0;
#define cfy cout<<"YES\n";
#define cfn cout<<"NO\n";
ll t;
/*
一个位置不会被做 2 次操作

100010111 --> 4 5 
111101000 --> 4 5
010010111 --> 4 5
101101100 --> 4 5 

100000000 --> 8 1
111111111 --> 0 9
010000000 --> 8 1
111111111 --> 0 9
*/
ll n;
string s1,s2,s3;
ll sum0,sum1,sum2,sum3,ans;
void solve()
{
	sum0=sum1=sum2=sum3=ans=0;
	ans=1e18;
	cin>>n>>s1>>s2;
	s1=' '+s1;
	s2=' '+s2;
	forl(i,1,n)
		sum0+=s1[i]=='0',sum1+=s1[i]!='0';
	forl(i,1,n)
		sum2+=s2[i]=='0',sum3+=s2[i]!='0';
	if(sum0==sum2 && sum1==0)
	{
		cout<<0<<endl;
		return ;
	}
	else if(sum1==0)
	{
		cout<<-1<<endl;
		return ;
	}
	ll ke1=sum0+1,ke0=n-ke1;
//	cout<<ke0<<' '<<ke1<<endl; 
	if(!((sum0==sum2 && sum1==sum3) || (ke0==sum2 && ke1==sum3)))
	{
		cout<<-1<<endl;
		return ;
	}
	s3=s1;
	forl(i,1,n)
	{
		if(s3[i]=='0')
			s3[i]='1';
		else
			s3[i]='0';
	}
	if(sum0==sum2 && sum1==sum3)
	{
		ll sum=0;
		forl(i,1,n)
			if(s1[i]!=s2[i])
				sum++;
		ans=min(ans,sum);
	}
	if(ke0==sum2 && ke1==sum3)
	{
		ll sum=0;
		forl(i,1,n)
			if(s3[i]!=s2[i])
				sum++;
		ans=min(ans,sum);
	}
	cout<<ans<<endl;
}
int main()
{
	IOS;
	t=1;
 	cin>>t;
	while(t--)
		solve();
	QwQ;
}

标签:Menorah,--,s2,s1,sum1,sum0,CF1615C,杂题,define
From: https://www.cnblogs.com/wangmarui/p/18303960

相关文章

  • 「杂题乱刷2」CF1015D Walking Between Houses
    duel到的。题目链接CF1015DWalkingBetweenHouses解题思路一道细节题。思路很简单,肯定是一开始能走的越多越好,因此就有一种较好实现的方案,先每次走\(n-1\)格,但由于每次至少要走一格,因此如果不够走了就把能走的都走掉,之后全走\(1\)步即可。时间复杂度\(O(k)\)。参......
  • 「杂题乱刷2」CF727D
    duel到的。题目链接CF727D解题思路首先只能选一个尺码的人直接给就是了,这样我们就只用考虑选两个尺码的人了。因为两个尺码的人适合的两个尺码是相邻的,因此我们直接从小到大按照有两个尺码的人排序,再将剩下的衣服大小从小到大排序,然后依次给就可以了。这里我用了桶排,时间复......
  • 「杂题乱刷2」CF1506E Restoring the Permutation
    duel到的。题目链接CF1506E解题思路有一个显然的性质就是这个序列的前缀最大值是单调不降的。于是我们就可以对于每个位置考虑还可以填哪些数,对于字典序最小的肯定填当时可填的最小数字,对于字典序最大的肯定填当时可填的最大数字,因为你可以通过填一个数的方式来满足要求,因此......
  • Spark Special_杨宁远 杂题分析.md
    SparkSpecial图论_杨宁远杂题分析Date:2024-07-03Preface本文基于杨宁远@ynycoding的课件与题单,对省选/NOIP阶段图论的建模方法和解题策略进行总结,以及本阶段常用方法、模型和Trick。A.[AGC056C]0/1Balanced[AGC056C]01Balanced-洛谷|计算机科学教育新生态(......
  • 「杂题乱刷2」CF402D Upgrading Array
    题目链接CF402DUpgradingArray(luogu)CF402DUpgradingArray解题思路首先有一个很显然的结论,就是你一旦在第\(i\)个位置上做了一次操作后,那么你之后所有在第\(j(i\lej)\)个位置做的操作都无效了,因为此时前缀的公因数为\(1\)了。因此有个很显然的结论就是操作需要......
  • 「杂题乱刷2」CF1454F Array Partition
    题目链接CF1454FArrayPartition解题思路我们发现显然第一个和第三个区间的值区间随着长度的增大而增大。于是我们就可以枚举第一个区间的右端点位置,然后现在问题就转化成了找到一个断点来确定第二,三个区间的长度,由于前文提到的第三个区间的值区间随着长度的增大而增大,于是我......
  • 24.7 杂题
    时隔一年啊,不会复建、、、[HNOI2012]与非这个\(\operatorname{NAND}\)实际上可以做出任何位运算操作。而所有的位运算有一个性质,就是说如果两个位一样,那么操作完还是一样的。如果全部\(a\)中这些位置都相同,那么最后理应也相同。也就是假设对于所有\(n\)个\(a\),这两个位......
  • 2024.7.5杂题选讲
    前情提要:题解尽可能的写详细了,但是有些证明写着太费时间就没写了喵本来\(pyb\)想让我弄一个数据结构专题,结果发现我前阵子做的那些列表里的题,每一个的提交记录里都有\(jsy\),很多题里有\(xcy\)。。。实在整不出什么花活了,太菜了没做啥大家都没做过的题qwq,完全的水题选讲关注Luo......
  • 「杂题乱刷2」CF1702F
    哎哎哎,题解区里怎么没我的做法啊/yun。于是就有了这篇题解。题目链接CF1702FEquateMultisets(luogu)CF1702FEquateMultisets(codeforces)解题思路首先我们发现,\(a\)序列中的数字的末尾的\(0\)是无意义的,因此我们可以将\(a\)序列中的每一个数字一直除以\(2\)直......
  • 「杂题乱刷2」CF607B
    代码恢复训练2024.7.2.链接(codeforces)链接(luogu)一道很基础的区间dp。只讲状态定义,\(dp_{i,j}\)表示\(i\simj\)区间需要的最少消除次数。时间复杂度\(O(n^2)\)。点击查看代码/*Tips:你数组开小了吗?你MLE了吗?你觉得是贪心,是不是该想想dp?一个小时没调出来......