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 ...
随机推荐
- 4 个超实用的 Linux 监控工具
公众号关注 「开源Linux」 回复「学习」,有我为您特别筛选的学习资料~ 下面是 Linux 下 4 个日常使用率非常高的监控工具,可以帮助我们准确快速的诊断系统问题. 1. iotop 如果你想知 ...
- Nature | DNA甲基化测序助力人多能干细胞向胚胎全能8细胞的人工诱导|易基因项目文章
北京时间2022年3月22日凌晨,<Nature>期刊在线刊登了由中国科学院广州生物医学与健康研究所等单位牵头,深圳市易基因科技有限公司.中国科学技术大学等单位参与,应用人多能干细胞向胚胎 ...
- redis & redis sentinel
Redis 命令参考 Redis Sentinel Cheat Sheet Redis 哨兵节点之间相互自动发现机制(自动重写哨兵节点的配置文件) Redis哨兵模式(sentinel)学习总结及部署 ...
- 归约与分组 - 读《Java 8实战》
区分Collection,Collector和collect 代码中用到的类与方法用红框标出,可从git库中查看 收集器用作高级归约 // 按货币对交易进行分组 Map<Currency, Li ...
- Django-Model随笔
Django数据库之Model 常用命令 生成迁移文件 python manage.py makemigrations 实行数据库迁移 python manage.py migrate 数据库表结构反 ...
- 计算机网络 - HTTP和HTTPS的区别
计算机网络 - HTTP和HTTPS的区别 http所有传输的内容都是明文,并且客户端和服务器端都无法验证对方的身份. https具有安全性的ssl加密传输协议,加密采用对称加密. https协议需要 ...
- django框架9
内容概要 用户名动态校验 删除二次确认 sweetalert前端插件 django自带的序列化组件 批量数据操作 分页器推导流程 自定义分页器封装代码 自定义分页器使用方法 校验性组件之forms组件 ...
- Wireshark学习笔记(一)常用功能案例和技巧
@ 目录 常用功能 1.统计->捕获属性 2.统计->协议分级 3.过滤包Apply as filter E1:过滤出特定序号的包 E2:过滤出某IP地址或端口 E3:导出php文件 E4 ...
- Linux(Centos7)静默安装Oracle19C
Oracle数据库服务器一般都是Linux,Linux服务器一般都是在非图形界面的操作,本文章手把手教你如何在非图形界面安装Oracle19C. ORACLE 19C 的安装包自行在官网下载,下载免费 ...
- Java开发学习(三)----Bean基础配置及其作用范围
一.bean基础配置 对于bean的基础配置如下 <bean id="" class=""/> 其中,bean标签的功能.使用方式以及id和clas ...