首页 > 其他分享 >[ARC155C] Even Sum Triplet 题解

[ARC155C] Even Sum Triplet 题解

时间:2024-01-22 22:45:15浏览次数:24  
标签:Even ARC155C return 奇数 int 题解 交换 偶数 false

一道大分类讨论。

如果有一个可以交换的段包含奇数,那么你可以把所有奇数移到最左边并任意调整相对顺序,然后回到任意一种有一个可以交换的段包含奇数的状态。这种情况,如果偶数的数量为 \(2\),这两个偶数是不能交换相对位置的,有至少 \(3\) 个偶数就能交换偶数间相对位置。所以只需要判断 \(a\) 和 \(b\) 中的数是否相同以及两个偶数的相对位置即可。

如果没有一个可以交换的段包含奇数,则所有奇数都不能移动,同时奇数把整个序列分成几段,每一段中如果只有 \(2\) 个偶数,那不能移动;如果有至少 \(3\) 个偶数,那么块内的偶数是可以移动的。所以要判断 \(a\) 是奇数的位置和 \(b\) 是否相同,然后在每一段内判断 \(a\) 和 \(b\) 中的数是否相同以及两个偶数的段是否位置对应相同。

#include <bits/stdc++.h>

using namespace std;

const int N = 2e5 + 5;

int n, a[N], b[N];
int cnt[N];

bool check(int l, int r)
{
	if(l > r) return false;
	if(l == r && a[l] == a[r]) return false;
	if(r - l == 1)
	{
		if(a[l] == b[l] && a[r] == b[r]) return false;
		else return true;
	}
	for(int i = l; i <= r; i ++ ) cnt[a[i]] ++ ;
	for(int i = l; i <= r; i ++ )
	{
		if(!cnt[b[i]]) return true;
		cnt[b[i]] -- ;
	}
	return false;
}

int main()
{
	scanf("%d", &n);
	for(int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);
	for(int i = 1; i <= n; i ++ ) scanf("%d", &b[i]);
	
	bool flag = true;
	for(int i = 1; i <= n - 2; i ++ )
		if((a[i] + a[i + 1] + a[i + 2]) % 2 == 0 && (a[i] % 2 || a[i + 1] % 2))
			flag = false;
	
	if(flag)
	{
		for(int i = 1; i <= n; i ++ )
			if(a[i] % 2 && a[i] != b[i])
			{
				puts("No");
				return 0;
			}
		int l = 1;
		for(int i = 1; i <= n; i ++ )
			if(a[i] % 2)
			{
				if(check(l, i - 1))
				{
					puts("No");
					return 0;
				}
				l = i + 1;
			}
		if(check(l, n)) puts("No");
		else puts("Yes");
	}
	else
	{
		if(check(1, n)) puts("No");
		else
		{
			bool flag = true;
			for(int i = 1; i <= n - 2; i ++ )
				if((b[i] + b[i + 1] + b[i + 2]) % 2 == 0 && (b[i] % 2 || b[i + 1] % 2))
					flag = false;
			if(flag) puts("No");
			else
			{
				int oc = 0;
				for(int i = 1; i <= n; i ++ )
					if(a[i] % 2 == 0)
						oc ++ ;
				if(oc != 2) puts("Yes");
				else
				{
					int fo;
					for(int i = 1; i <= n; i ++ )
						if(a[i] % 2 == 0)
						{
							fo = a[i];
							break;
						}
					for(int i = 1; i <= n; i ++ )
						if(b[i] % 2 == 0)
						{
							if(b[i] == fo) puts("Yes");
							else puts("No");
							return 0;
						}
				}
			}
		}
	}
	return 0;
}

标签:Even,ARC155C,return,奇数,int,题解,交换,偶数,false
From: https://www.cnblogs.com/recollect-the-past/p/17981263

