A - delete .
Problem Statement
You are given a string S S S consisting of lowercase English letters and .
.
Find the string obtained by removing all .
from S S S.
Constraints
S S S is a string of length between 1 1 1 and 100 100 100, inclusive, consisting of lowercase English letters and .
.
Input
The input is given from Standard Input in the following format:
S S S
Output
Print the string obtained by removing all .
from S S S.
Sample Input 1
.v.
Sample Output 1
v
Removing all .
from .v.
yields v
, so print v
.
Sample Input 2
chokudai
Sample Output 2
chokudai
There are cases where S S S does not contain .
.
Sample Input 3
...
Sample Output 3
There are also cases where all characters in S S S are .
.
Solution
具体见文末视频。
Code
#include <bits/stdc++.h>
#define fi first
#define se second
#define int long longusing namespace std;typedef pair<int, int> PII;
typedef long long LL;string s;signed main() {cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);cin >> s;for (auto v : s)if (v != '.') cout << v;cout << endl;return 0;
}
B - 3^A
Problem Statement
You are given a positive integer M M M.
Find a positive integer N N N and a sequence of non-negative integers A = ( A 1 , A 2 , … , A N ) A = (A_1, A_2, \ldots, A_N) A=(A1,A2,…,AN) that satisfy all of the following conditions:
1 ≤ N ≤ 20 1 \le N \le 20 1≤N≤20
0 ≤ A i ≤ 10 0 \le A_i \le 10 0≤Ai≤10 ( 1 ≤ i ≤ N ) (1 \le i \le N) (1≤i≤N)
∑ i = 1 N 3 A i = M \displaystyle \sum_{i=1}^N 3^{A_i} = M i=1∑N3Ai=M
It can be proved that under the constraints, there always exists at least one such pair of N N N and A A A satisfying the conditions.
Constraints
1 ≤ M ≤ 1 0 5 1 \le M \le 10^5 1≤M≤105
Input
The input is given from Standard Input in the following format:
$M$
Output
Print N N N and A A A satisfying the conditions in the following format:
$N$
$A_1$ $A_2$ $\ldots$ $A_N$
If there are multiple valid pairs of N N N and A A A, any of them is acceptable.
Sample Input 1
6
Sample Output 1
2
1 1
For example, with N = 2 N=2 N=2 and A = ( 1 , 1 ) A=(1,1) A=(1,1), we have ∑ i = 1 N 3 A i = 3 + 3 = 6 \displaystyle \sum_{i=1}^N 3^{A_i} = 3+3=6 i=1∑N3Ai=3+3=6, satisfying all conditions.
Another example is N = 4 N=4 N=4 and A = ( 0 , 0 , 1 , 0 ) A=(0,0,1,0) A=(0,0,1,0), which also satisfies the conditions.
Sample Input 2
100
Sample Output 2
4
2 0 2 4
Sample Input 3
59048
Sample Output 3
20
0 0 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9
Note the condition 1 ≤ N ≤ 20 1 \le N \le 20 1≤N≤20.
Solution
具体见文末视频。
Code
#include <bits/stdc++.h>
#define fi first
#define se second
#define int long longusing namespace std;typedef pair<int, int> PII;
typedef long long LL;signed main() {cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);int n;cin >> n;std::vector<int> bit;while (n) {bit.push_back(n % 3);n /= 3;}std::vector<int> res;for (int i = bit.size() - 1; i >= 0; i --)for (int j = bit[i]; j >= 1; j --) res.push_back(i);cout << res.size() << endl;for (auto v : res)cout << v << " ";cout << endl;return 0;
}
C - Count ABC Again
Problem Statement
You are given a string S S S of length N N N. You are also given Q Q Q queries, which you should process in order.
The i i i-th query is as follows:
Given an integer X i X_i Xi and a character C i C_i Ci, replace the X i X_i Xi-th character of S S S with C i C_i Ci. Then, print the number of times the string ABC
appears as a substring in S S S.
Here, a substring of S S S is a string obtained by deleting zero or more characters from the beginning and zero or more characters from the end of S S S.
For example, ab
is a substring of abc
, but ac
is not a substring of abc
.
Constraints
3 ≤ N ≤ 2 × 1 0 5 3 \le N \le 2 \times 10^5 3≤N≤2×105
1 ≤ Q ≤ 2 × 1 0 5 1 \le Q \le 2 \times 10^5 1≤Q≤2×105
S S S is a string of length N N N consisting of uppercase English letters.
1 ≤ X i ≤ N 1 \le X_i \le N 1≤Xi≤N
C i C_i Ci is an uppercase English letter.
Input
The input is given from Standard Input in the following format:
$N$ $Q$
$S$
$X_1$ $C_1$
$X_2$ $C_2$
$\vdots$
$X_Q$ $C_Q$
Output
Print Q Q Q lines.
The i i i-th line ( 1 ≤ i ≤ Q ) (1 \le i \le Q) (1≤i≤Q) should contain the answer to the i i i-th query.
Sample Input 1
7 4
ABCDABC
4 B
3 A
5 C
4 G
Sample Output 1
2
1
1
0
After processing each query, S S S becomes as follows.
After the first query: S = S= S= ABCBABC
. In this string, ABC
appears twice as a substring.
After the second query: S = S= S= ABABABC
. In this string, ABC
appears once as a substring.
After the third query: S = S= S= ABABCBC
. In this string, ABC
appears once as a substring.
After the fourth query: S = S= S= ABAGCBC
. In this string, ABC
appears zero times as a substring.
Sample Input 2
3 3
ABC
1 A
2 B
3 C
Sample Output 2
1
1
1
There are cases where S S S does not change through processing a query.
Sample Input 3
15 10
BBCCBCACCBACACA
9 C
11 B
5 B
11 B
4 A
8 C
8 B
5 B
7 B
14 B
Sample Output 3
0
0
0
0
1
1
2
2
1
1
Solution
具体见文末视频。
Code
#include <bits/stdc++.h>
#define fi first
#define se second
#define int long longusing namespace std;typedef pair<int, int> PII;
typedef long long LL;signed main() {cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);int n, q;string s;cin >> n >> q >> s;auto count = [&](int x) -> int {int cnt = 0;if (x + 2 < n) cnt += (s[x] == 'A' && s[x + 1] == 'B' && s[x + 2] == 'C');if (x > 0 && x + 1 < n) cnt += (s[x - 1] == 'A' && s[x] == 'B' && s[x + 1] == 'C');if (x > 1) cnt += (s[x - 2] == 'A' && s[x - 1] == 'B' && s[x] == 'C');return cnt;};int res = 0;for (int i = 0; i < n - 2; i ++)if (s[i] == 'A' && s[i + 1] == 'B' && s[i + 2] == 'C') res ++, i += 2;while (q --) {int x;char c;cin >> x >> c, x --;res -= count(x), s[x] = c, res += count(x);cout << res << endl;}return 0;
}
D - Buildings
Problem Statement
There are N N N buildings, Building 1 1 1, Building 2 2 2, … \ldots …, Building N N N, arranged in a line in this order. The height of Building i i i ( 1 ≤ i ≤ N ) (1 \leq i \leq N) (1≤i≤N) is H i H_i Hi.
For each i = 1 , 2 , … , N i = 1, 2, \ldots, N i=1,2,…,N, find the number of integers j j j KaTeX parse error: Expected 'EOF', got '&' at position 4: (i &̲lt; j \leq N) satisfying the following condition:
There is no building taller than Building j j j between Buildings i i i and j j j.
Constraints
1 ≤ N ≤ 2 × 1 0 5 1 \leq N \leq 2 \times 10^5 1≤N≤2×105
1 ≤ H i ≤ N 1 \leq H_i \leq N 1≤Hi≤N
$ H_i\neq H_j\ (i\neq j)$
All input values are integers.
Input
The input is given from Standard Input in the following format:
$N$
$H_1$ $H_2$ $\ldots$ $H_N$
Output
For each i = 1 , 2 , … , N i = 1, 2, \ldots, N i=1,2,…,N, let c i c_i ci be the number of j j j satisfying the condition. Print c 1 , c 2 , … , c N c_1, c_2, \ldots, c_N c1,c2,…,cN in order, separated by spaces.
Sample Input 1
5
2 1 4 3 5
Sample Output 1
3 2 2 1 0
For i = 1 i=1 i=1, the integers j j j satisfying the condition are 2 2 2, 3 3 3, and 5 5 5: there are three. (Between Buildings 1 1 1 and 4 4 4, there is a building taller than Building 4 4 4, which is Building 3 3 3, so j = 4 j=4 j=4 does not satisfy the condition.) Therefore, the first number in the output is 3 3 3.
Sample Input 2
4
1 2 3 4
Sample Output 2
3 2 1 0
Sample Input 3
10
1 9 6 5 2 7 10 4 8 3
Sample Output 3
2 3 3 3 2 1 2 1 1 0
Solution
具体见文末视频。
Code
#include <bits/stdc++.h>
#define fi first
#define se second
#define int long longusing namespace std;typedef pair<int, int> PII;
typedef long long LL;signed main() {cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);int n;cin >> n;std::vector<int> a(n + 1);for (int i = 1; i <= n; i ++) cin >> a[i];stack<int> stk;std::vector<int> res(n + 1, 0);for (int i = n; i >= 1; i --) {res[i] = stk.size();while (stk.size() && stk.top() < a[i]) stk.pop();stk.push(a[i]);}for (int i = 1; i <= n; i ++) cout << res[i] << " ";cout << endl;return 0;
}
E - K-th Largest Connected Components
Problem Statement
There is an undirected graph with N N N vertices and 0 0 0 edges. The vertices are numbered 1 1 1 to N N N.
You are given Q Q Q queries to process in order. Each query is of one of the following two types:
Type 1 1 1: Given in the format 1 u v
. Add an edge between vertices u u u and v v v.
Type 2 2 2: Given in the format 2 v k
. Print the k k k-th largest vertex number among the vertices connected to vertex v v v. If there are fewer than k k k vertices connected to v v v, print -1
.
Constraints
1 ≤ N , Q ≤ 2 × 1 0 5 1 \leq N, Q \leq 2 \times 10^5 1≤N,Q≤2×105
In a Type 1 1 1 query, KaTeX parse error: Expected 'EOF', got '&' at position 10: 1 \leq u &̲lt; v \leq N.
In a Type 2 2 2 query, 1 ≤ v ≤ N 1 \leq v \leq N 1≤v≤N, 1 ≤ k ≤ 10 1 \leq k \leq 10 1≤k≤10.
All input values are integers.
Input
The input is given from Standard Input in the following format:
N N N Q Q Q
q u e r y 1 \mathrm{query}_1 query1
q u e r y 2 \mathrm{query}_2 query2
⋮ \vdots ⋮
q u e r y Q \mathrm{query}_Q queryQ
Here, q u e r y i \mathrm{query}_i queryi is the i i i-th query and is given in one of the following formats:
1 1 1 u u u v v v
2 2 2 v v v k k k
Output
Let q q q be the number of Type 2 2 2 queries. Print q q q lines.
The i i i-th line should contain the answer to the i i i-th Type 2 2 2 query.
Sample Input 1
4 10
1 1 2
2 1 1
2 1 2
2 1 3
1 1 3
1 2 3
1 3 4
2 1 1
2 1 3
2 1 5
Sample Output 1
2
1
-1
4
2
-1
In the first query, an edge is added between vertices 1 1 1 and 2 2 2.
In the second query, two vertices are connected to vertex 1 1 1: 1 1 1 and 2 2 2. Among them, the 1 1 1-st largest vertex number is 2 2 2, which should be printed.
In the third query, two vertices are connected to vertex 1 1 1: 1 1 1 and 2 2 2. Among them, the 2 2 2-nd largest vertex number is 1 1 1, which should be printed.
In the fourth query, two vertices are connected to vertex 1 1 1: 1 1 1 and 2 2 2, which is fewer than 3 3 3, so print -1
.
In the fifth query, an edge is added between vertices 1 1 1 and 3 3 3.
In the sixth query, an edge is added between vertices 2 2 2 and 3 3 3.
In the seventh query, an edge is added between vertices 3 3 3 and 4 4 4.
In the eighth query, four vertices are connected to vertex 1 1 1: 1 , 2 , 3 , 4 1,2,3,4 1,2,3,4. Among them, the 1 1 1-st largest vertex number is 4 4 4, which should be printed.
In the ninth query, four vertices are connected to vertex 1 1 1: 1 , 2 , 3 , 4 1,2,3,4 1,2,3,4. Among them, the 3 3 3-rd largest vertex number is 2 2 2, which should be printed.
In the tenth query, four vertices are connected to vertex 1 1 1: 1 , 2 , 3 , 4 1,2,3,4 1,2,3,4, which is fewer than 5 5 5, so print -1
.
Sample Input 2
6 20
1 3 4
1 3 5
2 1 1
2 3 1
1 1 5
2 6 9
2 1 3
2 6 1
1 4 6
2 2 1
2 6 2
2 4 7
1 1 4
2 6 2
2 3 4
1 2 5
2 4 1
1 1 6
2 3 3
2 1 3
Sample Output 2
1
5
-1
3
6
2
5
-1
5
3
6
4
4
Solution
具体见文末视频。
Code
#include <bits/stdc++.h>
#define fi first
#define se second
#define int long longusing namespace std;typedef pair<int, int> PII;
typedef long long LL;signed main() {cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);int n, q;cin >> n >> q;std::vector<set<int>> pnt(n + 1);std::vector<int> par(n + 1);for (int i = 1; i <= n; i ++) par[i] = i, pnt[i].insert(i);auto find = [&](auto self, int x) -> int {if (par[x] != x) par[x] = self(self, par[x]);return par[x];};while (q -- ) {int op, u, v;cin >> op >> u >> v;if (op == 1) {int pu = find(find, u), pv = find(find, v);if (pu == pv) continue;if (pnt[pu].size() > pnt[pv].size()) swap(pu, pv);for (auto v : pnt[pu]) pnt[pv].insert(v);par[pu] = pv;} else {if (pnt[find(find, u)].size() < v) cout << -1 << endl;else {auto it = pnt[find(find, u)].end();v --, it --;while (v -- ) it --;cout << *it << endl;}}}return 0;
}
F - Teleporting Takahashi 2
Problem Statement
There is a simple directed graph G G G with N N N vertices and N + M N+M N+M edges. The vertices are numbered 1 1 1 to N N N, and the edges are numbered 1 1 1 to N + M N+M N+M.
Edge i i i ( 1 ≤ i ≤ N ) (1 \leq i \leq N) (1≤i≤N) goes from vertex i i i to vertex i + 1 i+1 i+1. (Here, vertex N + 1 N+1 N+1 is considered as vertex 1 1 1.)
Edge N + i N+i N+i ( 1 ≤ i ≤ M ) (1 \leq i \leq M) (1≤i≤M) goes from vertex X i X_i Xi to vertex Y i Y_i Yi.
Takahashi is at vertex 1 1 1. At each vertex, he can move to any vertex to which there is an outgoing edge from the current vertex.
Compute the number of ways he can move exactly K K K times.
That is, find the number of integer sequences ( v 0 , v 1 , … , v K ) (v_0, v_1, \dots, v_K) (v0,v1,…,vK) of length K + 1 K+1 K+1 satisfying all of the following three conditions:
1 ≤ v i ≤ N 1 \leq v_i \leq N 1≤vi≤N for i = 0 , 1 , … , K i = 0, 1, \dots, K i=0,1,…,K.
v 0 = 1 v_0 = 1 v0=1.
There is a directed edge from vertex v i − 1 v_{i-1} vi−1 to vertex v i v_i vi for i = 1 , 2 , … , K i = 1, 2, \ldots, K i=1,2,…,K.
Since this number can be very large, print it modulo 998244353 998244353 998244353.
Constraints
2 ≤ N ≤ 2 × 1 0 5 2 \leq N \leq 2 \times 10^5 2≤N≤2×105
0 ≤ M ≤ 50 0 \leq M \leq 50 0≤M≤50
1 ≤ K ≤ 2 × 1 0 5 1 \leq K \leq 2 \times 10^5 1≤K≤2×105
1 ≤ X i , Y i ≤ N 1 \leq X_i, Y_i \leq N 1≤Xi,Yi≤N, X i ≠ Y i X_i \neq Y_i Xi=Yi
All of the N + M N+M N+M directed edges are distinct.
All input values are integers.
Input
The input is given from Standard Input in the following format:
N N N M M M K K K
X 1 X_1 X1 Y 1 Y_1 Y1
X 2 X_2 X2 Y 2 Y_2 Y2
⋮ \vdots ⋮
X M X_M XM Y M Y_M YM
Output
Print the count modulo 998244353 998244353 998244353.
Sample Input 1
6 2 5
1 4
2 5
Sample Output 1
5

