共七道 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;
}