CF2193 Round 1078 (Div. 2)
个人题解
Nanami^2 Even in the rain.
2026年02月08日
预计阅读 5 分钟
937 字
A
连续 个为一个单元,显然这样最优,注意结尾如果凑不成 个只要排满就行了。
#include<bits/stdc++.h>using namespace std;typedef long long ll;typedef unsigned long long ull;typedef pair<int,int> PII;#define MP make_pair#define fi first#define se second#define pb push_back#define eb emplace_back#define SET(a,b) memset(a,b,sizeof(a))#define CPY(a,b) memcpy(a,b,sizeof(b))#define rep(i,j,k) for(int i=(j);i<=(k);++i)#define per(i,j,k) for(int i=(j);i>=(k);--i)int read() { int a=0, f=1; char c=getchar(); while(!isdigit(c)) { if(c=='-') f=-1; c=getchar(); } while(isdigit(c)) a=a*10+c-'0', c=getchar(); return a*f;}int T, n, k;void solve() { cin >> n >> k; cout << 1ll * (n / k) * (k - 1) + (n % k) << endl;}signed main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> T; while(T--) solve(); return 0;}B
读清楚题随便维护一下即可。
#include<bits/stdc++.h>using namespace std;typedef long long ll;typedef unsigned long long ull;typedef pair<int,int> PII;#define MP make_pair#define fi first#define se second#define pb push_back#define eb emplace_back#define SET(a,b) memset(a,b,sizeof(a))#define CPY(a,b) memcpy(a,b,sizeof(b))#define rep(i,j,k) for(int i=(j);i<=(k);++i)#define per(i,j,k) for(int i=(j);i>=(k);--i)int read() { int a=0, f=1; char c=getchar(); while(!isdigit(c)) { if(c=='-') f=-1; c=getchar(); } while(isdigit(c)) a=a*10+c-'0', c=getchar(); return a*f;}const int N = 2e5 + 5;int T, n, x, y, a[N];void solve() { cin >> n >> x >> y; ll ans = 0, res = 0; for(int i = 1;i <= n;i++) { cin >> a[i]; if(i > 1) res += 1ll * y * (a[i] / x); } res += a[1]; ans = max(ans, res); for(int i = 2;i <= n;i++) { res -= a[i - 1]; res -= 1ll * y * (a[i] / x); res += 1ll * y * (a[i - 1] / x); res += a[i]; ans = max(ans, res); } cout << ans << endl;}signed main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> T; while(T--) solve(); return 0;}C
首先我们尝试枚举答案 ,于是这就是个根号级别的东西。
规定下标为 。设当前枚举的答案串长度为 ,那么对于下标 ,其可选的字符集合应该是所有串这个位置字符的并集。但由于所有模 同余 的点字符应该相同,所以答案串下标 应该对这个并集求交。一旦出现空集,那么就无解了。这个过程随便状态压缩一下就很好实现,
然后每个集合扫一遍随便取个字符就行。
复杂度 ,可以通过。
#include<bits/stdc++.h>using namespace std;typedef long long ll;typedef unsigned long long ull;typedef pair<int,int> PII;#define MP make_pair#define fi first#define se second#define pb push_back#define eb emplace_back#define SET(a,b) memset(a,b,sizeof(a))#define CPY(a,b) memcpy(a,b,sizeof(b))#define rep(i,j,k) for(int i=(j);i<=(k);++i)#define per(i,j,k) for(int i=(j);i>=(k);--i)int read() { int a=0, f=1; char c=getchar(); while(!isdigit(c)) { if(c=='-') f=-1; c=getchar(); } while(isdigit(c)) a=a*10+c-'0', c=getchar(); return a*f;}const int N = 5e4 + 5;int T, n, m;string s[N];vector<int> d;void solve() { cin >> n >> m; for(int i = 0;i < m;i++) { cin >> s[i]; } d.clear(); d.push_back(1); d.push_back(n); for(int i = 2;i * i <= n;i++) if(n % i == 0) { d.push_back(i); if(i * i != n) d.push_back(n / i); } sort(d.begin(), d.end()); for(auto k : d) { // cout << "k = " << k << endl; int cnt = n / k; vector<int> st(k + 5, ((1 << 26) - 1)); for(int i = 0;i < n;i++) { int S0 = 0; for(int j = 0;j < m;j++) { S0 |= (1 << (s[j][i] - 'a')); } // cout << "S0 = " << S0 << endl; st[i % k] &= S0; // printf("st[%d] = %d\n", i % k, st[i % k]); } int valid = 1; for(int i = 0;i < k;i++) { if(st[i] == 0) valid = 0; } if(valid) { string ans; ans.resize(k); for(int i = 0;i < k;i++) { for(int j = 0;j < 26;j++) if(st[i] & (1 << j)) { ans[i] = 'a' + j; break; } } for(int i = 1;i <= cnt;i++) cout << ans; cout << endl; return; } }}signed main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); cin >> T; while(T--) solve(); return 0;}D
身败名裂了,没能做掉。
觉得这篇文章怎么样?
点个赞,让更多人看到!

评论区