Educational Codeforces Round 105 (Rated for Div. 2) A-C题解
写在前边
A. ABC String
链接:A题链接
题目大意:
给定一个有\(A、B、C\)大写字母组成的字符串,然后让我们用\('('\)与\(')'\)来替换三个字母,同类的字母只能用一种类型的括号,问组成的括号序列是否是合法的括号序列。
思路:
发现一个性质,位于左边第一个的字母只能用'(',位于右边第一个的字母只能用')',因此左右两边不能是同一个字母,所以这就有两个字母所用的括号确定了,剩下那个只需要构造成数量较少的那个类型的括号就好了,然后字符串构造出来之后就用栈检查一下。
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <map>
#include <cstring>
#include <stack>
//#pragma GCC optimize(2)
//#pragma GCC optimize(3,"Ofast","inline")
using namespace std;
#define Inf 0x3f3f3f3f
#define PII pair<int, int>
#define P2LL pair<long long, long long>
#define endl '\n'
typedef long long LL;
typedef unsigned long long ULL;
typedef vector<long long> VLL;
typedef vector<int> VI;
const int Mod = 10000007;
void solve() {
string s;
cin >> s;
int n = s.length();
if (s[0] == s[n - 1]) {
puts("NO");
return;
}
map<char, int> mp;
for (int i = 0; i < n; i++) mp[s[i]]++;
string ss = "";
for (int i = 0; i < n; i++) {
if (s[i] == s[0]) ss += '(';
else if (s[i] == s[n - 1]) ss += ')';
else ss += (mp[s[0]] > mp[s[n - 1]] ? ')' : '(');
}
stack<int> st;
for (int i = 0; i < ss.size(); i++) {
if (ss[i] == '(') st.push(ss[i]);
else if (ss[i] == ')') {
if (st.empty()) {
puts("NO");
return;
}
if (st.size()) st.pop();
}
}
if (st.empty()) puts("YES");
else puts("NO");
}
int main()
{
//ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
int t;
scanf("%d", &t);
while (t--) {
solve();
}
return 0;
}
B. Berland Crossword
链接:B题链接
题目大意:
给定\(u,r,d,l\)四个量,表示在一个\(n*n\)的网格中上边有\(u\)个涂黑,右边有\(r\)个涂黑,下边有\(d4个涂黑,左边有\)l$个涂黑,问是否能满足要求。
思路:
由于只由在拐角处的方格能影响相邻的一行和一列,因此我们只需要二进制枚举四个拐角然后判断一行或一列中中间的网格(由\(n-2\)个)是否能装下需要的网格即可。
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <map>
#include <cstring>
//#pragma GCC optimize(2)
//#pragma GCC optimize(3,"Ofast","inline")
using namespace std;
#define Inf 0x3f3f3f3f
#define PII pair<int, int>
#define P2LL pair<long long, long long>
#define endl '\n'
typedef long long LL;
typedef unsigned long long ULL;
typedef vector<long long> VLL;
typedef vector<int> VI;
const int Mod = 10000007;
LL gcd(LL a, LL b) {
return b ? gcd(b, a % b) : a;
}
void change(int x, int &u, int &r, int &d, int &l) {
switch (x) {
case 0:
u--, l--;
break;
case 1:
u--, r--;
break;
case 2:
r--, d--;
break;
case 3:
l--, d--;
break;
}
}
void solve() {
int n, u, r, d, l;
cin >> n >> u >> r >> d >> l;
for (int mask = 0; mask < (1 << 4); mask++) {
int uu = u, rr = r, dd = d, ll = l, q;
for (int j = 0; j < 4; j++) {
if (mask >> j & 1) change(j, uu, rr, dd, ll); //搞四个角
}
if (uu < 0 || rr < 0 || dd < 0 || ll < 0) { //如果光角上放的就大于需要了
continue;
}
int re = n - 2;
if (re >= uu && re >= rr && re >= dd && re >= ll) {
puts("YES");
return;
}
}
puts("NO");
}
int main()
{
//ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
int t;
scanf("%d", &t);
while (t--) {
solve();
}
return 0;
}
C. 1D Sokoban
链接:B题链接
题目大意:
推箱子游戏,最初一个人站在\(0\)点,有\(n\)个箱子分布在左右两侧,只能往左边或往右边推箱子,并且不能跨过一个箱子去推当前箱子后边的箱子,如果正在推的当前箱子后边还有一个箱子,那么推的时候后边的箱子会跟着动,然后还有\(m\)个特殊位置,求经过一定的推箱子操作后使得有多少个箱子在特殊位置上,求这个最大值。
思路:
一开始没有看到不能跨过箱子这个条件,然后贪心加二分搞了一个多小时\(WA\)了,然后又根据正确思路,码出来了,花了昨晚一晚上和今天两个小时。。好怀疑人生。
思路就是:首先明白,对于负数的位置和正数的位置我们需要分开操作,并且操作相同,然后我们可以看答案是怎么被贡献得到的,可以枚举每一个特殊位置,假设当前页数位置为\(k\):
对于\(>k\)的数轴位置上,我们还没有推到,所以说这一部分的就是原本就在特殊位置上的箱子
那么对于\(\leq k\)的数轴位置上,这一部分箱子是我们一直推到\(k\)的,也就是说在位置\(k\)以及之前有一串箱子,画个图就是这样:

