The 19th Zhejiang Provincial Collegiate Programming Contest VP记录+补题
时间:2023-12-11 18:37:00
A | B | C | D | E | F | G | H | I | J | K | L | M |
---|---|---|---|---|---|---|---|---|---|---|---|---|
AC | AC | AC | – | – | WA/补题 | AC | – | AC | AC/待补 | – | AC | AC |
A.JB Loves Math
题目分析
现在有两个数字 a a a和 b b b,你选择一个奇数 x x x和偶数 y y y,每次可以给 a a a加 x x x或减 y y y,问最小操作次数 a a a变为 b b b。
分类讨论差值。
Code
#include #define int long long #define endl '\n' using namespace std; inline void span class="token function">solve(){
int a, b; cin >> a >> b;
int det = abs(a - b);
if(a == b) cout << 0 << endl;
else if(a > b && (det & 1 == 0) || a < b && det & 1) cout << 1 << endl;
else if(a < b && (det / 2) & 1 || a > b) cout << 2 << endl;
else cout << 3 << endl;
}
signed main(){
ios_base::sync_with_stdio(false), cin.tie(0);
int t = 0; cin >> t;
while(t--) solve();
return 0;
}
B.JB Loves Comma
题目分析
找到cjb
然后加个逗号就可以了,样例2好评
Code
#include
#define int long long
#define endl '\n'
using namespace std;
inline void solve(){
string str; cin >> str;
for(int i = 0; i < str.size(); i++){
if(i >= 2 && str[i] == 'b' && str[i - 1] == 'j' && str[i - 2] == 'c') cout << str[i] << ',';
else cout << str[i];
}
}
signed main(){
solve();
return 0;
}
C.JB Wants to Earn Big Money
题目分析
直接按照题意模拟,统计两类数量即可。
Code
#include
#define int long long
#define endl '\n'
using namespace std;
inline void solve(){
int n, m, X; cin >> n >> m >> X;
int ans = 0;
for(int i = 1; i <= n; i++){
int s; cin >> s;
if(s >= X) ans++;
}
for(int i = 1; i <= m; i++){
int s; cin >> s;
if(s <= X) ans++;
}
cout << ans << endl;
}
signed main(){
ios_base::sync_with_stdio(false), cin.tie(0);
solve();
return 0;
}
F.Easy Fix
题目分析
主席树写挂了,赛时没调出来,我是菜狗
给定排列 p 1 , p 2 , p 3 , … , p n p_1, p_2, p_3,\dots, p_n p1,p2,p3,…,pn,定义 A i A_i Ai表示在 p i p_i pi左侧并比 p i p_i pi小的数字个数, B i B_i Bi表示在 p i p_i pi右侧并比 p i p_i pi小的数字个数, C i = min ( A i , B i ) C_i = \min(A_i, B_i) Ci=min(Ai,Bi)。现在给定多个操作 ( l , r ) (l, r) (l,r),求每个操作,交换 ( p i , p j ) (p_i, p_j) (pi,pj)后的 ∑ C i \sum C_i ∑Ci。
首先考虑如何处理初始时的 C i C_i Ci值,观察到以下性质:
- 对于 A i A_i Ai值的求解过程类似求逆序对的思想,可以直接上树状数组维护, O ( n log n ) O(n\log n) O(nlogn)求得全部的 A i A_i Ai
- 由于是排列, B i = p i − 1 − A i B_i = p_i - 1 - A_i Bi=pi−1−Ai可以 O ( 1 ) O(1) O(1)求得
- 那么 C i = min ( A i , B i ) C_i = \min(A_i, B_i) Ci=min(Ai,Bi)也是 O ( 1 ) O(1) O(1)得到的
由于每个询问相互独立,那么考虑交换 ( p l , p r ) (p_l, p_r) (pl,pr)操作对 C i C_i Ci的影响:
-
对于 [ 1 , l ) , ( r , n ] [1, l), (r , n] [1,l),(r,n]范围的数字, C i C_i Ci值一定不影响。因为交换操作均在单侧进行
-
对于 p l p_l pl,交换到 r r r位置后, A l → A l + 区 间 [ l , r ] 小 于 p l 的 数 字 个 数 A_l \rightarrow A_l + 区间[l,r]小于p_l的数字个数 Al→Al+区间[l,r]小于pl的数字个数, B l ’ B_l’ Bl’仍然可以直接求
对于 p r p_r pr,交换到 l l l位置后, A r → A r − 区 间 [ l , r ] 小 于 p r 的 数 字 个 数 A_r \rightarrow A_r - 区间[l ,r]小于p_r的数字个数 Ar→Ar−区间[l,r]小于pr的数字个数, B r ’ B_r’ Br’仍然可以直接求
如果我们在线询问(主席树维护),那么对于 p l , p r p_l,p_r pl,pr,实际上可以直接两个 O ( l o g n ) O(logn) O(logn)重新求。
-
那么重点是对于 [ l + 1 , r − 1 ] [l + 1, r - 1] [l+1,r−1]区间内的数字的 C i C_i Ci值变化,如何维护?
-
对于 p l ≤ p i ≤ p r p_l \leq p_i \leq p_r pl≤pi≤