【CodeForces】Educational Codeforces Round 132 (Rated for Div. 2)
比赛链接
A. Three Doors
题目链接
题目描述
输入
输出
样例
输入
4
3
0 1 2
1
0 3 2
2
3 1 0
2
1 3 0
输出
YES
NO
YES
NO
题目大意
面前有三个门,编号分别为1,2,3。
再给你一把编号为x的钥匙,打开每扇门后,可以有一把编号为a[i]
的钥匙,判断所给的x是否能把三扇门都打开。
思路
按照题意进行模拟,并且用a[]
存放钥匙编号,st[]
用来判断门是否打开
代码
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
void solve()
{
int x ;
cin >> x;
int a[4];
cin >> a[1] >> a[2] >> a[3];
bool st[4];
memset(st,false,sizeof st);
while(x != 0)
{
st[x] = true;
x = a[x];
}
if(st[1] && st[2] && st[3])
puts("YES");
else
puts("NO");
}
int main()
{
int T;
cin >> T;
while(T --)
solve();
return 0;
}
B. Also Try Minecraft
题目链接
题目描述
输入
输出
样例
输入
7 6
10 8 9 6 8 12 7
1 2
1 7
4 6
7 1
3 5
4 2
输出
2
10
0
7
3
1
题目大意
给你n个数,m组x,y。判断从a[x]
到a[y]
两个数之间的减少量是多少。
比如样例中1 7
,判断从a[1]
到a[7]
中的减少的数是多少
[10 - 8]+[9 - 6]+[12 - 7] = 2 + 3 + 5 = 10
思路
按照题意进行模拟会造成超时,所以可以采用前缀和。
需要对m组数据进行分类,因为有的是从左到右,有的是从右到左。
left[i] = left[i-1] + max(0ll , a[i] - a[i+1])
right[i] = right[i-1] + max(0ll , a[i+1] - a[i])
其中0ll
表示long long
状态下的0
模拟代码(会TLE)
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <iostream>
using namespace std;
const int N = 1e5+10;
int n , m;
int a[N];
int main()
{
cin >> n >> m;
for(int i = 1;i <= n;i ++)
cin >> a[i];
while(m --)
{
int x , y;
cin >> x >> y;
int cnt = 0;
if(x < y)//从左到右
{
for(int i = x;i < y;i ++)
if(a[i] > a[i+1])
cnt += a[i] - a[i+1];
}
else if(x > y)//从右往左
{
for(int i = x;i > y;i --)
if(a[i] > a[i-1])
cnt += a[i] - a[i-1];
}
cout << cnt << endl;
}
return 0;
}
前缀和代码
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 1e5+10;
ll a[N];
ll le[N] , ri[N];
ll n , m , x , y;
int main()
{
cin >> n >> m;
for(int i = 1;i <= n;i ++)
cin >> a[i];
memset(le,0ll,sizeof(le));
memset(ri,0ll,sizeof(ri));
for(int i = 1;i < n;i ++)
{
le[i] = le[i-1] + max(0ll , a[i] - a[i+1]);
ri[i] = ri[i-1] + max(0ll , a[i+1] - a[i]);
}
while(m --)
{
cin >> x >> y;
if(x < y)
cout << le[y-1] - le[x-1] << endl;
else
cout << ri[x-1] - ri[y-1] << endl;
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现