相关文章

  • P7618 [COCI2011-2012#2] FUNKCIJA 题解
    看起来比较复杂,但实际上是一个树上dp的模型。因为每一重循环都最多有一个依赖,可以转化为树上的父子关系,于是就形成了一个森林。对于非叶子节点,设\(f_{u,i}\)表示第\(u\)循环变量的值是\(i\)时所有直接或间接依赖于它的循环变量(即以它为根的子树除开它的部分)循环次数,对非......
  • 题解-[ABC288D] Range Add Query
    题目:[ABC288D]RangeAddQuery-洛谷|计算机科学教育新生态(luogu.com.cn) 大意:一些数,选一个区间A(L~R),并再选一个区间B(长度k),这个区间B的每个数加减(加负数=减一个数)一个数,最终使得区间A全部数为0举个例(样例)0.   3-11-2201.  0-4-2-220 (-3)2.  ......
  • 2024 蓝桥杯模拟赛 1 (div1) 题解
    A.把字符串小写转换成大写即可#include<bits/stdc++.h>usingnamespacestd;voidsolve(){strings;cin>>s;for(inti=0;i<s.size();i++){if(s[i]>='a'&&s[i]<='z'){s[i]=(char)(s[i]-'a......
  • 2024 省选联测部分题解
    目录目录R15T1树V图R15T2矩阵缺失题目:R15T3.R15T1树V图原题:SNOI2024D1T1.注意到答案肯定是形如每个连通块选一个点组成,把连通块缩起来后令\(dp_{u,x}\)表示连通块\(u\)选\(x\)的方案数,每次合并子树转移即可.因为只有\(n^2\)个合法点对所以时间复杂度......
  • R语言包安装失败常见问题解决
    更改或指定镜像源出现这个问题很有可能是你现在用的镜像中未纳入这个包,一是可以多换个源试试。如:install.packages('package-name',repos='http://cran.us.r-project.org')或,在Rstudio中可以:或,命令行可直接指定Rstudio:install.packages('package_name',dependencies=TRUE......
  • Vue_中央事件总线EventBus传值&自定义MyEventBus
    一、EventBus的创建以及使用//1、在src的main.js中,加上以下代码importVuefrom'vue'Vue.prototype.$EventBus=newVue()//2、发送消息,使用Vue原型链引入this.$EventBus.$emit('getSumu',"sumu10086")//3、监听接收消息,使用Vue原型链引入this.$EventBus.$......
  • 【问题解决】Kafka报错 Bootstrap broker x.x.x.x:9092 (id: -1 rack: null) disconne
    【问题解决】Kafka报错Bootstrapbrokerx.x.x.x:9092(id:-1rack:null)disconnected和服务器连接已经断开。可能kafka服务器停止问题复现近日针对某一客户需求开发了一个需要使用Kafka的功能,功能是什么暂且不论,在本地虚机的Kafka连接一切正常遂放到测试服务器上验证功......
  • Kafka【问题 02】KafkaTemplate 报错 Bootstrap broker localhost:9092 (id: -1 rack:
    Kafka【问题02】KafkaTemplate报错Bootstrapbrokerlocalhost:9092(id:-1rack:null)disconnected问题解决1.报错信息主要的报错信息:Connectiontonode-1(localhost/127.0.0.1:9092)couldnotbeestablished.Brokermaynotbeavailable.和Bootstrapbrok......
  • CF1920E 题解
    CF1920E被这种题卡了,脸都不要了。仔细读题,发现序列可以分成两部分(\(0\)和\(1\))来考虑。在合法序列中,对于一个\(1\),它产生的子串贡献一定是(假设与上一个\(1\)之间有\(x\)个\(0\),与下一个\(1\)之间有\(y\)个\(0\)):\[(x+1)(y+1)\]如果去DP这\(n\)个\(1\),易得转......
  • CF455D Serega and Fun 题解
    题目链接:CF或者洛谷本题是可以用平衡树去做的,具体的为每个\(k\)开一棵平衡树去维护相对位置,而这种移动操作用平衡树维护又是很容易做到的,这种做法是双\(log\)。在\(1e5\)的数据下,我们来说说好写的分块该如何去写。黑色的代表一个块,考虑暴力修改情况,假如原来的数字为\([1......