After I read the solution to the problem, I found that my solution was simply unsightly.

Solved 4 out of 7, and my solution to C was hacked, because of my incorrect order when i meet in the middle.

I wasted about 20 mins on problem A due to the incomprehensible description, at last i just find a harder solution and passed the pretests.

Neither have i read the questions calmly nor assigned time, that's why i got an unacceptable rank.

1073A - Diverse Substring

1073A - Diverse Substring

Notice that the string of two distinct letter is already diverse. That implies that the answer is "NO" if and only if all the letters in the string are the same. Otherwise you can check all pairs of adjacent letters in \(O(n)\)

Overall complexity: \(O(n)\)

n = int(input())
s = input()
for i in range(n - 1):
if (s[i] != s[i + 1]):
print("YES")
print(s[i], s[i + 1], sep="")
exit(0)
print("NO")

1073B - Vasya and Books

1073B - Vasya and Books

Let's maintain the pointer \(pos\) to the topmost non-deleted book and whether each book whether is removed from the stack or not. Initially, all books are in a stack, and \(pos\) is 0 (if we store the array 0-indexed). We will process the array \(B\) in the order \(b_1,b_2, \cdots, b_n\). If the current book \(b_i\) is removed from the stack, then the answer for it is zero. Otherwise, we will increment the pointer \(pos\) until the equality \(a_{pos} = b_i\) is satisfied, while marking all the intermediate books in the array \(u\). After that, the answer for the book

\(b_i\) will be the number of marked books in the \(u\) array (including itself).

Since the pointer \(pos\) shifts \(n\) times at total, we get a solution with an \(O(n)\) complexity.

#include <bits/stdc++.h>

using namespace std;

const int N = int(2e5) + 9;

int n, a[N], b[N];
bool u[N]; int main() {
scanf("%d", &n);
for(int i = 0; i < n; ++i) {
scanf("%d", a + i);
}
for(int i = 0; i < n; ++i){
scanf("%d", b + i);
} int pos = 0;
for(int i = 0; i < n; ++i){
int x = b[i];
if(u[x]){
printf("0 ");
continue;
} int cnt = 0;
while(true){
++cnt;
u[a[pos]] = true;
if(a[pos] == x) break;
++pos;
} ++pos;
printf("%d ", cnt);
} puts("");
return 0;
}

1073C - Vasya and Robot

1073C - Vasya and Robot

Denote \(d = |x| + |y|\). If \(d>n\), then the answer is -1, since the robot will not have the time to reach \((x, y)\) cell in \(n\) steps. Also, if \(d\) and \(n\) have different parity, then the answer is also -1, as in one move the robot changes the parity of the sum of its coordinates.

In all other cases, the answer exists. Let's use binary search to solve this problem. Consider all segments of length \(len\). For a fixed length of the segment \(len\), let's iterate over the position of the beginning of the segment \(l\). At the same time, we will maintain the cell that the robot will stop at if it execute all commands, except commands with indices \(l,l+1 \cdots,l+len−1\). We denote this position as \((x_0,y_0)\). We also calculate the distances from the cell \((x_0,y_0)\) to the cell \((x,y)\) — the value \(d_0=|x−x_0|+|y−y_0|\). If there is at least one position of the beginning of the segment for which \(d_0 \le len\) then we can change the segment of length \(len\) so that the robot comes to the \((x,y)\) cell, otherwise it can't.

const int maxn = 2e5 + 100;
int n, nx, ny, ans;
char str[maxn];
int lef[maxn], rgt[maxn], up[maxn], down[maxn]; int main() {
while (~scanf("%d %s %d %d", &n, str + 1, &nx, &ny)) {
seta(up, 0), seta(down, 0), seta(rgt, 0), seta(lef, 0);
if (abs(nx) + abs(ny) > n || ((abs(nx) + abs(ny)) & 1) != (n & 1)) return printf("-1\n"), 0;
for (int i = 1; i <= n; ++ i) {
if (str[i] == 'R') rgt[i] ++;
if (str[i] == 'U') up[i] ++;
if (str[i] == 'D') down[i] ++;
if (str[i] == 'L') lef[i] ++;
}
for (int i = 1; i <= n; ++ i) {
up[i] += up[i - 1];
rgt[i] += rgt[i - 1];
down[i] += down[i - 1];
lef[i] += lef[i - 1];
}
ans = 0x7fffffff;
if (nx < 0) {
for (int i = 1; i <= n; ++ i)
swap(lef[i], rgt[i]);
nx = -nx;
}
if (ny < 0) {
for (int i = 1; i <= n; ++ i) {
swap(up[i], down[i]);
}
ny = -ny;
}
if (rgt[n] - lef[n] == nx && up[n] - down[n] == ny)
return printf("0\n"), 0;
if (nx >= 0 && ny >= 0) {
for (int i = 1; i <= n; ++ i) {
int x1 = rgt[i - 1] - lef[i - 1];
int y1 = up[i - 1] - down[i - 1];
int l = i, r = n + 1;
while (l < r) {
int mid = (l + r) >> 1;
int x2 = rgt[n] - rgt[mid] - (lef[n] - lef[mid]);
int y2 = up[n] - up[mid] - (down[n] - down[mid]);
if ((mid - i + 1) >= (abs(nx - (x1 + x2)) + abs(ny - (y1 + y2)))) ans = min(ans, (r = mid) - i + 1); else l = mid + 1;
}
}
}
cout << ans << endl;
}
}

