写在前边

链接:Educational Codeforces Round 105 (Rated for Div. 2)

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题解的更多相关文章

  1. Educational Codeforces Round 105 (Rated for Div. 2)

    A. ABC String 题目:就是用'('和')'来代替A,B,C并与之对应,问是不是存在这样的对应关系使得'('和')'正好匹配 思路:第一个和最后一个字母是确定的左括号或者是右括号,这样就还剩 ...

  2. Educational Codeforces Round 61 (Rated for Div. 2) D,F题解

    D. Stressful Training 题目链接:https://codeforces.com/contest/1132/problem/D 题意: 有n台电脑,每台电脑都有初始电量ai,也有一个 ...

  3. Educational Codeforces Round 81 (Rated for Div. 2) A-E简要题解

    链接:https://codeforces.com/contest/1295 A. Display The Number 贪心思路,尽可能放置更多位,如果n为奇数,消耗3去放置一个7,剩下的放1 AC ...

  4. Educational Codeforces Round 64 (Rated for Div. 2)题解

    Educational Codeforces Round 64 (Rated for Div. 2)题解 题目链接 A. Inscribed Figures 水题,但是坑了很多人.需要注意以下就是正方 ...

  5. [Educational Codeforces Round 81 (Rated for Div. 2)]E. Permutation Separation(线段树,思维,前缀和)

    [Educational Codeforces Round 81 (Rated for Div. 2)]E. Permutation Separation(线段树,思维,前缀和) E. Permuta ...

  6. 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 ...

  7. 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 ...

  8. Educational Codeforces Round 43 (Rated for Div. 2)

    Educational Codeforces Round 43 (Rated for Div. 2) https://codeforces.com/contest/976 A #include< ...

  9. Educational Codeforces Round 35 (Rated for Div. 2)

    Educational Codeforces Round 35 (Rated for Div. 2) https://codeforces.com/contest/911 A 模拟 #include& ...

  10. 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 ...

随机推荐

  1. 解决pandas 读取csv文件报错

    使用encoding参数: pd.read_csv(path,sep=",",encoding='utf-16') 注意:该参数之后的编码格式,并不是固定的,需要用记事本打开csv ...

  2. Java 生态需要新鲜的血液、需要狂飙的刺激。Solon v2.4.1 发布

    Solon 是什么开源项目? 一个,Java 新的生态型应用开发框架.它从零开始构建,有自己的标准规范与开放生态(历时五年,已有全球第二级别的生态规模).与其他框架相比,它解决了两个重要的痛点:启动慢 ...

  3. 跟运维学 Linux - 03

    权限机制和性能指标 前面我们学完了操作文件和用户相关知识,本篇学习权限和性能相关知识. 文件的属性看起 看 linux 的权限,先从文件的属性看起 ls -l 加 -d 是只看这个文件夹: pjl@p ...

  4. 配置DHCP

    配置DHCP 条件:关闭防火墙 和selinux 1,安装dhcp服务 [root@localhost ~]#yum install dhcp -y#安装dhcp服务 2,查看配置文件 [root@l ...

  5. NFS快速入门(一):简介、原理

    NFS网络文件共享存储 什么是NFS NFS 是 Network File System 的缩写,中文意思是网络文件系统.它的主要功能是通过网络(一般是局域网)让不同主机系统之间可以共享文件或目录.N ...

  6. React-Chat移动端聊天实例|react18 hooks仿微信App聊天界面

    基于react18+react-vant+zustand仿微信手机端聊天室ReactChat. react18-chat 一款使用最新react18.x hooks.zustand搭配react-va ...

  7. Prism报错

    Rules.Default..WithoutFastExpressionCompiler()报错 说没有找到容器 1.查看Prism.Wpf源码 获取DryIoc容器规则 2.证明项目中出现了另外一个 ...

  8. Netty源码学习2——NioEventLoop的执行

    系列文章目录和关于我 零丶引入 在<Netty源码学习1--NioEventLoopGroup的初始化>中,我们学习了NioEventLoopGroup和NioEventLoop的初始化, ...

  9. 文心一言 VS 讯飞星火 VS chatgpt (85)-- 算法导论8.2 2题

    二.用go语言,试证明 COUNTING-SORT 是稳定的. 文心一言: 要证明 COUNTING-SORT 是稳定的,我们需要证明在排序过程中,具有相同值的元素在排序后仍保持其原始的相对顺序.CO ...

  10. ios设备管理

    管理设备