被多次通知了还是出来营业下(),比赛链接。
就体验而言:反作弊系统比一般笔试系统还严格些,评测系统比一般比赛系统还粗糙些,题库比较老旧且缺乏校对。
第六期的问题暂且略过,至少 bug 们没有都留到下一期。
题意:把一个数组 v v v 重排,使所有奇数在所有偶数的左边。数据范围似乎没说(当作 ∣ v ∣ ≤ 1 0 5 |v| \leq 10^5 ∣v∣≤105 好了),也没保证至少有一个奇数、一个偶数()。
思路:
代码:C++
std::vector<int> solution(int n, std::vector<int>& vec){
std::vector<int> result, even;
for(int x: vec)
if(x & 1) {
result.push_back(x);
} else {
even.push_back(x);
}
result.insert(result.end(), even.begin(), even.end());
return result;
}
题意:给一个字符串 s s s,求它的最长回文子串长度。数据范围 ∣ s ∣ ≤ 1 0 4 |s| \leq 10^4 ∣s∣≤104,没保证字符串由非空白的可见字符构成(但代码模版只能处理非空白字符的情况 )
思路:
代码:C++
int solution(std::string s){
int n = s.size(), m = n + n + 1;
std::string t = "#";
for(int i = 0; i < n; ++i) {
t.push_back(s[i]);
t.push_back('#');
}
int result = 0;
std::vector<int> h(m);
for(int i = 0, C = 0, R = 0; i < m; ++i) {
h[i] = i < R ? std::min(h[C + C - i], R - i) : 0;
for( ; i - h[i] >= 0 && i + h[i] < m && t[i - h[i]] == t[i + h[i]]; ++h[i]);
if(i + h[i] > R) {
C = i;
R = i + h[i];
}
// printf("%c %d\n", t[i], h[i]);
result = std::max(result, h[i] - 1);
}
return result;
}
题意:给两个长度为 n n n 的二进制数 A A A 和 B B B,选两个不同二进制位分别将 A A A 和 B B B 上对应值交换,得到 A ′ A' A′ 和 B ′ B' B′,问有多少种方式可以使得 ( A ∣ B ) ≠ ( A ′ ∣ B ′ ) (A | B) \neq (A' | B') (A∣B)=(A′∣B′),这里 ∣ | ∣ 代表按位或。数据范围 n ≤ 1 0 5 n \leq 10^5 n≤105 但没有保证答案可以用有符号 32 位整型数表示()
思路:
代码:C++
typedef long long LL;
LL solution(int n, std::string str1, std::string str2){
std::vector<int> ctr(4);
for(int i = 0; i < n; ++i) {
int msk = (str1[i] == '1') << 1 | (str2[i] == '1');
++ctr[msk];
}
LL result = 0;
for(int i = 0; i < 4; ++i)
for(int j = i + 1; j < 4; ++j) {
if((i >> 1) == (j >> 1))
continue;
int d0 = ((i >> 1) | (i & 1)) ^ ((j >> 1) | (i & 1));
int d1 = ((j >> 1) | (j & 1)) ^ ((i >> 1) | (j & 1));
if(d0 || d1)
result += (LL)ctr[i] * ctr[j];
}
return result;
}
int main() {
int n;
std::string str1;
std::string str2;
std::cin>>n;
std::cin>>str1;
std::cin>>str2;
LL result = solution(n, str1, str2);
std::cout<<result<<std::endl;
return 0;
}
题意:给定整数 n n n, m m m, a 1 , a 2 , … , a m a_1, a_2, \ldots, a_m a1,a2,…,am,统计满足 1 ≤ x ≤ n 1 \leq x \leq n 1≤x≤n, ∀ i = 1 , 2 , … , m a i ∤ x \forall_{i = 1, 2, \ldots, m}{a_i \not | x} ∀i=1,2,…,mai∣x 的正整数 x x x 个数。数据范围 1 ≤ n , a i ≤ 1 0 9 1 \leq n, a_i \leq 10^9 1≤n,ai≤109, 0 ≤ m ≤ 10 0 \leq m \leq 10 0≤m≤10
思路:
∑ x = 1 n ∏ i = 1 m [ a i ∤ x ] = ∑ x = 1 n ∏ i = 1 m ( 1 − [ a i ∣ x ] ) = ∑ x = 1 n ∑ T ⊆ S ∏ i ∈ T ( − [ a i ∣ x ] ) = ∑ x = 1 n ∑ T ⊆ S ( − 1 ) ∣ T ∣ [ l c m i ∈ T ( a i ) ∣ x ] = ∑ T ⊆ S ( − 1 ) ∣ T ∣ ∑ x = 1 n [ l c m i ∈ T ( a i ) ∣ x ] = ∑ T ⊆ S ( − 1 ) ∣ T ∣ ⌊ n l c m i ∈ T ( a i ) ⌋ \sum_{x = 1}^{n}{\prod_{i = 1}^{m}{[a_i \not | x]}} \\ = \sum_{x = 1}^{n}{\prod_{i = 1}^{m}{\left(1 - [a_i | x ]\right)}} \\ = \sum_{x = 1}^{n}{\sum_{T \subseteq S}{\prod_{i \in T}{\left(- [a_i | x ]\right)}}} \\ = \sum_{x = 1}^{n}{\sum_{T \subseteq S}{(-1)^{|T|} [\mathrm{lcm}_{i \in T}(a_i) | x]}} \\ = \sum_{T \subseteq S}{(-1)^{|T|} \sum_{x = 1}^{n}{[\mathrm{lcm}_{i \in T}(a_i) | x]}} \\ = \sum_{T \subseteq S}{(-1)^{|T|} \left\lfloor \frac{n}{\mathrm{lcm}_{i \in T}(a_i)} \right\rfloor} x=1∑ni=1∏m[ai∣x]=x=1∑ni=1∏m(1−[ai∣x])=x=1∑nT⊆S∑i∈T∏(−[ai∣x])=x=1∑nT⊆S∑(−1)∣T∣[lcmi∈T(ai)∣x]=T⊆S∑(−1)∣T∣x=1∑n[lcmi∈T(ai)∣x]=T⊆S∑(−1)∣T∣⌊lcmi∈T(ai)n⌋
其中 S = { 1 , 2 , … , m } S = \{1, 2, \ldots, m\} S={1,2,…,m}, l c m \mathrm{lcm} lcm 表示一组正整数的最小公倍数
代码:C++
int solution(int n, int m, std::vector<int>& vec){
typedef long long LL;
int result = 0;
for(int i = 0; i < (1 << m); ++i) {
int sgn = 1;
LL lcm = 1;
for(int j = 0; lcm <= n && j < m; ++j) {
if((~i >> j) & 1)
continue;
sgn = -sgn;
lcm = lcm / std::__gcd(lcm, (LL)vec[j]) * vec[j];
}
if(lcm <= n)
result += sgn * (n / lcm);
}
return result;
}
别看了哪有下期啊。