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 ...
随机推荐
- 基本命令学习 -(3)Linux压缩和解压缩命令汇总
关注「开源Linux」,选择"设为星标" 回复「学习」,有我为您特别筛选的学习资料~ 前言 Linux下的压缩和解压缩工具比较多,有时经常记不住,这里给大家汇总一下,方便大家查阅. ...
- docker-compose 启动 rabbitmq
说明 前提条件 ubuntu-20.04-server docker & docker-compose 安装参考 安装 准备 rabbitmq.conf 新建 rabbitmq.conf 文件 ...
- 第一篇:实时网络日志分析器和交互式查看器--GoAccess安装
介绍 GoAccess是一个开源的实时网络日志分析器和交互式查看器,可以在* nix 系统或通过浏览器的终端中运行. 它为需要动态可视化服务器报告的系统管理员提供快速且有价值的HTTP统计信息. 特征 ...
- 用python实现自动化登录禅道系统 设置定时器自动执行脚本
由于各种原因,我想试下用python实现自动登录禅道系统,并且每天定时执行.(本人第一次接触自动化,在大佬眼中门槛都没摸到的类型) 首先缕清思路: 1.实现自动登录禅道系统,用selenium实现2. ...
- unity---角色控制器控制角色移动
获取对象 public CharacterController cc; cc=gameObject.GetComponent<CharacterController>(); if(Inpu ...
- Flink使用Pod Template将状态快照(Checkpoint、Savepoint)存储在NFS
背景 Flink 版本 1.13.3,使用 native k8s 部署模式,原采用 HDFS 作为状态快照(Checkpoint.Savepoint)的存储地址,但是由于仅使用了其 HDFS 作为状态 ...
- 专家PID控制仿真学习
目录 专家控制 专家系统 专家控制 学习笔记,用于记录学习 资料:<智能控制>(第四版)--刘金琨 专家系统 一.专家系统的定义 专家系统是一类包含知识和推理的智能计算机程序,其内部包含某 ...
- ASP已老,尚能饭否?
我对ASP的感情,跟大海一样深.我用它实现了第一个动态网页,也用它做了毕业设计,毕业设计的名字是<毕业设计管理系统>(是不是有点绕).在 PHP 和 ASP.NET.Java 高歌猛进的今 ...
- Python爬虫-正则
介绍: 是 一门全新的语言,一种使用表达式的方式对字符串进行匹配的语法规则 我们抓取到的网页源代码本质上就是一个超长的字符串,想从里面提取内容,用正则再适合不过 优点:速度快.效率高.准确性高 缺点: ...
- 用Typescript 的方式封装Vue3的表单绑定,支持防抖等功能。
Vue3 的父子组件传值.绑定表单数据.UI库的二次封装.防抖等,想来大家都很熟悉了,本篇介绍一种使用 Typescript 的方式进行统一的封装的方法. 基础使用方法 Vue3对于表单的绑定提供了一 ...