2022/1/25-2022牛客寒假算法基础集训营1B-炸鸡块君与FIFA22(线段树)
题目描述
热爱足球(仅限游戏)的炸鸡块君最近购买了FIFA22,并且沉迷于FIFA22的Rivals排位上分。
在该排位系统中,每局游戏可能有胜利(用W表示)、失败(用L表示)、平局(用D表示)三种结果,胜利将使得排位分加一、失败使排位分减一、平局使排位分不变。特别地,该排位系统有着存档点机制,其可以简化的描述为:若你当前的排位分是3的整倍数(包括0倍),则若下一局游戏失败,你的排位分将不变(而不是减一)。
现在,给定一个游戏结果字符串和若干次询问,你需要回答这些询问。
每次询问格式为(l,r,s),询问若你初始有ss分,按从左到右的顺序经历了[l,r]这一子串的游戏结果后,最终分数是多少。
输入样例
10 7
WLDLWWLLLD
2 6 0
2 6 1
2 6 2
2 6 9
1 7 0
7 10 10
10 10 100
输出样例
2
2
2
11
1
9
100
分析
首先这种2e5的区间查询很容易就想到线段树了,想了一会果然能解。因为题意要求能整除3的时候负不扣分,我们可以分情况讨论进而用线段树维护区间对答案的总贡献,我们设c[i]表示初始值%3后为i的时候选择这一区间后答案的增加量。那初始化很简单对吧这三种状态赢贡献都是1,平都是0,负的话只有0的时候是0其余都是-1
if (s[l] == 'W')
{
tr[u].c[0] = 1;
tr[u].c[1] = 1;
tr[u].c[2] = 1;
}
else if (s[l] == 'L')
{
tr[u].c[0] = 0;
tr[u].c[1] = -1;
tr[u].c[2] = -1;
}
else
{
tr[u].c[0] = 0;
tr[u].c[1] = 0;
tr[u].c[2] = 0;
}
然后考虑up操作,我们和上面一样分情况讨论,[l,r]区间初始为i的贡献=左区间为i的贡献+右区间初始值为(i+右区间)%3的贡献。
void pushup(int u)
{
for (int i = 0; i < 3; i++)
{
tr[u].c[i] = max(tr[u << 1].c[i] + tr[u << 1 | 1].c[(i + tr[u << 1].c[i])%3], -i);
}
}
至此此题结束。
C++代码
/*made in dirt & sand */
#include <bits/stdc++.h>
#define endl '\n'
#define bug(a) cout << a << endl
#define bug2(a, b) cout << (a) << ' ' << (b) << endl
#define bug3(a, b, c) cout << (a) << ' ' << (b) << ' ' << (c) << endl
#define pb push_back
//#define int long long
#define x first
#define y second
#define pii pair<int, int>
using namespace std;
typedef long long ll;
const int N = 2e5 + 10;
int i, j, n, m, x,y;
int a[N];
char s[N];
struct node
{
int l, r;
int c[3];
} tr[N<<2];
void pushup(int u)
{
for (int i = 0; i < 3; i++)
{
tr[u].c[i] = max(tr[u << 1].c[i] + tr[u << 1 | 1].c[(i + tr[u << 1].c[i])%3], -i);
}
}
void build(int u, int l, int r)
{
tr[u] = {l, r};
if (l == r)
{
if (s[l] == 'W')
{
tr[u].c[0] = 1;
tr[u].c[1] = 1;
tr[u].c[2] = 1;
}
else if (s[l] == 'L')
{
tr[u].c[0] = 0;
tr[u].c[1] = -1;
tr[u].c[2] = -1;
}
else
{
tr[u].c[0] = 0;
tr[u].c[1] = 0;
tr[u].c[2] = 0;
}
}
else
{
tr[u] = {l, r};
int mid = l + r >> 1;
build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
pushup(u);
}
}
ll query(int u, int l, int r, int q)
{
if (tr[u].l >= l && tr[u].r <= r)
{
return tr[u].c[q];
}
int mid = tr[u].l + tr[u].r >> 1;
ll sum = 0;
if (l <= mid)
sum = query(u << 1, l, min(mid, r), q);
if (r > mid)
sum += query(u << 1 | 1, max(mid + 1, l), r, (q + sum) % 3);
return sum;
}
signed main()
{
// freopen("black.in","r",stdin);
//std::ios::sync_with_stdio(false);
//cin.tie(0);
int T = 0;
cin >> n >> m;
cin >> (s + 1);
build(1, 1, n);
while (m--)
{
int z;
cin >> x >> y >> z;
cout << z + query(1, x, y, z % 3) << endl;
;
}
}
2022/1/25-2022牛客寒假算法基础集训营1B-炸鸡块君与FIFA22(线段树)的更多相关文章
- 牛客寒假算法基础集训营1B题
链接:https://ac.nowcoder.com/acm/contest/317/B 来源:牛客网 题目描述 小a非常喜欢204204这个数字,因为′a′+′k′=204′a′+′k′=204. ...
- 2020牛客寒假算法基础集训营2 J题可以回顾回顾
2020牛客寒假算法基础集训营2 A.做游戏 这是个签到题. #include <cstdio> #include <cstdlib> #include <cstring ...
- 2020牛客寒假算法基础集训营1 J题可以回顾回顾
2020牛客寒假算法基础集训营1 这套题整体来说还是很简单的. A.honoka和格点三角形 这个题目不是很难,不过要考虑周全,面积是1,那么底边的长度可以是1也可以是2, 注意底边1和2会有重复的, ...
- Applese 的毒气炸弹 G 牛客寒假算法基础集训营4(图论+最小生成树)
链接:https://ac.nowcoder.com/acm/contest/330/G来源:牛客网 Applese 的毒气炸弹 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262 ...
- 牛客寒假算法基础集训营3B 处女座的比赛资格(用拓扑排序解决DAG中的最短路)
链接:https://ac.nowcoder.com/acm/contest/329/B 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...
- 牛客寒假算法基础集训营4 I题 Applese 的回文串
链接:https://ac.nowcoder.com/acm/contest/330/I 来源:牛客网 自从 Applese 学会了字符串之后,精通各种字符串算法,比如--判断一个字符串是不是回文串. ...
- 牛客寒假算法基础集训营4 I Applese 的回文串
链接:https://ac.nowcoder.com/acm/contest/330/I来源:牛客网 自从 Applese 学会了字符串之后,精通各种字符串算法,比如……判断一个字符串是不是回文串. ...
- 牛客寒假算法基础集训营2 【处女座与复读机】DP最小编辑距离【模板题】
链接:https://ac.nowcoder.com/acm/contest/327/G来源:牛客网 一天,处女座在牛客算法群里发了一句“我好强啊”,引起无数的复读,可是处女座发现复读之后变成了“处女 ...
- 欧拉函数-gcd-快速幂(牛客寒假算法基础集训营1-D-小a与黄金街道)
题目描述: 链接:https://ac.nowcoder.com/acm/contest/317/D来源:牛客网小a和小b来到了一条布满了黄金的街道上.它们想要带几块黄金回去,然而这里的城管担心他们拿 ...
- 牛客寒假算法基础集训营3处女座和小姐姐(三) (数位dp)
链接:https://ac.nowcoder.com/acm/contest/329/G来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52428 ...
随机推荐
- 2024 年了,IT 运维监控系统都有哪些推荐?
大浪淘沙,2024 年的今天,市面上很多监控系统慢慢淡出了大家的视野,而一些新的监控系统也逐渐崭露头角.今天我们就来看看 2024 年的当下,哪些 IT 运维监控系统最值得关注. Prometheus ...
- springboot之banner.txt
在springboot启动过程中,我们经常可以看到控制台打印下面图文: 实际上这个打印图文,是可以自定义的,可以在springboot的resource中创建一个banner.txt文件,在启动时就会 ...
- 首次在WebAPI中写单元测试
xUnit 这次我使用的是xUnit测试框架,而不是VS自带的MSTest框架.在添加新建项目时选择xUnit测试项目就行了. 目前只体验到了一个差别,即xUnit可以使用特性向测试方法传参,而不用在 ...
- 为 OpenWrt 路由器编译 minieap-sysu 项目
学校的校园网要使用锐捷认证,于是想把认证客户端装到刷了 OpenWrt 的路由器上面.然而认证客户端 Linux 版只支持 x86 架构,我的路由器处理器却是 AArch64 架构,装不了,所以只能想 ...
- Unrecognized SSL message, plaintext connection?
报错:Unrecognized SSL message, plaintext connection? 修改:把 requestContext.setScheme(Scheme.HTTPS);修改为 r ...
- 效率跃升16倍!火山引擎ByteHouse助力销售数据平台复杂查询效率大幅提高
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群. 销售数据,是反映市场趋势.消费者行为以及产品表现的重要指标,也是企业做出精准决策的关键依据.因此,对销售数据 ...
- java基础 -线程(基础)的 笔记
581,多线程机制 因为需要敌人的坦克可以自由移动并发射子弹,我们的坦克可以移动并发射子弹,这些要用到线程的知识. 根据JConsole监控线程执行情况,发现,主线程执行完了,子线程还没有执行完,并不 ...
- css+div实现各种常见边框
css+div实现各种常见边框 一.效果图如下 二.实现代码 div { width: 120px; height: 100px; margin: 10px; float: left; text-al ...
- JavaScript – Web Worker
前言 在上一篇 << 单线程 与 执行机制 >> 中, 我们提到了 Web Worker. 它的诞生是为了解决 JS 主线程执行耗时计算时, 导致 UI 无法及时更新的卡死现象 ...
- Java实现随机抽奖的方法有哪些
在Java中实现随机抽奖的方法,通常我们会使用java.util.Random类来生成随机数,然后基于这些随机数来选择中奖者.以下将给出几种常见的随机抽奖实现方式,包括从数组中抽取.从列表中抽取以及基 ...