Good Bye 2019 SZU cf集训C~D

B. Interesting Subarray

题目大意:就是给你一个长度为k的数组。求是否存在一个连续的子数组是始得子数组的长度小于或者等于子数组中最大值于最小值之差

思路我们可以这样想:假设这样的子序列存在。那么如果最大最小值不在端点处那么,我们就存在更短的子序列始得最大最小值在端点。

那么我们就有an - a1 >= n; 在a1 到 an 中只有n - 1个空格 我们要使的 an - a1 >= n ----->就有an >= a1 + n; 由于相邻个数的差不大于2(大于2它就是最优解了)那么显然是无法满足an >= a1 + n的那么我们就得出一个结论就是如果存在解,那么一定有abs(an - an-1) >= 2;那么就是解了输出就好了

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int n, x, m;
int k[N];
int main()
 {
	int te;
	cin >> te;
	while (te--) {
		cin >> n;
		for (int i = 1; i <= n; i++)cin >> k[i];
		bool flag = false;
		int  l, r;
		for (int i = 2; i <= n; i++) 
			if (abs(k[i] - k[i - 1]) >= 2) 
			{
				flag = true;
				l = i - 1, r = i;
				 break;
			}
		
		if (flag) 
			cout << "YES\n" << c << " " << d << "\n";
		else cout << "NO\n";
	}
	return 0;
}

C. Make Good

题目大意就是给你长度为n数组问你a1 + a2 + …+an == 2 * (a1 ^ a2 ^ a3 ^ a4…^ an) 如果不等就添加数字使其相等

那么我们可以发现 a1 + a2 != 2*(a1 ^ a2)

我们可以发现(a1 ^ a2 ^ (a1 ^ a2)) == 0,然后我们再左边就变成了(a1 + a2 + a1 + a2)== sum ,由于右边变成0,0异或任何数都为任何数所以设X * 2 = sum + X;求出X == SUM

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值