写在前边

链接: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. git:gitignore常用配置

    配置 在项目文件中添加.gitignore文件 .DS_Store node_modules /dist

  2. Axios向后段请求数据GET POST两种方法的不同之处

    GET请求 向后端请求时,通过URL向后端传递参数 axios({ url:'http://127.0.0.1:9000/get-user-list/', type:'json', //GET方法携带 ...

  3. openpyxl 设置单元格自动换行

    解决方案 openpyxl的alignment函数中的参数:wrapText=True,就可以了 from openpyxl.styles import Alignment worksheet.cel ...

  4. 看,这些 plugins 常用又简单

    前面文章中 体验了webpack的打包 .解析css资源 .处理图片字体等文件 接下来看看 plugins 有什么作用吧~ 项目路径如下,和上一篇 处理图片字体等文件 项目保持一致 demo ├─ s ...

  5. wineqq中接收文件的查看与移动

    在Ubuntu等linux系统中安装QQ都需要安装wine支持,而在使用时,会遇到qq接收到的文件无法直接进行操作等问题. 这时,我们发现直接对文件进行复制后,无法在Ubuntu目录中进行粘贴. 其实 ...

  6. docker-compose快速部署elasticsearch-8.x集群+kibana

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 前文<Docker下elasticse ...

  7. Jmeter逻辑控制器Switch Controller的用法

    一.概述 类似编程语言中的switch函数,Switch Controller根据给定的值n(可使用变量)选择执行其下的 第n+1个子节点. 作用:Switch Controller通过给该控制器中的 ...

  8. 《Web安全基础》02. 信息收集

    @ 目录 1:CDN 绕过 1.1:判断是否有 CDN 服务 1.2:常见绕过方法 1.3:相关资源 2:网站架构 3:WAF 4:APP 及其他资产 5:资产监控 本系列侧重方法论,各工具只是实现目 ...

  9. MutationObserver监听dom元素结构及属性变化

    工作中埋码需求,当某些动态插入的元素出现时触发埋码事件,因此需要对插入元素的父节点进行监听,子节点发生变化时触发相应埋码逻辑. 方法一 监听页面结构及子元素变化: (function () { //事 ...

  10. Oracle主键自增列

    SQL Server创建主键自增列我们可以使用"ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY"一步到位创建,而Oracle创建主键自增列和SQ ...