更新至G,E…
有点多愁善感了
题G
题意:给定一个初始集合其中仅有 x,y(x!=y), 可以执行任意次以下两种操作
1 2
| 1、选择a,b(a!=b),往集合中添加a-b 2、选择a,b(a!=b),往集合中添加gcd(|a|,|b|)
|
问最终能否得到z
解:当 z=0 时,仅有 a=0或b=0时,可以直接得到目标值,否则无法通过相减不同值得到 0
当 z!=0 时,我们通过 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
题意:给定一个长为 n 的数组 a,每次询问给定 l,r,k,问能否将 l−r 的区间划分为 k 个部分,且每个部分的和都是偶数 (1≤n,q≤105,0≤ai≤1010,1≤l≤r≤n,1≤k≤105)。
解:因为要满足划分后的每个部分和都是偶数,那么我们可以直接从左到右扫描前缀和,统计到当前的前缀和的偶数和个数和奇数和个数,当且仅当一个区间内的和为偶数且两个奇偶性前缀差 ≥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(){ int n; cin >> n; while(n--) solve(); return 0; }
|