Codeforces Round #506 (Div. 3)ABCDEF

Posted juruohx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #506 (Div. 3)ABCDEF相关的知识,希望对你有一定的参考价值。

并没有参加比赛,全是赛后AC

A题

  题意:现有一个长度为n的字符串s。你需要构建一个长度最小的字符串t,使得t中恰好包含k个s(允许部分重叠),输出这个字符串

 

  

 1 /*
 2     我们可以非常容易的发现我们构造出来的字符串t有着鲜明的特征。即t中有大量重复的子串,可以证明的是t = S + (K-1)*A, A是S串中删去一段字符串(这段字符串满足既是S的前缀又是S的后缀)。
 3 */
 4 #include<cstdio>
 5 #include<iostream>
 6 
 7 using namespace std;
 8 
 9 const int maxn = 50 + 5;
10 
11 char a[maxn];
12 int n, k;
13 
14 int main(void) {
15     scanf("%d%d", &n, &k);
16     scanf("%s", a + 1);
17     string s1 = "", s2 = ""; int res = 0;
18     for (int i = 1, j = n; i < n; ++ i, -- j) {
19         s1 = s1 + a[i];
20         s2 = a[j] + s2;
21         if (s1 == s2) res = max(res, i);
22     }
23     int len = n - res; 
24 //    cout << len << endl;
25     string ans = "";
26     for (int i = n; i >= n - len + 1; -- i) ans = a[i] + ans;
27     for (int i = 1; i <= n; ++ i) printf("%c", a[i]);
28     for (int i = 1; i < k; ++ i) cout << ans; puts("");
29     return 0;
30 }

 

B题

  题意:给出一个长度为n的数组A,数组A中的元素a[i]满足(1<=a[i]<=10^9),且a[i]严格大于a[i-1](2<=i<=n)。现在要你找出一个数组B,满足数组B中所有元素在A中都是有序排列的,即B是A的非连续子序列,数组B中的元素要满足b[i]>=2*b[i-1],输出这个数组B的最大长度。

 1 /*
 2 一个类似导弹拦截的DP+决策单调性优化(这个优化由单调队列实现)
 3 */
 4 #include<cstdio>
 5 #include<algorithm>
 6 
 7 using namespace std;
 8 
 9 const int maxn = 2e5 + 5;
10 
11 int n, a[maxn], f[maxn], Stack[maxn], val[maxn];
12 
13 
14 int main(void) {
15     scanf("%d", &n);
16     for (int i = 1; i <= n; ++ i) scanf("%d", &a[i]);
17     int L = 1, R = 1;
18     Stack[1] = 1;
19     val[1] = 1;
20     int ans = 1;
21     // a值小f值大 和 a值大f值小 
22     for (int i = 2; i <= n; ++ i) {
23         while (L <= R && a[Stack[L]] * 2 < a[i]) ++ L;
24         if (L <= R) {
25             int cur = val[L] + 1;
26             ans = max(ans, cur);
27             while (L <= R && cur >= val[R]) -- R;
28             ++ R; Stack[R] = i; val[R] = cur;        
29         } else {
30             int cur = 1;
31             ++ R; Stack[R] = i; val[R] = cur;
32         }
33     }
34     printf("%d
", ans);
35     return 0;
36 }

 

C题:

  题意:给出n个区间(2<=n<=3e5),区间的左右边界均在[0,1e9]之间,现要你去掉一个区间,求出剩下n-1个区间的区间交,使得这个区间交的长度最大。输出这个长度

 

 1 /*
 2     我们维护两个东西,一个是区间并的前缀f[i],另一个是区间并的后缀g[i]。如果我们去掉i这个区间,答案就是f[i-1]这个区间和g[i+1]这个区间的区间并。
 3     
 4 */
 5 #include<bits/stdc++.h>
 6 
 7 using namespace std;
 8 
 9 const int maxn = 3e5 + 5;
10 
11 int n, l[maxn], r[maxn];
12 
13 struct node {
14     int l, r;
15 } f[maxn], g[maxn];
16 
17 pair<int, int> Make(int l0, int r0, int l1, int r1) {
18     if (l0 > l1) {
19         swap(l0, l1); swap(r0, r1);
20     }
21     // [l0, r0] [l1, r1]  l0 <= l1
22     if (r0 <= l1) return make_pair(-1, -1);
23     if (r0 >= r1) return make_pair(l1, r1);
24     return make_pair(l1, r0);
25 } // 输入两个区间,返回他们的并区间
26 
27 int Get_Ans(pair<int, int> tmp) {
28     return tmp.second - tmp.first;
29 } //得到区间tmp的长度。
30 
31 int main(void) {
32     scanf("%d", &n);
33     for (int i = 1; i <= n; ++ i) scanf("%d%d", &l[i], &r[i]);
34     
35     int L = l[1], R = r[1];
36     f[1].l = L; f[1].r = R;
37     for (int i = 2; i <= n; ++ i) {
38         pair<int, int> tmp = Make(L, R, l[i], r[i]);
39         L = f[i].l = tmp.first;    R = f[i].r = tmp.second;
40     }
41     
42     L = l[n]; R = r[n];
43     g[n].l = L; g[n].r = R;
44     for (int i = n - 1; i >= 1; -- i) {
45         pair<int, int> tmp = Make(L, R, l[i], r[i]);
46         L = g[i].l = tmp.first; R = g[i].r = tmp.second;
47     }
48     
49     int ans = max(Get_Ans(make_pair(g[2].l, g[2].r)), Get_Ans(make_pair(f[n - 1].l, f[n - 1].r)));
50     
51     for (int i = 2; i < n; ++ i) {
52         ans = max(ans, Get_Ans(Make(f[i - 1].l, f[i - 1].r, g[i + 1].l, g[i + 1].r)));
53     }
54     printf("%d
", ans);
55     return 0;
56 }

 

以上是关于Codeforces Round #506 (Div. 3)ABCDEF的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #506 (Div. 3)

Codeforces Round #506 (Div. 3) C. Maximal Intersection

Codeforces Round #506 (Div. 3) C. Maximal Intersection (枚举)

Codeforces Round #506 (Div. 3) D. Concatenated Multiples

Codeforces Round #506 (Div. 3) D-F

Codeforces Round #506 D. Concatenated Multiples题解