Solution
具体见文末视频。
Code
#include <bits/stdc++.h>
#define fi first
#define se second
#define int long longusing namespace std;typedef pair<int, int> PII;
typedef long long LL;const int N = 2e5 + 10, M = 1e2 + 10, mod = 998244353;int n, m, k;
std::vector<PII> g[N];
int st[N], dp[M][N], pnt[M], to[M];signed main() {cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);cin >> n >> m >> k;while (m -- ) {int u, v;cin >> u >> v;g[u].emplace_back(v, 1), st[u] = st[v] = 1;}int lst = 1, cnt = 0;unordered_map<int, int> idx;idx[1] = ++ cnt, pnt[1] = 1;for (int i = 2; i <= n; i ++)if (st[i]) {g[lst].emplace_back(i, i - lst), to[cnt] = i - lst;lst = i, idx[i] = ++ cnt, pnt[cnt] = i;}if (~lst) g[lst].emplace_back(1, n - lst + 1), to[cnt] = n - lst + 1;dp[idx[1]][0] = 1;for (int j = 0; j <= k; j ++)for (int i = 1; i <= cnt; i ++) {int u = pnt[i];for (auto v : g[u])if (j + v.se <= k)(dp[idx[v.fi]][j + v.se] += dp[i][j]) %= mod;}int res = 0;for (int i = 1; i <= cnt; i ++) {// int lst = i - 1;// if (!lst) lst = cnt;// cout << to[lst] << endl;for (int j = k - to[i] + 1; j <= k; j ++) {(res += dp[i][j]) %= mod;// cout << i << " " << j << ":" << dp[i][j] << endl;}}cout << res << endl;return 0;
}
视频题解
AtCoder Beginner Contest 372(A ~ F 题讲解)
最后祝大家早日