牛客暑期多校训练营6
发表于:2023-08-14 | 分类: 思维
字数统计: 636 | 阅读时长: 3分钟 | 阅读量:

更新至G,E…
有点多愁善感了

题G

题意:给定一个初始集合其中仅有 x,y(x!=y)x,y(x!=y), 可以执行任意次以下两种操作

1
2
1、选择a,b(a!=b),往集合中添加a-b
2、选择a,b(a!=b),往集合中添加gcd(|a|,|b|)

问最终能否得到zz

解:当 z=0z=0 时,仅有 a=0b=0a=0或b=0时,可以直接得到目标值,否则无法通过相减不同值得到 00
z!=0z!=0 时,我们通过 gcd(a,b)gcd(a,b) 可以得到一系列 gcd(a,b)gcd(a,b) 的倍数,如果能整除就存在.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<bits/stdc++.h>
using namespace std;
int main(){
int T; cin >> T;
while(T --){
int a, b, c; cin >> a >> b >> c;
if(c == 0){
if(a == 0 || b == 0) cout << "YES\n";
else cout << "NO\n";
}
else if(c % __gcd(a, b) == 0) cout << "YES\n";
else cout << "NO\n";
}
}

题E

题意:给定一个长为 nn 的数组 aa,每次询问给定 l,r,kl,r,k,问能否将 lrl-r 的区间划分为 kk 个部分,且每个部分的和都是偶数 (1n,q105,0ai1010,1lrn,1k105)(1\le n,q \le 10^5, 0\le a_i \le 10^{10}, 1\le l \le r \le n, 1 \le k \le 10^5)

解:因为要满足划分后的每个部分和都是偶数,那么我们可以直接从左到右扫描前缀和,统计到当前的前缀和的偶数和个数和奇数和个数,当且仅当一个区间内的和为偶数且两个奇偶性前缀差 k\ge k

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <bits/stdc++.h>
#define all(x) x.begin(),x.end()
#define pb(x) push_back(x)
#define PII pair<int, int>
#define INF 1ll << 30
#define ll long long
using namespace std;
const int N = 2e5 + 10, MOD = 1e9 + 7;
int st[N], s[N];
void solve(){
int n, q, t = 0; cin >> n >> q;
for(int i = 1, a = 0, b = 0; i <= n; ++ i){
int x; cin >> x;
s[i] = s[i - 1] + x;
if(s[i] & 1) st[i] = ++ a;
else st[i] = ++ b;
}
while(q --){
int l, r, k; cin >> l >> r >> k;
if((s[r] - s[l - 1]) % 2 == 0 && (st[r] - st[l - 1]) >= k)
cout << "YES\n";
else cout << "NO\n";
}
}
int main(){
//ios::sync_with_stdio(0); cin.tie(0);
int n; cin >> n;
while(n--) solve();
return 0;
}
上一篇:
牛客暑期多校训练营8
下一篇:
牛客暑期多校训练营7