Educational Codeforces Round 53 Editorial的更多相关文章

  1. Educational Codeforces Round 53 E. Segment Sum(数位DP)

    Educational Codeforces Round 53 E. Segment Sum 题意: 问[L,R]区间内有多少个数满足:其由不超过k种数字构成. 思路: 数位DP裸题,也比较好想.由于 ...

  2. Educational Codeforces Round 53 (Rated for Div. 2) (前五题题解)

    这场比赛没有打,后来补了一下,第五题数位dp好不容易才搞出来(我太菜啊). 比赛传送门:http://codeforces.com/contest/1073 A. Diverse Substring ...

  3. Educational Codeforces Round 53 (Rated for Div. 2) E. Segment Sum (数位dp求和)

    题目链接:https://codeforces.com/contest/1073/problem/E 题目大意:给定一个区间[l,r],需要求出区间[l,r]内符合数位上的不同数字个数不超过k个的数的 ...

  4. Educational Codeforces Round 53 (Rated for Div. 2)

    http://codeforces.com/contest/1073 A. Diverse Substring #include <bits/stdc++.h> using namespa ...

  5. [codeforces][Educational Codeforces Round 53 (Rated for Div. 2)D. Berland Fair]

    http://codeforces.com/problemset/problem/1073/D 题目大意:有n个物品(n<2e5)围成一个圈,你有t(t<1e18)元,每次经过物品i,如果 ...

  6. Educational Codeforces Round 53 (Rated for Div. 2) E. Segment Sum

    https://codeforces.com/contest/1073/problem/E 题意 求出l到r之间的符合要求的数之和,结果取模998244353 要求:组成数的数位所用的数字种类不超过k ...

  7. Educational Codeforces Round 53 (Rated for Div. 2) C. Vasya and Robot 【二分 + 尺取】

    任意门:http://codeforces.com/contest/1073/problem/C C. Vasya and Robot time limit per test 1 second mem ...

  8. Educational Codeforces Round 68 Editorial

    题目链接:http://codeforces.com/contest/1194                                            A.Remove a Progre ...

  9. Educational Codeforces Round 53 (Rated for Div. 2)G. Yet Another LCP Problem

    题意:给串s,每次询问k个数a,l个数b,问a和b作为后缀的lcp的综合 题解:和bzoj3879类似,反向sam日神仙...lcp就是fail树上的lca.把点抠出来建虚树,然后在上面dp即可.(感 ...

随机推荐

  1. phpStudy安装

    以下一直默认安装 访问地址:http://127.0.0.1/vue/2.html

  2. 十天精通CSS3(5)

    background-origin 设置元素背景图片的原始起始位置. 语法: background-origin : border-box | padding-box | content-box; 参 ...

  3. java读取resource目录下的配置文件

    java读取resource目录下的配置文件 1:配置resource目录 下的文件 host: 127.0.0.1 port: 9300 2:读取    / 代表resource目录 InputSt ...

  4. Spark2.x学习笔记:Spark SQL的SQL

    Spark SQL所支持的SQL语法 select [distinct] [column names]|[wildcard] from tableName [join clause tableName ...

  5. XenServer:使用XenCenter开设VPS(多图完整版)

    打铁要趁热,咱们接着来玩XenServer.昨天赵容用机房提供的KVM给服务器装了XenServer,今天我们来玩更有意思的:开小鸡.装好XenServer之后,访问我们的服务器IP,就可以看到Xen ...

  6. GNU Make中文手册(一)

    GNU Make 翻译:loverszhaokai 最新版文档请参考github: https://github.com/loverszhaokai/GNUMakeManual_CN 欢迎大家提出修改 ...

  7. 【剑指Offer学习】【面试题3 :二维数组中的查找】

    package 二维数组查找; public class Test03 { /** * 在一个二维数组中,每一行都按 package 二维数组查找; public class Test03 { /** ...

  8. linux lvs

  9. JSON草稿

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  10. python之路----模块调用

    如何使用模块? 1 import 示例文件:自定义模块my_module.py,文件名my_module.py,模块名my_module #my_module.py print('from the m ...