训练情况
赛后反思
C题犯蠢,实则行操作会影响到其他列,所以只需要判断列相同的个数最大值就是答案,D题看错题的情况下A了
A题
第二场已经举行,第三场还没举行,\(\ge 3\) 答案是 NO,否则就是 YES
点击查看代码
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'using namespace std;void solve(){int x; cin>>x;if(x>=3) cout<<"NO"<<endl;else cout<<"YES"<<endl;
}signed main(){// int T; cin>>T; while(T--)solve();return 0;
}
B题
构造一个排列,使得连续 \(k\) 个元素都不是排列,我们考虑如下一种构造
1 7 2 6 3 5 4
从左到右奇数位,再到从右到左偶数位
点击查看代码
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'using namespace std;void solve(){int n; cin>>n;int ans[n+1];int tot = 0;for(int i = 1;i<=n;i++){if(i&1) ans[i] = ++tot;}for(int i = n;i;i--){if(i%2==0) ans[i] = ++tot;}for(int i = 1;i<=n;i++) cout<<ans[i]<<" ";
}signed main(){// int T; cin>>T; while(T--)solve();return 0;
}
C题
我们发现改变一行一定会影响到答案,对于两个列,如果相同一定能通过相同的行变换得来的,所以这题只需要统计最大的相同列个数,我们用map维护最大值即可
点击查看代码
#include <bits/stdc++.h>
// #define int long long
#define endl '\n'using namespace std;void solve(){int n,m; cin>>n>>m;vector<string> s(n);map<string,int> v;int ans = 0;for(int i = 0;i<n;i++) cin>>s[i];for(int i = 0;i<m;i++){string a;for(int j = 0;j<n;j++){a+=s[j][i];}v[a]++;ans = max(ans,v[a]);}cout<<ans<<endl;
}signed main(){// int T; cin>>T; while(T--)solve();return 0;
}
D题
我们发现想让答案最大,正贡献一定要操作,想让答案最小,负贡献一定要操作,所以最后等效于区间全部操作一遍,答案就是 \(k \sum{a_i}\)。
点击查看代码
#include <bits/stdc++.h>
#define int long long
#define endl '\n'using namespace std;void solve(){int n,k; cin>>n>>k;vector<int> a(n + 1);int sum = 0;for(int i = 1;i<=n;i++) cin>>a[i],sum+=a[i];if(k==0){cout<<0<<endl;return;}cout<<sum*k<<endl;
}signed main(){int T; cin>>T; while(T--)solve();return 0;
}