那么对于\(k\)这个状态,答案就是后一部分已经在特殊位置上的箱子数和在它所处位置以及之前的所有箱子所覆盖的特殊点的数量之和。
那么对于后一部分,就可以直接用一个后缀和来维护。
对于前一部分,我们需要算出那个连续的子段覆盖了多少特殊点,那么这里怎么求呢,用两个二分即可。
第一个二分是求出在当前位置\(k\)以及之前有多少个箱子,即子段的长度,记为:\(num\)。
第二个二分,求出第一个大于等于最左边箱子的特殊位置的点。
更新答案。
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <vector>
#include <map>
#include <cstring>
//#pragma GCC optimize(2)
//#pragma GCC optimize(3,"Ofast","inline")
using namespace std;
#define Inf 0x3f3f3f3f
#define PII pair<int, int>
#define P2LL pair<long long, long long>
#define endl '\n'
#define pub push_back
#define pob pop_back
typedef long long LL;
typedef unsigned long long ULL;
typedef vector<long long> VLL;
typedef vector<int> VI;
const int Mod = 10000007;
int cal(VI& box, VI& pos) {
int n = box.size(), m = pos.size();
VI suff(m + 2);
map<int, int> tag;
for (int i = 1; i < n; i++) tag[box[i]] = 1;
for (int i = m - 1; i >= 1; i--) {
suff[i] = suff[i + 1] + tag[pos[i]]; //处理寻找有多少个箱子在特殊位置上
}
int res = suff[1];
for (int i = 1; i < m; i++) {
int num = upper_bound(box.begin() + 1, box.end(), pos[i]) - box.begin() - 1;//计算出有多少个箱子在当前位置左边
//upper_bound第一个大于pos[i]的位置,那么减一就是第一个小于等于pos[i]的位置的箱子。
int left = lower_bound(pos.begin() + 1, pos.end(), pos[i] - num + 1) - pos.begin();
res = max(res, i - left + 1 + suff[i + 1]);
}
return res;
}
void solve() {
int n, m;
scanf("%d%d", &n, &m);
VI positiveA, positiveB, negativeA, negativeB;
positiveA.pub(-1), negativeA.pub(-1);
positiveB.pub(-1), negativeB.pub(-1);
for (int i = 0; i < n; i++) {
int a;
scanf("%d", &a);
if (a > 0) positiveA.pub(a);
if (a < 0) negativeA.pub(-a);
}
for (int i = 0; i < m; i++) {
int b;
scanf("%d", &b);
if (b > 0) positiveB.pub(b);
if (b < 0) negativeB.pub(-b);
}
reverse(negativeA.begin() + 1, negativeA.end());
reverse(negativeB.begin() + 1, negativeB.end());
printf("%d\n", cal(positiveA, positiveB) + cal(negativeA, negativeB));
}
int main()
{
//ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
int t;
scanf("%d", &t);
while (t--) {
solve();
}
return 0;
}
Educational Codeforces Round 105 (Rated for Div. 2) A-C题解的更多相关文章
- Educational Codeforces Round 105 (Rated for Div. 2)
A. ABC String 题目:就是用'('和')'来代替A,B,C并与之对应,问是不是存在这样的对应关系使得'('和')'正好匹配 思路:第一个和最后一个字母是确定的左括号或者是右括号,这样就还剩 ...
- Educational Codeforces Round 61 (Rated for Div. 2) D,F题解
D. Stressful Training 题目链接:https://codeforces.com/contest/1132/problem/D 题意: 有n台电脑,每台电脑都有初始电量ai,也有一个 ...
- Educational Codeforces Round 81 (Rated for Div. 2) A-E简要题解
链接:https://codeforces.com/contest/1295 A. Display The Number 贪心思路,尽可能放置更多位,如果n为奇数,消耗3去放置一个7,剩下的放1 AC ...
- Educational Codeforces Round 64 (Rated for Div. 2)题解
Educational Codeforces Round 64 (Rated for Div. 2)题解 题目链接 A. Inscribed Figures 水题,但是坑了很多人.需要注意以下就是正方 ...
- [Educational Codeforces Round 81 (Rated for Div. 2)]E. Permutation Separation(线段树,思维,前缀和)
[Educational Codeforces Round 81 (Rated for Div. 2)]E. Permutation Separation(线段树,思维,前缀和) E. Permuta ...
- Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship
Problem Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship Time Limit: 2000 mSec P ...
- Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems(动态规划+矩阵快速幂)
Problem Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems Time Limit: 3000 mSec P ...
- Educational Codeforces Round 43 (Rated for Div. 2)
Educational Codeforces Round 43 (Rated for Div. 2) https://codeforces.com/contest/976 A #include< ...
- Educational Codeforces Round 35 (Rated for Div. 2)
Educational Codeforces Round 35 (Rated for Div. 2) https://codeforces.com/contest/911 A 模拟 #include& ...
- Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings
Codeforces Educational Codeforces Round 44 (Rated for Div. 2) F. Isomorphic Strings 题目连接: http://cod ...
随机推荐
- 2021-6-17 plc连接
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 超详细的mysql总结(DQL)
上一篇文章总结了 DDL.DML的使用,这一篇文章把剩下的 DQL 加上~ DQL(Data Query Language)即数据库查询语言,用来查询所需要的信息,在查询的过程中,需要判断所查询的 ...
- 【pandas小技巧】--统计值作为新列
这次介绍的小技巧不是统计,而是把统计结果作为新列和原来的数据放在一起.pandas的各种统计功能之前已经介绍了不少,但是每次都是统计结果归统计结果,原始数据归原始数据,没有把它们合并在一个数据集中来观 ...
- 《Linux基础》01. 概述
@ 目录 1:Linux的应用领域 1.1:个人桌面领域的应用 1.2:服务器领域 1.3:嵌入式领域 2:Linux介绍 3:Linux和Unix的关系 4:Linux基本规则 Linux介绍 1: ...
- CentOS 内网YUM源配置使用
YUM介绍 yum,是Yellow dog Updater, Modified 的简称,是杜克大学为了提高RPM 软件包安装性而开发的一种软件包管理器.起初是由yellow dog 这一发行版的开发者 ...
- Field 'xxxxxx' doesn't have a default value 错误的解决办法
在写web项目的时候,出现 Field 'xxxxx' doesn't have a default value 这个错误,直接找到你的数据库,然后打开设计表,看下面自增递增是否勾选上了,如果没有勾上 ...
- 一篇文章让你弄懂分布式一致性协议Paxos
一.Paxos协议简介 Paxos算法由Leslie Lamport在1990年提出,它是少数在工程实践中被证实的强一致性.高可用.去中心的分布式协议.Paxos协议用于在多个副本之间在有限时间内对某 ...
- Mysql高级11-后台进程
一.前言 MySQL的服务实现通过后台多个线程.内存池.文件交互来实现对外服务的,不同线程实现不同的资源操作,各个线程相互协助,共同来完成数据库的服务.MySQL常用的后台线程概括如下,分为Maste ...
- Vue3搭建后台管理系统模板
搭建后台管理系统模板 2.1项目初始化 今天来带大家从0开始搭建一个vue3版本的后台管理系统.一个项目要有统一的规范,需要使用eslint+stylelint+prettier来对我们的代码质量做检 ...
- Shell 文件或目录操作符(-e、-d、-f、-r、-w、-x)
操作符 操作符 含义-e 判断对象是否存在(Exist),若存在则结果为真-d 判断对象是否为目录(Directory),是则为真-f 判断对象是否为一般文件(File),是则为真-r 判断对象是否有 ...