A
特判一下前面是10,后面>2即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| #include <bits/stdc++.h> using namespace std; using ll = long long; void solve() { string s; cin >> s; if (s[0] == '1' && s[1] == '0' && (s[2] >= '2' || s[2] == '1' && s[3] >= '0' && s[3] <= '9')) { cout << "YES" << '\n'; } else { cout << "NO" << '\n'; } } int main() { int t; cin >> t; while (t--) { solve(); } return 0; }
|
B
开个map
记录即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
| #include <bits/stdc++.h> using namespace std; using ll = long long; void solve() { map<int,int>mp; int n; cin>>n; bool flag=0; for(int i=1;i<=n;i++) { int x; cin>>x; if(i==1) { mp[x]=1; continue; } if(!mp[x-1]&&!mp[x+1]) { flag=1; } mp[x]=1; } if(!flag) { cout<<"YES"<<'\n'; } else { cout<<"NO"<<'\n'; }
} int main() { int t; cin >> t; while (t--) { solve(); } return 0; }
|
C
数字到字母做一个映射。
字母到数字做一个映射。
还是map
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| #include <bits/stdc++.h> using namespace std; using ll = long long; void solve() { int n; cin >> n; vector<int> a(n + 1); for (int i = 1; i <= n; i++) { cin >> a[i]; } int m; cin >> m; for (int i = 1; i <= m; i++) { string s; cin >> s; map<char, int> mp; bool flag=0; if (s.size() != n) { cout << "NO" << '\n'; continue; } for (int j = 0; j < s.size(); j++) { if (mp.count(s[j]) && mp[s[j]] != a[j + 1]) { flag=1; cout << "NO" << '\n'; break; } else { mp[s[j]] = a[j + 1]; } } if(flag) { continue; } map<int,char>mp1; for (int j = 0; j < s.size(); j++) { if (mp1.count(a[j+1]) && mp1[a[j+1]] != s[j]) { flag=1; cout << "NO" << '\n'; break; } else { mp1[a[j+1]] = s[j]; } } if(flag) { continue; }
cout << "YES" << '\n'; } } int main() { int t; cin >> t; while (t--) { solve(); } return 0; }
|
D
赛时太nt了,猜了个一坨出来。
只需要每一个L去匹配最远的R即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| #include <bits/stdc++.h> using namespace std; using ll = long long; void solve() { int n; cin >> n; vector<ll> a(2 * n); vector<char> b(2 * n); vector<ll> sum(2 * n); for (int i = 1; i <= n; i++) { cin >> a[i]; sum[i] = sum[i - 1] + a[i]; } string s; cin >> s; s = " " + s; vector<int>p(n+1); for(int i=1;i<=n;i++) { if(s[i]=='R') { p.push_back(i); } } ll ans=0; for(int i=1;i<=n;i++) { if(s[i]=='L') { if(p.empty()) { break; } int x=p.back(); p.pop_back(); if(x<i) { break; } ans+=sum[x]-sum[i-1]; } } cout<<ans<<'\n'; } int main() { int t; cin >> t; while (t--) { solve(); } return 0; }
|
E
预处理出每个格子被覆盖的次数,直接用前缀和和差分,然后用优先队列即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| #include <bits/stdc++.h> using namespace std; using ll = long long; void solve() { int n, m, k; cin >> n >> m >> k; ll w; cin >> w; vector<ll> a(w + 1); for (int i = 1; i <= w; i++) { cin >> a[i]; } sort(a.begin() + 1, a.end()); vector<vector<ll>> sum(n + k + 1, vector<ll>(m + k + 1)); for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { int x2 = i + k - 1; int y2 = j + k - 1; if (x2 > n || y2 > m) { continue; } sum[i][j]++; sum[i][y2 + 1]--; sum[x2 + 1][j]--; sum[x2 + 1][y2 + 1]++; } } priority_queue<ll> q; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { sum[i][j] += sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1]; q.push(sum[i][j]); } } ll ans = 0; for (int i = w; i >= 1; i--) { if (q.empty()) { break; } ans += q.top() * a[i]; q.pop(); } cout << ans << '\n'; } int main() { int t; cin >> t; while (t--) { solve(); } return 0; }
|
F
预处理每个矩形得分对应的操作次数,然后直接dp
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| #include <bits/stdc++.h> using namespace std; using ll = long long; const ll INF = 1e18; void solve() { int n, k; cin >> n >> k; vector<ll> dp(k + 1, INF); dp[0] = 0; for (int i = 0; i < n; i++) { int a, b; cin >> a >> b; vector<ll> me(k + 1, INF); me[0] = 0; int cnt = 0, cost = 0; while (cnt < k && (a > 0 || b > 0)) { if (a < b) { swap(a, b); } cnt += 1; cost += b; a -= 1; me[cnt] = cost; } for (int j = k - 1; j >= 0; j--) { for (int p = 1; p <= k - j; p++) { dp[j + p] = min(dp[j + p], dp[j] + me[p]); } } } cout << (dp[k] == INF ? -1 : dp[k]) << '\n'; return; }
int main() { int t; cin >> t; while (t--) { solve(); } return 0; }
|