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 ...
随机推荐
- 浅谈Nginx性能调优
点击上方"开源Linux",选择"设为星标" 回复"学习"获取独家整理的学习资料! Linux系统参数优化 下文中提到的一些配置,需要较新的 ...
- 等了整整12年!Linux QQ昨天终于更新了!
一个执着于技术的公众号 前言 2020年4月1日,腾讯QQ Linux版迎来最新版发布,详细版本号为v2.0.0 Beta2.上一个版本v2.3.2发布于2019年10月24日,时隔160天又迎来了更 ...
- 利用expect批量修改Linux服务器密码
一个执着于技术的公众号 背景 修改Linux系统密码,执行passwd即可更改密码.可如果有成千上百台服务器呢,通过ssh的方式逐一进行修改,对我们来说,工作量是非常大,且效率非常低下.因此采用批量修 ...
- HMS Core分析服务助您掌握用户分层密码,实现整体收益提升
随着市场愈发成熟,开发者从平衡收益和风险的角度开始逐步探索混合变现的优势,内购+广告就是目前市场上混合变现的主要方式之一. 对于混合变现模式,您是否有这样的困惑: 如何判断哪些用户更愿意看广告.哪些用 ...
- Vulnhub-DC-4靶机实战
前言 靶机下载地址:https://www.vulnhub.com/entry/dc-4,313/ KALI地址:192.168.75.108 靶机地址:192.168.75.207 一.信息发现 1 ...
- Windows IDEA Community 报错
运行时报错 "CreateProcess error=206,文件名或扩展名太长" 解决方法:https://plugins.gradle.org/plugin/ua.eshepe ...
- Kubernetes API 基础
APIServer 在kubernetes架构概念层面上,Kubernetes由一些具有不同角色的服务节点组成.而master的控制平面由 Apiserver Controller-manager 和 ...
- vue设计模式
vm 的设计模式. mvvm 是 model-view-viewModel 的简写. model 是数据模块,view 是渲染视图,viewModel 是沟通视图和数据模块的桥梁. vue 中使用了哪 ...
- Stream.toList()和Collectors.toList()的性能比较
昨天给大家介绍了Java 16中的Stream增强,可以直接通过toList()来转换成List. 主要涉及下面这几种转换方式: list.stream().toList(); list.stream ...
- 开发工具-在线计算MD5
更新记录: 2022年6月8日 更新标题. 2022年6月1日 开始. 都记在这以后就不用到处找了. 在线计算MD5 https://www.sojson.com/md5/ http://www.ip ...