Educational Codeforces Round 132 (C,D) 题解 cf#1709
昨晚打了这把EDU,赛后看了dalao们的C题代码豁然开朗恍然大悟
实在是太巧妙了
这场来说,D题的通过率比C题高太多了(估计很多人都在C题卡了然后没做D
先放题目链接
题目链接
C - Recover an RBS https://codeforces.ml/contest/1709/problem/C
D - Rorororobot https://codeforces.ml/contest/1709/problem/D
先讲C题吧
C题题意
给你一个括号序,里面部分括号是被问号"?"所取代,问号可以变成左括号或者右括号。
问 使得括号序匹配的做法是否唯一。
题目保证至少存在一种匹配方法。
C题思路
注意题目给到了,保证至少存在一种匹配方法,现在我们把问题转变成了匹配方法是否唯一。
于是我们需要考虑如何找到一种可行的匹配方法。
我们知道 括号序匹配是必须保证所有前缀左括号的个数要大于等于右括号的个数。
并且我们需要拿来取代问号的左括号数量和右括号数量我们也可以直接求得。
(就等于 长度/ 2 - 已知括号数)
由此我们可以发现,如果所有括号先用左括号代替,左括号没了在用右括号代替,这一定是最优的情况。
为什么呢?我们来模拟一下括号序是否匹配的判断,我想不懂的人应该就懂了。
(懂的跳过
我们用now来记录现在前缀中左括号比右括号多了一个
于是当出现左括号时,now++,出现右括号时,now--。
仅当now 小于 0 的时候,我们可以判断该括号序不匹配。
于是,如果我们把左括号尽可能早出现,右括号尽可能晚出现,那是不是这种方案一定是最优方 案。
现在我们知道了最优方案,是左括号先用完,再用右括号,我们暂且称之为Top1.
但是题目问的是存不存在多种方案,这是个值得深思的问题。
显然,我们已经知道了左括号越早出现,那么该方案一定不劣,于是,我们试着把第一个右括号早出现一位(即第一次右括号和最后一个左括号调换位置),这种方案一定是仅次于Top1的方案,暂且称为Top2好了,于是题目就变成了Top2方案是否能使得括号序匹配.
到此为止,题目已经可以做啦
下面展示AC代码
AC代码
#include<iostream>
#include<string>
#define io ios::sync_with_stdio(false);
#define off cin.tie(0), cout.tie(0);
using namespace std;
int t = 1, n, m;
string str;
void run() {
int flag = 1;
cin >> str;
int len = str.length();
int cnt = len / 2;
for (int i = 0; i < len; i++)
if (str[i] == '(')
cnt--;
if (cnt == 0) flag = 0;
int now = 0;
for (int i = 0; i < len; i++) {
if (str[i] == '?' && (cnt > 1 || cnt == 0)) {
now++;
cnt--;
} else if (str[i] == '?' && cnt == 1) {
now--;
cnt--;
} else if (str[i] == '?') now--;
if (str[i] == '(') now++;
else if (str[i] == ')') now--;
if (now < 0) flag = 0;
}
if (flag) cout << "NO\n";
else cout << "YES\n";
}
int main () {
io off
cin >> t;
while (t--) {
run();
}
return 0;
}
完结 ★,°:.☆( ̄▽ ̄)/$:.°★ 。
开个玩笑,还有D题。
D题当对于C题来说简单太多了 不知道为什么放在D题位置
可能是因为需要用到数据结构维护,所以就放在了D题吧
D题题意
给一个n行m列的矩阵,第i列的下面a_i个位置被锁住了,无法进入
q次询问,给出起点和终点坐标,和每次连续走几步(连续走的k步必须是直线)
问 是否能在不出界且不经过封锁区域的情况下到达指定位置。
需要注意的是,矩阵的下标是从左下开始的
(n, 1).....(n, m)
. .
. .
. .
. .
(1, 1).....(1, m)
这样应该可以看懂吧!
D题思路
~~很显然~~这是一道维护区间最大值的问题,我想到的是利用线段树维护区间最大值。
找到了两列之间的a_i 的最大值之后,判断他们的横纵坐标分别的差值能不能整除给定的步数。
如果中间有比它们都高的列,那么就要越过中间最高列,需要判断能不能在不出界的情况下越过它。
如果中间最高的列比他们其中一个要低的话,那么只要他们横纵坐标满足条件就一定可以。
AC代码
#include<bits/stdc++.h>
#define io ios::sync_with_stdio(false);
#define off cin.tie(0), cout.tie(0);
#define int long long
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int mod = 1e9 + 7;
const double eps = 1e-7;
int n, m, q, maxn[200000 * 20];
int s[200010];
struct s_tree { // 线段树
ll ql, qr, n, p, v;
inline void init(int n) {
for (int i = 1; i <= 200010;i++)
maxn[i] = 0x3f3f3f3f;
memset(s, 0, sizeof(s));
this->n = n;
}
inline ll Query(int o, int L, int R) {
int ans = -0x3f3f3f3f;
int mid = (L + R) >> 1;
if (ql <= L && qr >= R) return maxn[o];
if (mid >= ql) ans = max(ans, Query(o << 1, L, mid));
if (mid < qr) ans = max(ans, Query((o << 1) + 1, mid + 1, R));
return ans;
}
inline ll query(int l, int r) { // 查询
ql = l;qr = r;
return Query(1, 1, n);
}
inline void build(int Case, int L, int R) { // 建树
int mid = (L + R) >> 1;
if (L == R) maxn[Case] = s[L];
else {
build((Case << 1), L, mid); build((Case << 1) + 1, mid + 1, R);
maxn[Case] = max(maxn[Case << 1], maxn[(Case << 1) + 1]);
}
}
} tree;
void run() {
tree.init(n);
for (int i = 1; i <= n; i++) {
cin >> s[i];
}
tree.build(1, 1, n);
cin >> q;
while (q--) {
int x0 = 0, y0 = 0, x2 = 0, y2 = 0, k = 0, flag = 1, maxh = -1;
cin >> x0 >> y0 >> x2 >> y2 >> k;
if (abs(y2 - y0) % k != 0 || abs(x2 - x0) % k != 0) { // 横纵坐标不符合
cout << "No\n";
flag = 0;
}
if (y0 > y2) {
int p = y0;
y0 = y2;
y2 = p;
}
maxh = tree.query(y0, y2); // 找到中间最大值
if (x0 > maxh || x2 > maxh) {
if (flag)
cout << "Yes\n";
flag = 0;
}
int goal = maxh - x0 + 1; // 差值
int res = x0 + (goal / k + (goal % k != 0)) * k; // 越过最高列的目标高度
if (flag) {
if (res <= m) {
cout << "Yes\n";
}
else cout << "No\n";
}
}
}
signed main() {
io off
cin >> m >> n;
run();
return 0;
}
Educational Codeforces Round 132 (C,D) 题解 cf#1709的更多相关文章
- Educational Codeforces Round 132 (Rated for Div. 2)
Educational Codeforces Round 132 (Rated for Div. 2) A. Three Doors 简述 题意: 有三扇门(1~3), 其中两扇门后面有对应标号门的钥 ...
- Educational Codeforces Round 95(A-C题解)
A. Buying Torches 题目:http://codeforces.com/contest/1418/problem/A 题解:计算一个公式:1+n*(x-1)=(y+1)*k,求满足该条件 ...
- Educational Codeforces Round 37-E.Connected Components?题解
一.题目 二.题目链接 http://codeforces.com/contest/920/problem/E 三.题意 给定一个$N$和$M$.$N$表示有$N$个点,$M$表示,在一个$N$个点组 ...
- Educational Codeforces Round 80 A-E简要题解
contest链接:https://codeforces.com/contest/1288 A. Deadline 题意:略 思路:根据题意 x + [d/(x+1)] 需要找到一个x使得上式小于等于 ...
- Educational Codeforces Round 21 A-E题题解
A题 ............太水就不说了,贴下代码 #include<string> #include<iostream> #include<cstring& ...
- CF1132.Educational Codeforces Round 61(简单题解)
A .Regular Bracket Sequence 题意:给定“((” , “()” , “)(”, “))”四种,问是否可以组成合法括号匹配 思路:设四种是ABCD,B可以不用管,而C在A或 ...
- Educational Codeforces Round 65 (Rated for Div. 2)题解
Educational Codeforces Round 65 (Rated for Div. 2)题解 题目链接 A. Telephone Number 水题,代码如下: Code #include ...
- Educational Codeforces Round 63 (Rated for Div. 2) 题解
Educational Codeforces Round 63 (Rated for Div. 2)题解 题目链接 A. Reverse a Substring 给出一个字符串,现在可以对这个字符串进 ...
- Educational Codeforces Round 48 (Rated for Div. 2) CD题解
Educational Codeforces Round 48 (Rated for Div. 2) C. Vasya And The Mushrooms 题目链接:https://codeforce ...
随机推荐
- 团队Arpha1
队名:观光队 组长博客 作业博客 组员实践情况 王耀鑫 **过去两天完成了哪些任务 ** 文字/口头描述 完成服务器连接数据库部分代码 展示GitHub当日代码/文档签入记录 接下来的计划 与服务器连 ...
- k8s和Docker关系简单说明
关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ 这篇文章主要介绍了k8s和Docker关系简单说明,本文利用图文讲解的很透彻,有需要的同学可以 ...
- 干货 | 手把手教你搭建一套OpenStack云平台
1 前言 今天我们为一位朋友搭建一套OpenStack云平台. 我们使用Kolla部署stein版本的OpenStack云平台. kolla是用于自动化部署OpenStack的一个项目,它基于dock ...
- CSAPP 之 DataLab 详解
前言 本篇博客将会剖析 CSAPP - DataLab 各个习题的解题过程,加深对 int.unsigned.float 这几种数据类型的计算机表示方式的理解. DataLab 中包含下表所示的 12 ...
- python数据类型、用户交互和运算符
基本数据类型 1.字典dict(dictionary) 能够准确的记录储存的信息 """ 大括号里面 放多个元素 之间用逗号隔开 元素为K:V键表示储存 K相对于V一般表 ...
- 嵌入:CAN
说下我的学习过程.刚到公司的时候我根本不知道什么是CAN,甚至连以太网和串口通讯都不懂.领导把USBCAN分析仪拿给我,把铜线短接上,用软件在CAN1窗口点下发送,CAN2窗口马上接收到了发送出来的数 ...
- linux篇-xshell连接突然报Connection closed by foreign host.
1问题描述报错 Connection closed by foreign host. Disconnected from remote host(yaoGS) at 155513. 2登入虚拟机 在l ...
- 104_Power Query 数据库条件查询
博客:www.jiaopengzi.com 焦棚子的文章目录 请点击下载 1.应用场景 底层数据在数据库(sql server数据库,其他数据库同理,下文不再说明.)中,Excel中有查询的字段,需要 ...
- 缓存&PWA实践
缓存&PWA 实践 一.背景 从上一篇<前端动画实现与原理分析>,我们从 Performance 进行动画的性能分析,并根据 Performance 分析来优化动画.但,前端不仅仅 ...
- 在 .NET 中使用 FixedTimeEquals 应对计时攻击
计时攻击 在计算机安全中,计时攻击(Timing attack)是旁道攻击 (Side-channel attack) 的一种,而旁道攻击是根据计算机处理过程发出的信息进行分析,包括耗时,声音,功耗等 ...