Codeforces Round #803 (Div. 2)

共七道 AC三道,补一道,D题差了一点,有点可惜,手速场前四题是一个level,后三题是一个level,有疑问可以给我评论哦


一、A - XOR Mixup

  • 题目:
    给你n个数字,有一个数字等于其它数字的异或和,找出那个数字
  • 思路:
    这道题有点简单,随便来个数字就行,然后也可以硬暴力了,范围小
  • 代码:
#include <bits/stdc++.h>
#define fi first
#define se second
#define endl '\n'
#define all(x) x.begin(),x.end()
#define pb push_back
#define PII pair<int,int>
#define int long long 
#define ios ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
using namespace std;
const int N = 2e5 + 100,mod = 1e9 + 7;
int a[N],b[N];
void solve()
{ 
	int n; cin >> n;
	for(int i = 1;i <= n;i ++ ) cin >> a[i];
	
	for(int i = 1;i <= n;i ++ )
	{
		int k = 0;
		for(int j = i + 1;j <= n;j ++ )
		k = (k ^ a[j]);
		
		if(a[i] ^ k == 0)
		{
			cout << a[i] << endl;
			return;
		}
	}
	
}

signed main() 
{
	ios;int T; cin >> T;
	while(T -- ) solve();

    return 0;
}

二、B - Rising Sand

  • 题目:
    有一个数组A,然后给你一个数字k,你可以从1 ~ n的范围选择区间大小为k的的区间让这个区间内的每一个元素都加一,现在想要你操作然后使得对于A[i] > A[i + 1] + A[i - 1]数量尽量多**
  • 思路:
    这个除了k = 1有用之外,其他的k都没有用处,因为其他的k >= 2,你每次就最少加两个1,你想要A[i] > A[i + 1] + A[i - 1],假如本来A[i] > A[i + 1] + A[i - 1],那就不用操作,但是如果A[i] <= A[i + 1] + A[i - 1],k = 2,那这样的等式左右两遍都加了1,等于没加,同理k > 2也是如此
    代码:
#include <bits/stdc++.h>
#define fi first
#define se second
#define endl '\n'
#define all(x) x.begin(),x.end()
#define pb push_back
#define PII pair<int,int>
#define int long long 
#define ios ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
using namespace std;
const int N = 2e5 + 100,mod = 1e9 + 7;
int a[N],b[N];
void solve()
{ 
	int n,k; cin >> n >> k;
	for(int i = 1;i <= n;i ++ ) cin >> a[i];
	if(k >= 2)
	{
		int d = 0;
		for(int i = 2;i <= n - 1;i ++ )
		{
			if(a[i] > a[i - 1] + a[i + 1])
			d++;
		}
		
		cout << d << endl;
	}
	else
	{
		cout << (n - 1) / 2 << endl;
	}

	
}

signed main() 
{
	ios;int T; cin >> T;
	while(T -- ) solve();

    return 0;
}

三、C - 3SUM Closure

  • 题目:
    给你n个数字,如果对于每一个s = A[i] + A[j] + A[k] ,s都存在A数组里面,符合条件输出YES,否则输出NO
    -思路:
    观察这个条件发现,不能有存在超过3个数字是正数,因为这三个正数相加是一个更大的正数,这个更大的正数再与两个小的正数相加就变成了更更大的正数,就会无穷无尽,同理也不存在不能有存在超过3个数字是负数.然后范围就很小了直接暴力
  • 代码:
#include <bits/stdc++.h>
#define fi first
#define se second
#define endl '\n'
#define all(x) x.begin(),x.end()
#define pb push_back
#define PII pair<int,int>
#define int long long 
#define ios ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
using namespace std;
const int N = 2e5 + 100,mod = 1e9 + 7;
int a[N],b[N];
map<int,bool> st;
void solve()
{ 
	int n; cin >> n;
	int d = 0,d2 = 0,e = 0; 
	vector<int> res;
	for(int i = 1;i <= n;i ++ )
	{
		 cin >> a[i];
		 if(a[i] > 0) 
		 {
		 	res.pb(a[i]);
		 	d++;
		 }
		 else if(a[i] < 0) 
		 {
		 	res.pb(a[i]);
		 	d2++;
		 }
		 else e++;
	}
	if(e != 0) res.pb(0);
	
	if(d >= 3 || d2 >= 3) cout << "NO" << endl;
	else if(d == 0 && d2 == 0) cout << "YES" << endl;
	else
	{
		
		for(int i =0;i < res.size();i ++ )
		st[res[i] + 1e10] = true;
		
		for(int i = 0;i < res.size();i ++ )
			for(int j = i + 1;j < res.size();j ++ )
				for(int k = j + 1;k < res.size();k ++ )
					if(!st[res[i] + res[j] + res[k] + 1e10])
					{
						cout << "NO" << endl;
						for(int i =0;i < res.size();i ++ )
							st[res[i] + 1e10] = false;
						return;
					}
		cout << "YES" << endl;
		for(int i =0;i < res.size();i ++ )
		st[res[i] + 1e10] = false;
	}
	

	
}

signed main() 
{
	ios;int T; cin >> T;
	while(T -- ) solve();

    return 0;
}

四、补:D. Fixed Point Guessing

  • 题目:
    交互题,有一个序列是T,最初的元素是[1,2,3,4,…n]其中除了一个数字没有变化位置其他数字都变化了位置,让你找到这个元素,使用操作最多不过15次
    操作:你可以询问一段[l,r]范围内递增序列
  • 思路:
    这个看到15,然后就觉得是二分,然后再观察题目发现,在一个范围内,可能只是内部交换,这样统计从L,R内的数字的话,就是偶数,然后如果不变的数字在这个范围内那[L,R]内的数字就是奇数,
  • 代码:
#include <bits/stdc++.h>
//#define fi first
//#define se second
//#define endl '\n'
//#define all(x) x.begin(),x.end()
//#define pb push_back
//#define PII pair<int,int>
//#define int long long 
//#define ios ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
using namespace std;
const int N = 2e5 + 100,mod = 1e9 + 7;
int q[N],s[N];
void ask(int l,int r)
{
	cout << "? " << l << ' ' << r << endl;
	for(int i = l;i <= r;i ++ ) cin >> q[i];	
} 
void solve()
{ 
	int n; cin >> n;
	int l = 1,r = n;
	while(l <= r)
	{
		int mid = l + r >> 1;
		ask(l,mid);
		int ans = 0;
		for(int i = l;i <= mid;i ++ )
		ans += ( q[i] >= l && q[i] <= mid);
		
		if(ans & 1) r = mid - 1;
		else l = mid + 1;
	}
	

	cout << "! " << l << endl;
	
}

signed main() 
{
	
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);int T; cin >> T;
	while(T -- ) solve();

    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值