信息工程大学第五届超越杯程序设计竞赛(同步赛)A遗失的旋律
题目链接 :A-遗失的旋律_信息工程大学第五届超越杯程序设计竞赛(同步赛) (nowcoder.com)
本场比赛的数据都很水,导致很多题暴力都能过,(出题人背大锅, 说实话,如果数据不水, 这场感觉质量是很高的
这题一开始除了知道是线段树维护0,1个数,确实没什么很清楚的思路,后来看榜一大堆人都过了, 就离谱,就蒙个暴力过去了
考虑一般规律((x + 1) * 2 + 1)* 2 + 1 可以拆解为(x * 2 + 1) * 2 + 1 + (1 * 2) + 1 * 2 + 1, 设一个节点的信息为cnt0, cn1表示0,1 的贡献
对于push_up操作
这个点的0的贡献也就是+1的贡献, 就是 左边的贡献 * 右边2的幂 + 右边0的的个数 即 cnt0[u] = cnt0[u << 1] * pw[cnt1[u << 1 | 1] ] + cnt0[u << 1 | 1]
这个点的1的贡献只用算1数量的幂,即1的个数 cnt1[u] = cnt1[u << 1] + cnt1[u << 1 | 1]
对于操作2 把x看作一个加数答案就是两个加数的贡献之和, 先把区间的答统计出来,返回pair类型, 答案即 x * pw[res.second] + res.first 记得每步取模
ac代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
using ull = unsigned long long;
using ll = long long;
using PII = pair<ll,ll>;
using PIII = pair<ll, pair<ll,ll>>;
#define endl "\n"
#define pb push_back
#define IOS ios::sync_with_stdio(false);cin.tie(0)
#define lowbit(x) (x) & (-x)
#define point(x) setiosflags(ios::fixed)<<setprecision(x)
const int N=1e6+10;
const int INF=0x3f3f3f3f;
const int mod=998244353;
string s;
int n, m;
int a[N], pw[N];
int cnt0[N], cnt1[N];//0字符的贡献, 1字符的贡献
void push_up(int u) {
cnt0[u] = (cnt0[u << 1] * pw[cnt1[u << 1 | 1]] % mod + cnt0[u << 1 | 1]) % mod;
cnt1[u] = cnt1[u << 1] + cnt1[u << 1 | 1];
}
void build(int u, int l, int r) {
if(l == r) {
if(a[l] == 0) cnt0[u] = 1;
else cnt1[u] = 1;
return ;
}
int mid = l + r >> 1;
build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
push_up(u);
}
void update(int u, int l, int r, int pos, int k) {
if(l == pos && r == pos) {
cnt0[u] = 0, cnt1[u] = 0;
if(k == 0) cnt0[u] = 1;
else cnt1[u] = 1;
return ;
}
int mid = l + r >> 1;
if(pos <= mid) update(u << 1, l, mid, pos, k);
else update(u << 1 | 1, mid + 1, r, pos, k);
push_up(u);
}
PII query(int u, int l, int r, int x, int y) {
//if(y < l || x > r) return {0, 0};
if( x <= l && r <= y) {
return {cnt0[u], cnt1[u]};
}
PII res1 = {0, 0}, res2 = {0, 0}, ans = {0, 0};
int mid = l + r >> 1;
if(x <= mid) res1 = query(u << 1, l, mid, x, y);
if(mid < y) res2 = query(u << 1 | 1, mid + 1, r, x, y);
ans.first = (res1.first * pw[res2.second] % mod + res2.first) % mod;
ans.second = res1.second + res2.second;
return ans;
}
void solve(){
cin >> n >> m;
cin >> s; s = " " + s;
for(int i = 1; i <= n; i ++) a[i] = s[i] - '0';
pw[0] = 1;
for(int i = 1; i < N; i++) pw[i] = (pw[i - 1] * 2) % mod;
build(1,1, n);
while(m --) {
int op, l, r, x, y; cin >> op;
if(op == 1) {
cin >> y;
a[y] ^= 1;
update(1, 1, n, y, a[y]);
} else {
cin >> x >> l >> r;
PII res = query(1, 1, n, l, r);
cout << (res.first + (x * pw[res.second]) % mod) % mod << endl;
}
}
//for(int i = 1; i <= n; i ++) cout << a[i] << " \n"[i == n];
}
signed main()
{
IOS;
int T=1;
while(T--){
solve();
}
return 0;
}
信息工程大学第五届超越杯程序设计竞赛(同步赛)A遗失的旋律的更多相关文章
- 江西财经大学第二届程序设计竞赛同步赛 H大时钟 (扩展欧几里得)
链接:https://ac.nowcoder.com/acm/contest/635/H来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52428 ...
- 牛客网 江西财经大学第二届程序设计竞赛同步赛 D.绕圈游戏-(跳青蛙游戏)找数的所有因子就可以了
链接:https://ac.nowcoder.com/acm/contest/635/D来源:牛客网 D.绕圈游戏 433为了帮ddd提升智商,决定陪他van特殊的游戏.433给定一个带有n个点的环, ...
- 哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(高年级) Solution
A: Solved. 分别处理出每个%7后余数的数字个数,再组合一下 #include <bits/stdc++.h> using namespace std; #define ll lo ...
- 长安大学第四届ACM-ICPC“迎新杯”程序设计竞赛-重现赛 G - 彩虹岛套娃
题目描述 俄罗斯套娃是俄罗斯特产的木制玩具,一般由多个一样图案的空心木娃娃一个套一个组成,最多可达十多个,通常为圆柱形,底部平坦可以直立.颜色有红色,蓝色,绿色,紫色等.最普通的图案是一个穿着俄罗斯民 ...
- 长安大学第四届ACM-ICPC“迎新杯”程序设计竞赛-重现赛 H - 圣诞节糖果
题目描述 圣诞节临近,彩虹岛的黑心商人
- 长安大学第四届ACM-ICPC“迎新杯”程序设计竞赛-重现赛 F - 打铁的箱子
题目描述 作为彩虹岛上最擅长打铁的人,
- 长安大学第四届ACM-ICPC“迎新杯”程序设计竞赛-重现赛 D - 新卡片游戏
题目描述
- QZEZ第一届“饭吉圆”杯程序设计竞赛
终于到了饭吉圆杯的开赛,这是EZ我参与的历史上第一场ACM赛制的题目然而没有罚时 不过题目很好,举办地也很成功,为法老点赞!!! 这次和翰爷,吴骏达 dalao,陈乐扬dalao组的队,因为我们有二个 ...
- angry_birds_again_and_again(2014年山东省第五届ACM大学生程序设计竞赛A题)
http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2877 题目描述 The problems ca ...
- “浪潮杯”山东省第五届ACM大学生程序设计竞赛(总结贴)
第一次參加省赛有点小激动,尽管是作为打星队參赛,但心情却是上下起伏. 5月9号晚上11点多到威海,有点略冷.可是空气比淄博好多了,大家到了旅馆的时候都非常晚了,抱怨了一下三星级的酒店的待遇,喝杯咖啡早 ...
随机推荐
- .NET10 - 预览版1新功能体验(一)
.NET 10 首个预览版已经在前两天发布,该版本在 .NET Runtime.SDK.libraries.C#.ASP.NET Core.Blazor 和 .NET MAUI 等多个方面都有重大改进 ...
- php stripslashes 函数的意思
脑子不行了,很多东西看过就忘,比如这个stripslashes,知道是去除反斜杠,但为啥用它死活想不起来,搜索一下,把这几篇文章抄下来: 1.反斜杠是怎么回事 两个东西 ini_set(magic_q ...
- C# 生成缩略图方法
private static string CreateThumbnail(string filepath, int tWidth, int tHeight) { if (string.IsNullO ...
- Web前端入门第 17 问:前端开发编辑器及插件推荐
HELLO,这里是大熊学习前端开发的入门笔记. 本系列笔记基于 windows 系统. 虽然说 Web 前端开发用记事本也能玩,但正常的开发者绝不用记事本玩(大佬除外). 想想要用记事本扣一个淘宝.京 ...
- 微信小程序获取环境变量
微信小程序获取环境变量 在微信小程序中,无法直接获取环境变量.但是,我们可以通过其他方式来模拟环境变量的功能. 参考用法 通过 wx.getAccountInfoSync() 获取小程序信息,包含小程 ...
- Portainer安装配置
什么是portainer 官网:https://www.portainer.io/ Portainer(基于 Go) 是一个轻量级的Web管理界面,可让您轻松管理 Docker 主机 或 Swarm ...
- etcd和Zookeeper孰优孰劣对比
背景 最近在看到Pachyderm的介绍时,看到作者拿YARN和Kubernetes做类比,拿Zookeeper和etcd做对比.YARN和Kubernetes的类比还相对比较好理解,毕竟他们都有资源 ...
- Java 8的新特性还不了解?快进来!
能坚持别人不能坚持的,才能拥有你想拥有的.关注 编程大道,让我们一起成长
- DNS介绍与实现方法
简介:域名系统(Domain Name System,缩写:DNS)是互联网的一项服务.是一种可以将域名和IP地址相互映射的以层次结构分布的数据库系,允许终端用户设备将给定的人类可读URL转换为网络可 ...
- 保存计算过程的计算器——java实现
一.设计模型 按照MVC-Model View Control(模型,视图,控制器)的设计思想展开程序的设计和代码的编写.数据模型部分相当于MVC中的Model角色,视图设计部分给出的界面部分相当于M ...