赞
踩
Congratulations, you have been accepted to the Master’s Assistance Center! However, you were extremely bored in class and got tired of doing nothing, so you came up with a game for yourself.
You are given a string s s s and an even integer n n n. There are two types of operations that you can apply to it:
It is required to determine the lexicographically smallest † ^{\dagger} † string that can be obtained after applying exactly n n n operations. Note that you can apply operations of different types in any order, but you must apply exactly n n n operations in total.
† ^{\dagger} †A string a a a is lexicographically smaller than a string b b b if and only if one of the following holds:
Each test consists of multiple test cases. The first line contains a single integer t t t ( 1 ≤ t ≤ 500 1 \leq t \leq 500 1≤t≤500) — the number of test cases. The description of the test cases follows.
The first line of each test case contains a single even integer n n n ( 2 ≤ n ≤ 1 0 9 2 \leq n \leq 10^9 2≤n≤109) — the number of operations applied to the string s s s.
The second line of each test case contains a single string s s s ( 1 ≤ ∣ s ∣ ≤ 100 1 \leq |s| \leq 100 1≤∣s∣≤100), consisting of lowercase English letters, — the string to which the operations are applied.
For each test case, output a single line — the lexicographically smallest string that can be obtained after applying exactly n n n operations.
Example
input |
---|
5 |
4 |
cpm |
2 |
grib |
10 |
kupitimilablodarbuz |
1000000000 |
capybara |
6 |
abacaba |
output |
---|
cpm |
birggrib |
kupitimilablodarbuz |
arabypaccapybara |
abacaba |
In the first test case, you can apply the operation of the second type (i.e., reverse the string s s s) 4 4 4 times. Then the string s s s will remain equal to cpm.
In the second test case, you can do the following:
具体见文后视频。
#include <bits/stdc++.h> #define int long long using namespace std; typedef pair<int, int> PII; typedef long long LL; void solve() { int n; string s; cin >> n >> s; int l = 0, r = s.size() - 1; while (l <= r && s[l] == s[r]) l ++, r --; if (l > r) cout << s << endl; else if (s[l] > s[r]) { string t = s; reverse(t.begin(), t.end()); t += s; cout << t << endl; } else cout << s << endl; } signed main() { cin.tie(0); cout.tie(0); ios::sync_with_stdio(0); int Data; cin >> Data; while (Data --) solve(); return 0; }
In the Master’s Assistance Center, Nyam-Nyam was given a homework assignment in informatics.
There is an array a a a of length n n n, and you want to divide it into k > 1 k > 1 k>1 subsegments † ^{\dagger} † in such a way that the MEX ‡ \operatorname{MEX} ^{\ddagger} MEX‡ on each subsegment is equal to the same integer.
Help Nyam-Nyam find any suitable division, or determine that it does not exist.
† ^{\dagger} †A division of an array into k k k subsegments is defined as k k k pairs of integers ( l 1 , r 1 ) , ( l 2 , r 2 ) , … , ( l k , r k ) (l_1, r_1), (l_2, r_2), \ldots, (l_k, r_k) (l1,r1),(l2,r2),…,(lk,rk) such that l i ≤ r i l_i \le r_i li≤ri and for each 1 ≤ j ≤ k − 1 1 \le j \le k - 1 1≤j≤k−1, l j + 1 = r j + 1 l_{j + 1} = r_j + 1 lj+1=rj+1, and also l 1 = 1 l_1 = 1 l1=1 and r k = n r_k = n rk=n. These pairs represent the subsegments themselves.
‡ MEX ^{\ddagger}\operatorname{MEX} ‡MEX of an array is the smallest non-negative integer that does not belong to the array.
For example:
Each test consists of multiple test cases. The first line contains a single integer t t t ( 1 ≤ t ≤ 1 0 4 1 \leq t \leq 10^4 1≤t≤104) — the number of test cases. The description of the test cases follows.
The first line of each test case contains a single integer n n n ( 2 ≤ n ≤ 1 0 5 2 \le n \le 10^5 2≤n≤105) — the length of the array a a a.
The second line of each test case contains n n n integers a 1 , a 2 , … , a n a_1, a_2, \ldots, a_n a1,a2,…,an ( 0 ≤ a i < n 0 \le a_i < n 0≤ai<n) — the elements of the array a a a.
It is guaranteed that the sum of n n n over all test cases does not exceed 1 0 5 10^5 105.
For each test case, output a single integer − 1 -1 −1 if a suitable division does not exist.
Otherwise, on the first line, output an integer k k k ( 2 ≤ k ≤ n 2 \le k \le n 2≤k≤n) — the number of subsegments in the division.
Then output k k k lines — the division into subsegments. The i i i-th line should contain two integers l i l_i li and r i r_i ri ( 1 ≤ l i ≤ r i ≤ n 1 \le l_i \le r_i \le n 1≤li≤ri≤n) — the boundaries of the i i i-th subsegment.
The following conditions must be satisfied:
If there are multiple possible solutions, output any of them.
Example
input |
---|
5 |
2 |
0 0 |
5 |
0 1 2 3 4 |
8 |
0 1 7 1 0 1 0 3 |
3 |
2 2 2 |
4 |
0 1 2 0 |
output |
---|
2 |
1 1 |
2 2 |
-1 |
3 |
1 3 |
4 5 |
6 8 |
3 |
1 1 |
2 2 |
3 3 |
-1 |
Note
In the first test case, the array a a a can be divided into 2 2 2 subsegments with boundaries [ 1 , 1 ] [1, 1] [1,1] and [ 2 , 2 ] [2, 2] [2,2]:
In the second test case, it can be proven that the required division does not exist.
In the third test case, the array a a a can be divided into 3 3 3 subsegments with boundaries [ 1 , 3 ] [1, 3] [1,3], [ 4 , 5 ] [4, 5] [4,5], [ 6 , 8 ] [6, 8] [6,8]:
具体见文后视频。
#include <bits/stdc++.h> #define int long long using namespace std; typedef pair<int, int> PII; typedef long long LL; void solve() { int n; cin >> n; std::vector<int> a(n), vis(n, 0); for (int i = 0; i < n; i ++) cin >> a[i], vis[a[i]] = 1; int mex = 0; for (int i = 0; i < n; i ++) if (!vis[i]) break; else mex ++; int tmp = 0, cnt = 0; unordered_map<int, int> has; std::vector<PII> way; for (int r = 0, l = 0; r < n; r ++) { has[a[r]] = 1; while (has.count(tmp)) tmp ++; if (tmp == mex) way.emplace_back(l + 1, r + 1), l = r + 1, cnt ++, tmp = 0, has.clear(); } way.back().second = n; if (cnt > 1) { cout << way.size() << endl; for (auto v : way) cout << v.first << " " << v.second << endl; } else cout << -1 << endl; } signed main() { cin.tie(0); cout.tie(0); ios::sync_with_stdio(0); int Data; cin >> Data; while (Data --) solve(); return 0; }
In the new messenger for the students of the Master’s Assistance Center, Keftemerum, an update is planned, in which developers want to optimize the set of messages shown to the user. There are a total of n n n messages. Each message is characterized by two integers a i a_i ai and b i b_i bi. The time spent reading the set of messages with numbers p 1 , p 2 , … , p k p_1, p_2, \ldots, p_k p1,p2,…,pk ( 1 ≤ p i ≤ n 1 \le p_i \le n 1≤pi≤n, all p i p_i pi are distinct) is calculated by the formula:
∑ i = 1 k a p i + ∑ i = 1 k − 1 ∣ b p i − b p i + 1 ∣ \Large \sum_{i=1}^{k} a_{p_i} + \sum_{i=1}^{k - 1} |b_{p_i} - b_{p_{i+1}}| i=1∑kapi+i=1∑k−1∣bpi−bpi+1∣
Note that the time to read a set of messages consisting of one message with number p 1 p_1 p1 is equal to a p 1 a_{p_1} ap1. Also, the time to read an empty set of messages is considered to be 0 0 0.
The user can determine the time l l l that he is willing to spend in the messenger. The messenger must inform the user of the maximum possible size of the set of messages, the reading time of which does not exceed l l l. Note that the maximum size of the set of messages can be equal to 0 0 0.
The developers of the popular messenger failed to implement this function, so they asked you to solve this problem.
Each test consists of multiple test cases. The first line contains a single integer t t t ( 1 ≤ t ≤ 5 ⋅ 1 0 4 1 \leq t \leq 5 \cdot 10^4 1≤t≤5⋅104) — the number of test cases. The description of the test cases follows.
The first line of each test case contains two integers n n n and l l l ( 1 ≤ n ≤ 2000 1 \leq n \leq 2000 1≤n≤2000, 1 ≤ l ≤ 1 0 9 1 \leq l \leq 10^9 1≤l≤109) — the number of messages and the time the user is willing to spend in the messenger.
The i i i-th of the next n n n lines contains two integers a i a_i ai and b i b_i bi ( 1 ≤ a i , b i ≤ 1 0 9 1 \le a_i, b_i \le 10^9 1≤ai,bi≤109) — characteristics of the i i i-th message.
It is guaranteed that the sum of n 2 n^2 n2 over all test cases does not exceed 4 ⋅ 1 0 6 4 \cdot 10^6 4⋅106.
For each test case, output a single integer — the maximum possible size of a set of messages, the reading time of which does not exceed l l l.
input |
---|
5 |
5 8 |
4 3 |
1 5 |
2 4 |
4 3 |
2 3 |
1 6 |
4 10 |
3 12 |
4 8 |
2 1 |
2 12 |
5 26 |
24 7 |
8 28 |
30 22 |
3 8 |
17 17 |
5 14 |
15 3 |
1000000000 998244353 |
179 239 |
228 1337 |
993 1007 |
output |
---|
3 |
1 |
2 |
1 |
0 |
Note
In the first test case, you can take a set of three messages with numbers p 1 = 3 p_1 = 3 p1=3, p 2 = 2 p_2 = 2 p2=2, and p 3 = 5 p_3 = 5 p3=5. The time spent reading this set is equal to a 3 + a 2 + a 5 + ∣ b 3 − b 2 ∣ + ∣ b 2 − b 5 ∣ = 2 + 1 + 2 + ∣ 4 − 5 ∣ + ∣ 5 − 3 ∣ = 8 a_3 + a_2 + a_5 + |b_3 - b_2| + |b_2 - b_5| = 2 + 1 + 2 + |4 - 5| + |5 - 3| = 8 a3+a2+a5+∣b3−b2∣+∣b2−b5∣=2+1+2+∣4−5∣+∣5−3∣=8.
In the second test case, you can take a set of one message with number p 1 = 1 p_1 = 1 p1=1. The time spent reading this set is equal to a 1 = 4 a_1 = 4 a1=4.
In the fifth test case, it can be shown that there is no such non-empty set of messages, the reading time of which does not exceed l l l.
具体见文后视频。
#include <bits/stdc++.h> #define int long long using namespace std; typedef pair<int, int> PII; typedef long long LL; const int N = 2e3 + 10, INF = 4e18; int n, l; PII mes[N]; int f[N][N], g[N], p[N]; bool cmp(PII a, PII b) { return a.second < b.second; } void solve() { cin >> n >> l; for (int i = 1; i <= n; i ++) cin >> mes[i].first >> mes[i].second; sort(mes + 1, mes + 1 + n, cmp); for (int i = 0; i <= n; i ++) for (int j = 0; j <= n; j ++) f[i][j] = INF, g[j] = INF; for (int i = 1; i <= n; i ++) { for (int j = i; j >= 2; j --) { f[i][j] = g[j - 1] + mes[i].first + mes[i].second; if (g[j] > f[i][j] - mes[i].second) g[j] = f[i][j] - mes[i].second, p[j] = i; } f[i][1] = mes[i].first; if (f[i][1] - mes[i].second < g[1]) g[1] = f[i][1] - mes[i].second, p[1] = i; } for (int j = 1; j <= n; j ++) g[j] = INF; for (int i = 1; i <= n; i ++) for (int j = 1; j <= i; j ++) g[j] = min(f[i][j], g[j]); for (int i = 1; i <= n; i ++) if (g[i] > l) { cout << i - 1 << endl; return; } cout << n << endl; } signed main() { cin.tie(0); cout.tie(0); ios::sync_with_stdio(0); int Data; cin >> Data; while (Data --) solve(); return 0; }
The Master’s Assistance Center has announced an entrance exam, which consists of the following.
The candidate is given a set s s s of size n n n and some strange integer c c c. For this set, it is needed to calculate the number of pairs of integers ( x , y ) (x, y) (x,y) such that 0 ≤ x ≤ y ≤ c 0 \leq x \leq y \leq c 0≤x≤y≤c, x + y x + y x+y is not contained in the set s s s, and also y − x y - x y−x is not contained in the set s s s.
Your friend wants to enter the Center. Help him pass the exam!
Each test consists of multiple test cases. The first line contains a single integer t t t ( 1 ≤ t ≤ 2 ⋅ 1 0 4 1 \leq t \leq 2 \cdot 10^4 1≤t≤2⋅104) — the number of test cases. The description of the test cases follows.
The first line of each test case contains two integers n n n and c c c ( 1 ≤ n ≤ 3 ⋅ 1 0 5 1 \leq n \leq 3 \cdot 10^5 1≤n≤3⋅105, 1 ≤ c ≤ 1 0 9 1 \leq c \leq 10^9 1≤c≤109) — the size of the set and the strange integer.
The second line of each test case contains n n n integers s 1 , s 2 , … , s n s_1, s_2, \ldots, s_{n} s1,s2,…,sn ( 0 ≤ s 1 < s 2 < … < s n ≤ c 0 \leq s_1 < s_2 < \ldots < s_{n} \leq c 0≤s1<s2<…<sn≤c) — the elements of the set s s s.
It is guaranteed that the sum of n n n over all test cases does not exceed 3 ⋅ 1 0 5 3 \cdot 10^5 3⋅105.
For each test case, output a single integer — the number of suitable pairs of integers.
Example
input |
---|
8 |
3 3 |
1 2 3 |
1 179 |
57 |
4 6 |
0 3 5 6 |
1 1 |
1 |
5 10 |
0 2 4 8 10 |
5 10 |
1 3 5 7 9 |
4 10 |
2 4 6 7 |
3 1000000000 |
228 1337 998244353 |
output |
---|
3 |
16139 |
10 |
2 |
33 |
36 |
35 |
499999998999122959 |
Note
In the first test case, the following pairs are suitable: ( 0 , 0 ) (0, 0) (0,0), ( 2 , 2 ) (2, 2) (2,2), ( 3 , 3 ) (3, 3) (3,3).
In the third test case, the following pairs are suitable: ( 0 , 1 ) (0, 1) (0,1), ( 0 , 2 ) (0, 2) (0,2), ( 0 , 4 ) (0, 4) (0,4), ( 1 , 3 ) (1, 3) (1,3), ( 2 , 6 ) (2, 6) (2,6), ( 3 , 4 ) (3, 4) (3,4), ( 3 , 5 ) (3, 5) (3,5), ( 4 , 5 ) (4, 5) (4,5), ( 4 , 6 ) (4, 6) (4,6), ( 5 , 6 ) (5, 6) (5,6).
具体见文后视频。
#include <bits/stdc++.h> #define int long long using namespace std; typedef pair<int, int> PII; typedef long long LL; void solve() { int n, c; cin >> n >> c; int tot = (c + 2) * (c + 1) / 2, illigal = 0, a; int cnt[2] = {0}; for (int i = 0; i < n; i ++) { cin >> a; cnt[a & 1] ++, illigal += (a / 2 + 1), illigal += (c - a + 1), illigal -= cnt[a & 1]; } cout << tot - illigal << endl; } signed main() { cin.tie(0); cout.tie(0); ios::sync_with_stdio(0); int Data; cin >> Data; while (Data --) solve(); return 0; }
The New Year has arrived in the Master’s Assistance Center, which means it’s time to introduce a new feature!
Now students are given distance learning courses, with a total of n n n courses available. For the i i i-th distance learning course, a student can receive a grade ranging from x i x_i xi to y i y_i yi.
However, not all courses may be available to each student. Specifically, the j j j-th student is only given courses with numbers from l j l_j lj to r j r_j rj, meaning the distance learning courses with numbers l j , l j + 1 , … , r j l_j, l_j + 1, \ldots, r_j lj,lj+1,…,rj.
The creators of the distance learning courses have decided to determine the final grade in a special way. Let the j j j-th student receive grades c l j , c l j + 1 , … , c r j c_{l_j}, c_{l_j + 1}, \ldots, c_{r_j} clj,clj+1,…,crj for their distance learning courses. Then their final grade will be equal to c l j c_{l_j} clj ∣ | ∣ c l j + 1 c_{l_j + 1} clj+1 ∣ | ∣ … \ldots … ∣ | ∣ c r j c_{r_j} crj, where ∣ | ∣ denotes the bitwise OR operation.
Since the chatbot for solving distance learning courses is broken, the students have asked for your help. For each of the q q q students, tell them the maximum final grade they can achieve.
Each test consists of multiple test cases. The first line contains a single integer t t t ( 1 ≤ t ≤ 2 ⋅ 1 0 4 1 \leq t \leq 2 \cdot 10^4 1≤t≤2⋅104) — the number of test cases. The description of the test cases follows.
The first line of each test case contains a single integer n n n ( 1 ≤ n ≤ 2 ⋅ 1 0 5 1 \le n \le 2 \cdot 10^5 1≤n≤2⋅105) — the number of distance learning courses.
Each of the following n n n lines contains two integers x i x_i xi and y i y_i yi ( 0 ≤ x i ≤ y i < 2 30 0 \le x_i \le y_i < 2^{30} 0≤xi≤yi<230) — the minimum and maximum grade that can be received for the i i i-th course.
The next line contains a single integer q q q ( 1 ≤ q ≤ 2 ⋅ 1 0 5 1 \le q \le 2\cdot10^5 1≤q≤2⋅105) — the number of students.
Each of the following q q q lines contains two integers l j l_j lj and r j r_j rj ( 1 ≤ l j ≤ r j ≤ n 1 \le l_j \le r_j \le n 1≤lj≤rj≤n) — the minimum and maximum course numbers accessible to the j j j-th student.
It is guaranteed that the sum of n n n over all test cases and the sum of q q q over all test cases do not exceed 2 ⋅ 1 0 5 2\cdot10^5 2⋅105.
For each test case, output q q q integers, where the j j j-th integer is the maximum final grade that the j j j-th student can achieve.
input |
---|
3 |
2 |
0 1 |
3 4 |
3 |
1 1 |
1 2 |
2 2 |
4 |
1 7 |
1 7 |
3 10 |
2 2 |
5 |
1 3 |
3 4 |
2 3 |
1 4 |
1 2 |
6 |
1 2 |
2 2 |
0 1 |
1 1 |
3 3 |
0 0 |
4 |
3 4 |
5 5 |
2 5 |
1 2 |
output |
---|
1 5 4 |
15 11 15 15 7 |
1 3 3 3 |
Note
In the first test case:
The maximum grade for the first student is 1 1 1:
Therefore, the final grade is 1 1 1.
The maximum grade for the second student is 5 5 5:
Therefore, the final grade is 1 1 1 ∣ | ∣ 4 4 4 = = = 5 5 5.
The maximum grade for the third student is 4 4 4:
Therefore, the final grade is 4 4 4.
In the second test case:
The maximum grade for the first student is 15 15 15:
Therefore, the final grade is 7 7 7 ∣ | ∣ 4 4 4 ∣ | ∣ 8 8 8 = = = 15 15 15.
The maximum grade for the second student is 11 11 11:
Therefore, the final grade is 9 9 9 ∣ | ∣ 2 2 2 = = = 11 11 11.
具体见文后视频。
#include <bits/stdc++.h> #define int long long using namespace std; typedef pair<int, int> PII; typedef long long LL; void solve() { int n, q; cin >> n; std::vector<int> x(n), y(n), bit(n, 30); std::vector<array<int, 31>> cnt(n + 1), vis(n + 1); for (int i = 0; i < n; i ++) { vis[i + 1].fill(0); cin >> x[i] >> y[i]; while (bit[i] >= 0 && (x[i] >> bit[i] & 1) == (y[i] >> bit[i] & 1)) bit[i] --; bit[i] ++; for (int j = bit[i]; j <= 30; j ++) vis[i + 1][j] += (x[i] >> j & 1); x[i] &= ((1 << bit[i]) - 1), y[i] &= ((1 << bit[i]) - 1); } cnt[0].fill(0); for (int i = 1; i <= n; i ++) { cnt[i] = cnt[i - 1]; for (int j = 30; j >= 0; j --) cnt[i][j] += (y[i - 1] >> j & 1), vis[i][j] += vis[i - 1][j]; } cin >> q; while (q --) { int l, r; cin >> l >> r; int res = 0, flg = 1; for (int i = 30; i >= 0; i --) if (vis[r][i] - vis[l - 1][i] > 0) res += (1 << i); for (int i = 30; i >= 0; i --) { // if (l == 3 && r == 4) cout << i << ":" << cnt[r][i] - cnt[l - 1][i] << endl; if (vis[r][i] - vis[l - 1][i] > 0) { if (cnt[r][i] - cnt[l - 1][i] > 0) { res |= ((1 << i + 1) - 1), flg = 0; cout << res << " \n"[q == 0]; break; } } else { if (cnt[r][i] - cnt[l - 1][i] > 1) { res |= ((1 << i + 1) - 1), flg = 0; cout << res << " \n"[q == 0]; break; } else if (cnt[r][i] - cnt[l - 1][i] == 1) res |= (1 << i); } } if (!flg) continue; cout << res << " \n"[q == 0]; } } signed main() { cin.tie(0); cout.tie(0); ios::sync_with_stdio(0); int Data; cin >> Data; while (Data --) solve(); return 0; }
Codeforces Round 932 (Div. 2)(A ~ E 题讲解)
最后祝大家早日
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。