SMU Spring 2023 Contest Round 6
E. Expenditure Reduction
从左右往右找到包含B字符的最近位置,然后从这个位置有从右到左找回去找到包含完所有B字符的位置,这个区间就是答案
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <bits/stdc++.h> #define inf 0x3f3f3f3f #define endl '\n' #define int long long using namespace std; const int N = 1e6+10, M = 998244353; //typedef long long ll; typedef pair<int,int> PII; int n,m,t,k; map<int,int> mp; priority_queue<int> QQ; deque<int> Q; int ksm(int a,int b,int mod){ int res = 1; a %= mod; while(b){ if(b & 1) res = res * a % mod; a = a * a % mod; b >>= 1; } return res; } void solve() { string a,b; cin >> a >> b; int l = 0, r = a.size() - 1, pos = 0; for(int i = 0;i < a.size();i++){ if(a[i] == b[pos]) pos++; if(pos == b.size()){ r = i; break; } } pos --; //cout << pos << endl; for(int i = r;i >= 0;i--){ if(a[i] == b[pos]) pos--; if(pos == -1){ l = i; break; } } //cout << l << ' ' << r << endl; cout << a.substr(l, r - l + 1) << endl; } signed main() { ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); int Ke_scholar = 1; cin >> Ke_scholar; while(Ke_scholar--) solve(); return 0; } /* */
G. Gua!
签到题,注意细节.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> //#define int long long #define endl '\n' #define PII pair<int,int> using namespace std; const int N = 2010,mod = 1e9 + 7; int n,s,v,m; void solve() { int b, r, d, s; cin >> b >> r >> d >> s; if (b == 0||r==0) { if (d)cout << "gua!" << endl; else cout << "ok" << endl; return; } int x = (d + b - 1) / b; int y = r * s / 60 + 1; //cout << x << ' ' << y << endl; if (x <= y)cout << "ok" << endl; else cout << "gua!" << endl; } int32_t main() { ios::sync_with_stdio(false); cin.tie(nullptr), cout.tie(nullptr); int Ke_scholar = 1; cin >> Ke_scholar; while(Ke_scholar--)solve(); return 0; }
H. Heirloom Painting
考虑最后一次涂色,必然会形成一个长度不小于 𝑘 的相同颜色的连续区间。因此如果不存在 长度不小于 𝑘 的相同颜色的连续区间,则必然无解。不难发现,每一段相同颜色的连续区间都是独 立的,假设其长度为 𝑙𝑒𝑛 ,则至少需要 ⌈ 𝑙𝑒𝑛 / 𝑘 ⌉ 次涂色才能得到这段区间。
下面我们证明这一下界可以 达到:随便选择一个长度不小于 𝑘 的相同颜色的连续区间,作为最后涂色的区间。倒过来考虑,如 果已知下一次涂色最终留下颜色的区间,那么本次涂色最终留下颜色的区间可以与下一次涂色的区 间相邻,且长度不超过 𝑘,因此每一个长度为 𝑙𝑒𝑛 的相同颜色连续区间,都可以恰好经过 ⌈ 𝑙𝑒𝑛 / 𝑘 ⌉ 次涂 色得到。
因此将每个区间的贡献简单相加即可得到答案,总时间复杂度 𝑂(𝑛)。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <bits/stdc++.h> #define inf 0x3f3f3f3f #define endl '\n' #define int long long using namespace std; const int N = 1e6+10, M = 998244353; typedef unsigned long long ll; typedef pair<int,int> PII; int n,m,t,k; map<int,int> mp; priority_queue<int> QQ; deque<int> Q; void solve() { cin >> n >> m >> k; vector<int> a(n + 1), b(n + 1); int pos = 0; for(int i = 1;i <= n;i ++){ cin >> a[i]; if(a[i] != a[i - 1]){ b[++pos] = 1; }else{ b[pos]++; } } if(a[1] == a[n] && pos != 1){ b[1] += b[pos--]; } bool f = false; int ans = 0; for(int i = 1;i <= pos;i ++){ if(b[i] >= k) f = true; ans += (b[i] + k - 1) / k; } cout << (f ? ans : (-1)) << endl; } signed main() { ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); int Ke_scholar = 1; cin >> Ke_scholar; while(Ke_scholar--) solve(); return 0; } /* */
N. Nine Is Greater Than Ten
签到题.
void solve() { string s1,s2; cin >> s1 >> s2; if(s1 > s2){ cout << s1 << '>' << s2 << endl; } else if(s1 < s2){ cout << s1 << '<' << s2 << endl; } else cout << s1 << '=' << s2 << endl; }