训练情况
赛后反思
A题最简单的题愣神了,浪费了几分钟,其他方面正常表现
A题
相邻的两个差绝对值不能出现除了 \(5\) 和 \(7\) 以外的,直接模拟即可。
#include <bits/stdc++.h>
#define int long longusing namespace std;void solve(){int n; cin>>n;vector<int> a(n + 1);for(int i = 1;i<=n;i++) cin>>a[i];bool flag = true;for(int i = 2;i<=n;i++){int x = abs(a[i] - a[i-1]);if(x != 5 && x != 7) flag = false;}if(flag) cout<<"YES"<<endl;else cout<<"NO"<<endl;
}signed main(){int T; cin>>T; while(T--)solve();return 0;
}
B题
有 \(n\) 个货架,\(k\) 件商品,每个货架只摆同一种品牌的商品,所以我们统计每个品牌商品的价格和,最后取出价格和最大的前 \(n\) 个品牌的商品即可,使用优先队列维护。
#include <bits/stdc++.h>
#define int long longusing namespace std;struct node{int a,b;
};bool cmp(node x,node y){return x.a < y.a;
}void solve(){int n,k; cin>>n>>k;priority_queue<int> q;vector<node> a(k + 1);for(int i = 1;i<=k;i++){cin>>a[i].a>>a[i].b;}sort(a.begin() + 1,a.end(),cmp);int sum = a[1].b;for(int i = 2;i<=k;i++){if(a[i].a == a[i-1].a) sum += a[i].b;else q.push(sum),sum=a[i].b;}q.push(sum);int ans = 0;for(int i = 1;i<=n;i++){if(!q.size()) break;ans += q.top();q.pop();}cout<<ans<<endl;
}signed main(){int T; cin>>T; while(T--)solve();return 0;
}
C题
我们发现修改某一位只会对附近相邻四位产生贡献,只会有下面几种情况
110X
?11X0
??1X00
???X100
所以我们在替换某一位的时候,先把替换位置附近的这几种情况记录的 1100 子串位置和个数先全部去掉,再统计。此时我们只需要维护整个字符串中子串 1100 的个数即可。
#include <bits/stdc++.h>
#define int long longusing namespace std;void solve(){string s; cin>>s;int n = s.size();vector<bool> vis(n); int cnt = 0;for(int i = 0;i<n-3;i++){if(s.substr(i,4) == "1100") vis[i] = 1,cnt++;}int k; cin>>k;while(k--){int pos,v; cin>>pos>>v;s[pos-1] = v+'0';for(int i = max(0ll,pos-4);i<=min(n-1,pos-1);i++){if(vis[i]) vis[i] = 0,cnt--;}for(int i = max(0ll,pos-4);i<=min(n-1,pos-1);i++){if(s.substr(i,4) == "1100") vis[i] = 1,cnt++;}if(cnt) cout<<"YES"<<endl;else cout<<"NO"<<endl;}
}signed main(){int T; cin>>T; while(T--)solve();return 0;
}
D题
主要难点是绕顺时针,而且从外往里,一共会有 \(\lfloor \frac{min(n,m)}{2} \rfloor\) 圈,循环挺难写的,我们分成顺时针四段四条边写即可,注意一下统计出现次数,首位相接也算。
#include <bits/stdc++.h>
#define int long longusing namespace std;int pd(string s){int cnt = 0;int n = s.size();for(int i = 0;i<n-3;i++){if(s.substr(i,4) == "1543") cnt++;}if(s[n-3] == '1' && s[n-2] == '5' && s[n-1] == '4' && s[0] == '3') cnt++;if(s[n-2] == '1' && s[n-1] == '5' && s[0] == '4' && s[1] == '3') cnt++;if(s[n-1] == '1' && s[0] == '5' && s[1] == '4' && s[2] == '3') cnt++;return cnt;
}void solve(){int n,m; cin>>n>>m;vector<string> s(n);vector<vector<bool>> vis(n+1,vector<bool>(m+1));for(int i = 0;i<n;i++) cin>>s[i];string t;int ans = 0;for(int i = 0;i<min(n,m)/2;i++){t = "";for(int j = i;j<=m-1-i;j++) t+=s[i][j];for(int j = i+1;j<=n-1-i;j++) t+=s[j][m-i-1];for(int j = m-1-i-1;j>=i;j--) t+=s[n-i-1][j];for(int j = n-1-i-1;j>=i+1;j--) t+=s[j][i];// cout<<t<<endl;ans += pd(t);}cout<<ans<<endl;
}signed main(){int T; cin>>T; while(T--)solve();return 0;
}