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. string、const char*、 char* 、char[]相互转换(待整理)

    string.const char*. char* .char[]相互转换(全) https://blog.csdn.net/rongrongyaofeiqi/article/details/5244 ...

  2. python中各种数据类型

    数字类型 整型int 作用:年纪,等级,身份证号,qq号等与整型数字有关 定义: age=10 #本质age=int(10) 浮点型float 作用:薪资,身高,体重等与浮点数相关 salary=3. ...

  3. [vue]vue-book

    我们打算要做这几个模块 首页 列表 收藏 添加 home.vue --> list.vue -->app.vue --> main.js 安装环境 npm i vue-cli -g ...

  4. Centos expect spawn、linux expect 用法

    使用expect实现自动登录的脚本,网上有很多,可是都没有一个明白的说明,初学者一般都是照抄.收藏.可是为什么要这么写却不知其然.本文用一个最短的例子说明脚本的原理.  脚本代码如下:  ###### ...

  5. NGINX负载均衡缓存配置

    环境:VMware-Workstation-12-Pro,Windows-10,CentOS-7.5,Xshell5 1 概述 如果我们的架构是前端负载均衡后端WEB集群时,可以开启nginx的缓存功 ...

  6. Sublime text 3搭建Python-Anaconda开发环境

    网络上的教程各种各样,大同小异.自己安装时还是出了些问题,因此总结一篇博文. Sublime Text 是一款轻量级跨平台的文本编辑器,可通过包(Package)扩充自身功能. 有很多搭建python ...

  7. 001-Two Sum

    Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...

  8. 读书--编写高质量代码 改善C#程序的157个建议

    最近读了陆敏技写的一本书<<编写高质量代码  改善C#程序的157个建议>>书写的很好.我还看了他的博客http://www.cnblogs.com/luminji . 前面部 ...

  9. mysql事务详解

    事务的四大特性ACID如下:       原子性:事务中的所有操作,要么全部完成,要么不做任何操作,不能只做部分操作.如果在执行的过程中发了错误,要回滚(Rollback)到事务开始前的状态,就像这个 ...

  10. PKU2418_树种统计(map应用||Trie树)

    Description Hardwoods are the botanical group of trees that have broad leaves, produce a fruit or nu ...