Codeforces Global Round 7
Posted heyuhhh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Global Round 7相关的知识,希望对你有一定的参考价值。
A. Bad Ugly Numbers
233333。
Code
/*
* Author: heyuhhh
* Created Time: 2020/3/19 22:36:37
*/
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
#include <set>
#include <map>
#include <queue>
#include <iomanip>
#include <assert.h>
#define MP make_pair
#define fi first
#define se second
#define pb push_back
#define sz(x) (int)(x).size()
#define all(x) (x).begin(), (x).end()
#define INF 0x3f3f3f3f
#define Local
#ifdef Local
#define dbg(args...) do { cout << #args << " -> "; err(args); } while (0)
void err() { std::cout << '
'; }
template<typename T, typename...Args>
void err(T a, Args...args) { std::cout << a << ' '; err(args...); }
template <template<typename...> class T, typename t, typename... A>
void err(const T <t> &arg, const A&... args) {
for (auto &v : arg) std::cout << v << ' '; err(args...); }
#else
#define dbg(...)
#endif
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
//head
const int N = 1e5 + 5;
void run() {
int n; cin >> n;
if(n == 1) cout << -1 << '
';
else {
cout << 2;
for(int i = 1; i < n; i++) cout << 3;
cout << '
';
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cout << fixed << setprecision(20);
int T; cin >> T;
while(T--) run();
return 0;
}
B. Maximums
从前往后依次搞即可。
Code
/*
* Author: heyuhhh
* Created Time: 2020/3/19 22:39:26
*/
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
#include <set>
#include <map>
#include <queue>
#include <iomanip>
#include <assert.h>
#define MP make_pair
#define fi first
#define se second
#define pb push_back
#define sz(x) (int)(x).size()
#define all(x) (x).begin(), (x).end()
#define INF 0x3f3f3f3f
#define Local
#ifdef Local
#define dbg(args...) do { cout << #args << " -> "; err(args); } while (0)
void err() { std::cout << '
'; }
template<typename T, typename...Args>
void err(T a, Args...args) { std::cout << a << ' '; err(args...); }
template <template<typename...> class T, typename t, typename... A>
void err(const T <t> &arg, const A&... args) {
for (auto &v : arg) std::cout << v << ' '; err(args...); }
#else
#define dbg(...)
#endif
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
//head
const int N = 2e5 + 5;
int n;
ll a[N], b[N];
void run() {
ll Max = 0;
cin >> n;
for(int i = 1; i <= n; i++) cin >> b[i];
for(int i = 1; i <= n; i++) {
a[i] = b[i] + Max;
Max = max(Max, a[i]);
cout << a[i] << "
"[i == n];
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cout << fixed << setprecision(20);
run();
return 0;
}
C. Permutation Partitions
乘法原理运用。
Code
/*
* Author: heyuhhh
* Created Time: 2020/3/19 22:44:51
*/
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
#include <set>
#include <map>
#include <queue>
#include <iomanip>
#include <assert.h>
#define MP make_pair
#define fi first
#define se second
#define pb push_back
#define sz(x) (int)(x).size()
#define all(x) (x).begin(), (x).end()
#define INF 0x3f3f3f3f
#define Local
#ifdef Local
#define dbg(args...) do { cout << #args << " -> "; err(args); } while (0)
void err() { std::cout << '
'; }
template<typename T, typename...Args>
void err(T a, Args...args) { std::cout << a << ' '; err(args...); }
template <template<typename...> class T, typename t, typename... A>
void err(const T <t> &arg, const A&... args) {
for (auto &v : arg) std::cout << v << ' '; err(args...); }
#else
#define dbg(...)
#endif
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
//head
const int N = 2e5 + 5, MOD = 998244353;
int n, k;
pii a[N];
void run() {
cin >> n >> k;
for(int i = 1; i <= n; i++) cin >> a[i].fi, a[i].se = i;
sort(a + 1, a + n + 1);
ll ans = 0;
vector <int> pos;
for(int i = n - k + 1; i <= n; i++) ans += a[i].fi, pos.push_back(a[i].se);
sort(all(pos));
int ans2 = 1;
for(int i = 1; i < sz(pos); i++) {
ans2 = 1ll * ans2 * (pos[i] - pos[i - 1]) % MOD;
}
cout << ans << ' ' << ans2 << '
';
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cout << fixed << setprecision(20);
run();
return 0;
}
D2. Prefix-Suffix Palindrome (Hard version)
题意:
给出一个字符串(s)。
现在要找到一个最长的串(t),满足:
- (t)为一个回文串;
- (t=pre_s+suf_s),即是(s)串不重叠的前缀和后缀的拼接。
思路:
可以注意到若(s)串首尾字符相同,那么我们可以直接去除不影响答案。
简要证明:
- 如果最后会去除一段前缀和一段后缀,那么我们一开始去掉不会影响答案,这种情况不用考虑。
- 此时我们只会去除一段前缀/后缀。我们假设首位都去除了(x)个字符,现在(s')串首尾不相等,即我们此时不可能从(s')中选取前缀/后缀来形成回文串。不妨我们现在找到一个长度最大的前缀/后缀,其长度为(len),那么答案为(len+x);若不去除首尾(x)个字符,最大长度也为(len+x)。
那么直接贪心去掉前后相等的字符即可。
现在我们只需要找到长度最大的前缀/后缀为回文串就行。
可以马拉车或者回文自动机来搞,时间复杂度(O(n))。
马拉车代码如下:
Code
/*
* Author: heyuhhh
* Created Time: 2020/3/19 23:11:34
*/
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <cmath>
#include <set>
#include <map>
#include <queue>
#include <iomanip>
#include <assert.h>
#define MP make_pair
#define fi first
#define se second
#define pb push_back
#define sz(x) (int)(x).size()
#define all(x) (x).begin(), (x).end()
#define INF 0x3f3f3f3f
//#define Local
#ifdef Local
#define dbg(args...) do { cout << #args << " -> "; err(args); } while (0)
void err() { std::cout << '
'; }
template<typename T, typename...Args>
void err(T a, Args...args) { std::cout << a << ' '; err(args...); }
template <template<typename...> class T, typename t, typename... A>
void err(const T <t> &arg, const A&... args) {
for (auto &v : arg) std::cout << v << ' '; err(args...); }
#else
#define dbg(...)
#endif
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
//head
const int N = 1e6 + 5;
char s[N], t[N];
struct Manacher{
char ch[N << 1];
int p[N << 1];
void work(char *s) {
int l = 0;
ch[l++] = '&'; ch[l++] = '#';
for(int i = 0; s[i]; i++) {
ch[l++] = s[i];
ch[l++] = '#';
}
ch[l] = '