首页 > 其他分享 >Codeforces Round #807 (Div. 2) - D. Mark and Lightbulbs

Codeforces Round #807 (Div. 2) - D. Mark and Lightbulbs

时间:2022-09-21 00:22:47浏览次数:103  
标签:Lightbulbs cin int tt Codeforces Mark ss abs include

思维

Problem - D - Codeforces

题意

给两个长度为 \(n(3<=n<=2*10^5)\) 的 01 串 s 与 t,求最小操作次数,使 s 变成 t;不存在则输出 -1

操作为:对于 2 <= i <= n - 1, 若 \(s_{i-1}\neq s_{i+1}\), 则 \(s_i\) 反转

思路

  1. 这种思维题一半需要从操作的特殊性质、操作前后序列的不变性入手
  2. 分析各种操作,一共有 4 种
    1. 001 -> 011
    2. 011 -> 001
    3. 100 -> 110
    4. 110 -> 100
  3. 位置 1 和 n 永远不会改变,所有若 \(s_1\neq t_1或s_n\neq t_n\) 则返回 -1
  4. 这里可能需要经验或者灵机一动了,反正我是想不出来。。。

令 \(a_i=s_i \oplus s_{i+1}\), 记 \(ss_i\)为 s 的特征数组,上述 4 种操作只有两种情况,即 01 -> 10 与 10 -> 01

类似地,求出 t 的特征数组 \(tt_i\), 当且仅当 ss 与 tt 中的 1 数目相同时有解

  1. 因为 \(s_1=t_1\), 若两个特征数组相等,则 s == t, 所以把 s 变成 t 等价于 把 ss 变为 tt

  2. 把 ss 中的 1 的位置记到 a 数组中,tt 中 1 的位置记到 b 数组中

  3. 每次操作可看作是 a 中的 1 在向左或右移动,但永远无法跨过另一个1,因此 a 中的 1 与 b 中的 1 是一一对应的

操作数为 \(\sum abs(a_i-b_i)\)

代码

#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>

using namespace std;
#define endl "\n"

typedef long long ll;
typedef pair<int, int> PII;

const int N = 2e5 + 10;
int n;
string s, t;


ll solve()
{
	if (s[1] != t[1] || s[n] != t[n])
		return -1;
	vector<int> a, b;
	for (int i = 1; i < n; i++)
	{
		if (abs(s[i+1] - s[i]) == 1)
			a.push_back(i);
		if (abs(t[i+1] - t[i]) == 1)
			b.push_back(i);
	}
	if (a.size() != b.size())
		return -1;
	ll ans = 0;
	for (int i = 0; i < a.size(); i++)
		ans += abs(a[i] - b[i]);
	return ans;
}
int main()
{
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	int T;
	cin >> T;
	while(T--)
	{
		cin >> n;
		cin >> s >> t;
		s = " " + s, t = " " + t;
		cout << solve() << endl;
	}
    return 0;
}

标签:Lightbulbs,cin,int,tt,Codeforces,Mark,ss,abs,include
From: https://www.cnblogs.com/hzy717zsy/p/16714197.html

相关文章

  • Codeforces Round #820 (Div. 3) G. Cut Substrings
    DPProblem-G-Codeforces题意给一个长度为\(n(1<=n<=500)\)的主串s,一个长度为\(m(1<=m<=500)\)的模式串t,每次可以将当前的s中与t相同的子串变成一串"."(如......
  • MarkDown学习
    MarkDown学习二级标题三级标题四级标题 字体hallo,world!hallo,world!hallo,world!hallo,world!引用学习MarkDown,努力学习IT。分割线图片![截图][https://i03pi......
  • Codeforces Round #821 (Div. 2) ABCD1
    A.ConsecutiveSumhttps://codeforces.com/contest/1733/problem/A题目大意:给定一个长度为n的数组a。最多可以执行k次以下操作:选择两个指数i和j,其中imodk=jmodk......
  • CSDN(markdown模式下)如何调整图片大小以及如何调整位置
    版权声明:本文为CSDN博主「圣喵」的原创文章,遵循CC4.0BY-SA版权协议,转载请附上原文出处链接及本声明。原文链接:https://blog.csdn.net/m0_66769266/article/details/1240......
  • Codeforces Round #821(Div.2) (A-C) 题解
    CodeforcesRound#821(Div.2)(A-C)  A.ConsecutiveSum大致题意给定一组共n个数据,如果俩个数的下标在modk意义下同余,则可以交换a[I]和a[j] ,求操作后一段......
  • Codeforces Round #821 (Div. 2)(持续更新)
    Preface唉LOL打到一半被迫营业开打,感觉这算是第一次自己认真的在线打CF,以我的老年人手速感觉要罚时飞起了10:35开始打到12:10顶不住了睡觉去了,E大概看了个题感觉挺有意思的......
  • Codeforces Round #819 (Div. 1 + Div. 2) and Grimoire of Code Annual Contest 2022
    Preface明天的CF一定打啊(绝对不咕),今天白天补现代作业,英语作业到哭,而且还要准备四六级,每天逼着自己背单词A.MainakandArray不难发现换中间的数不会影响答案,因此操作......
  • Codeforces Round #821 D2
    D2.Zero-One(HardVersion)我们由D1可知当我们的y小于x/2时我们可以用2y来减小相邻的cost那我们考虑要是y比较大的时候我们也可以用多个x来减小cost我们可以轻松的......
  • 博客和MarkDown
    使用typora工具编辑1.标题一级标题二级标题三级标题四级标题五级标题六级标题字体****粗体斜体~删除线引用分割线图片超链接标题列表有......
  • Codeforces Round #821 (Div. 2)
    CodeforcesRound#821(Div.2)C.ParityShuffleSorting题目大意每次操作可以选择l,r,如果\(a_l+a_r\)是奇数可以让\(a_l=a_r\),否则可以让\(a_l=a_r\),要求使用不超过n......