Educational Codeforces Round 132 (Rated for Div. 2)
作者:互联网
目录
A. Three Doors
A 题意:
总共三个箱子
开局提供一个钥匙,可开启编号相对应的一个箱子
每个箱子内会存放其他箱子的钥匙,问是否可以将所有箱子都开启
A代码:
#include <iostream>
#include <algorithm>
#include <cstring>
#define fi first
#define se second
#define ios ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
const int N = 1e5+10;
int n,m,T;
int a[N];
int st[N];
int main()
{
ios;
cin >> T;
while(T --)
{
cin >> n;
for(int i = 1;i <= 3;i ++){
cin >> a[i];
}
st[n] = true;
if(a[n] == 0 || a[n] == n){
cout << "NO" << endl;
}
else{
int t = a[n];
if(a[t] == 0 || a[t] == t || a[t] == n){
cout << "NO" << endl;
}
else cout << "YES" << endl;
}
}
// cout << " " << endl;
return 0;
}
B. Also Try Minecraft
B 题意 及思路
题意:给你一段序列,序列中的每个数字代表一座山的高度
询问从下标l的山到下标为r的山总计需要掉落多少米(有一双非常nb的幽灵鞋帮助你飞翔(只有在需要爬山的时候使用),每座山都需要到达)。
思路:分别从前往后 和 从后往前作前缀和计算(计算每段需要坠落多少米)
为了赶时间采用了最麻烦的写法,没有细想该如何优化
B 代码
#include <iostream>
#include <algorithm>
#include <cstring>
#define fi first
#define se second
#define ios ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
const int N = 1e5+10;
int n,m,T;
LL a[N];
LL st[N];
LL stt[N];
int main()
{
ios;
cin >> n >> m;
for(int i = 0;i < n;i ++){
cin >> a[i];
}
for(int i = 1;i < n;i ++){
if(a[i-1] > a[i])
st[i] = a[i - 1] - a[i];
}
for(int i = 1;i < n;i ++){
st[i] += st[i-1];
}
for(int i = n-1;i >= 0;i --){
if(a[i] > a[i-1])
stt[i-1] = a[i] - a[i-1];
}
for(int i = n-1;i >= 0;i --){
stt[i] += stt[i+1];
}
// for(int i = 0;i < n;i ++)
// {
// cout << stt[i] << " ";
// }
while(m --){
int l,r;
cin >> l >> r;
if(l < r)
cout << st[r-1] - st[l-1] << endl;
else cout << stt[r-1] - stt[l-1] << endl;
}
// cout << " " << endl;
return 0;
}
C. Recover an RBS
C 题意以及思路
题意非常简单,就是问这个括号是否有多种不同存在的形式
举个栗子应该更好理解一点: (???
这个既可以写为(())
也可以写为()()
所以输出NO
因为有两种形式
再看?((?(???
,这个只能谢伟((()()))
思路:
- 由于出现的括号序列必然是合法的,那么每个出现的
)
必然可以直接对应上之前出现的(
或者?
所以当)
出现时就优先使用(
进行配对,如果(
个数为0,则花费?
- 血亏的一点在于序列最左边无论是
?
或者(
都必为(
,原因在于当?
出现而(
的个数为0时,?
必然需要充当(
的角色,而并不是因为序列的特殊性导致序列最左边与最右边的符号唯一性,这样特殊判断才能让序列中间不产生判断问题。深夜脑子不过关QAQ,不然半小时也不会这样
C代码
#include <iostream>
#include <algorithm>
#include <cstring>
#define fi first
#define se second
#define ios ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
const int N = 1e5+10;
int n,m,T;
int a[N];
string op;
int main()
{
ios;
cin >> T;
while (T --){
cin >> op;
// 下面两行纯纯园中
op[0] = '(';
op[op.size()-1] = ')';
int l = 0,mid = 0;
for(int i = 0;i < op.size();i ++){
if(op[i] == '(' ) l ++;
else if(op[i] == ')'){
if(l) l --;
else mid --;
}
else mid ++;
if(l == 0 && mid == 1){
l ++;
mid --;
}
}
mid -= l;
if(mid) cout << "NO" << endl;
else cout << "YES" << endl;
}
// cout << " " << endl;
return 0;
}
D. Rorororobot
D题题意及思路
吐槽:nnd还是不能头铁,先做这题就上大分了QAQ
题意:一个机器人在固定高度且有部分格子被封印的棋盘上从初始点到终点,走到被封印的格子或者棋盘外是不被原谅不被允许会被机器神处罚是不可以的,每次行动给定一个参数k代表机器人只能以最低k步进行行走,若行走时经过终点也不行,只能恰好走到终点。
思路:使用线段树去记录并查询从起始点到终点的最高高度信息,若能以maxn(代表从起始点到终点的最高高度)到n(最高高度)之间的某一高度通过则一定可以到达终点(前提在于)$$$ abs(x_2 - x_1) % k == 0 && abs(y_2 - y_1) % k == 0 $$$
D代码:
#include <iostream>
#include <algorithm>
#include <cstring>
#define fi first
#define se second
#define ios ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
const int N = 2e5+10;
int n,m,T;
int w[N];
struct Node
{
int l,r;
int maxn;
} tr[N*4];
void pushup(int u)
{
tr[u].maxn = max(tr[u << 1].maxn,tr[u << 1 | 1].maxn);
}
void build(int u,int l,int r)
{
if(l == r) tr[u] = {l,r,w[r]};
else
{
tr[u] = {l,r};
int mid = l + r >> 1;
build(u << 1,l,mid),build(u << 1 | 1,mid+1,r);
pushup(u);
}
}
int query(int u,int l,int r)
{
if(tr[u].l >= l && tr[u].r <= r) return tr[u].maxn;
int mid = tr[u].l + tr[u].r >> 1;
int maxn = 0;
if(l <= mid) maxn = max(maxn,query(u << 1,l,r));
if(r > mid) maxn = max(maxn,query(u << 1 | 1,l,r));
return maxn;
}
int main()
{
ios;
cin >> n >> m;
for(int i = 1;i <= m;i ++) cin >> w[i];
build(1,1,m);
cin >> T;
while(T --)
{
int x1,y1,x2,y2,k;
cin >> y1 >> x1 >> y2 >> x2 >> k;
int y = abs(y2 - y1);
int x = abs(x2 - x1);
if(y % k != 0 || x % k != 0)
{
cout << "NO" << endl;
}
else
{
int maxn = query(1,min(x1,x2),max(x1,x2));
int t = maxn - y1;
if(t < 0) cout << "YES" << endl;
else if(n - maxn >= k - (t % k)) cout << "YES" <<endl;
else cout << "NO" << endl;
}
}
// cout << " " << endl;
return 0;
}
stip
暑假开始的这一个月以来的效率确实太慢了QAQ
但也想不到有什么提高效率的办法,或许答案就在眼前了吧QAQ
再垂死挣扎一下吧QAQ
标签:Educational,Rated,题意,int,ios,Codeforces,cin,include,define 来源: https://www.cnblogs.com/xiaye13/p/16514842.html