题目链接 :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遗失的旋律的更多相关文章

  1. 江西财经大学第二届程序设计竞赛同步赛 H大时钟 (扩展欧几里得)

    链接:https://ac.nowcoder.com/acm/contest/635/H来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言52428 ...

  2. 牛客网 江西财经大学第二届程序设计竞赛同步赛 D.绕圈游戏-(跳青蛙游戏)找数的所有因子就可以了

    链接:https://ac.nowcoder.com/acm/contest/635/D来源:牛客网 D.绕圈游戏 433为了帮ddd提升智商,决定陪他van特殊的游戏.433给定一个带有n个点的环, ...

  3. 哈尔滨理工大学软件与微电子学院第八届程序设计竞赛同步赛(高年级) Solution

    A: Solved. 分别处理出每个%7后余数的数字个数,再组合一下 #include <bits/stdc++.h> using namespace std; #define ll lo ...

  4. 长安大学第四届ACM-ICPC“迎新杯”程序设计竞赛-重现赛 G - 彩虹岛套娃

    题目描述 俄罗斯套娃是俄罗斯特产的木制玩具,一般由多个一样图案的空心木娃娃一个套一个组成,最多可达十多个,通常为圆柱形,底部平坦可以直立.颜色有红色,蓝色,绿色,紫色等.最普通的图案是一个穿着俄罗斯民 ...

  5. 长安大学第四届ACM-ICPC“迎新杯”程序设计竞赛-重现赛 H - 圣诞节糖果

    题目描述 圣诞节临近,彩虹岛的黑心商人

  6. 长安大学第四届ACM-ICPC“迎新杯”程序设计竞赛-重现赛 F - 打铁的箱子

    题目描述 作为彩虹岛上最擅长打铁的人,

  7. 长安大学第四届ACM-ICPC“迎新杯”程序设计竞赛-重现赛 D - 新卡片游戏

    题目描述

  8. QZEZ第一届“饭吉圆”杯程序设计竞赛

    终于到了饭吉圆杯的开赛,这是EZ我参与的历史上第一场ACM赛制的题目然而没有罚时 不过题目很好,举办地也很成功,为法老点赞!!! 这次和翰爷,吴骏达 dalao,陈乐扬dalao组的队,因为我们有二个 ...

  9. angry_birds_again_and_again(2014年山东省第五届ACM大学生程序设计竞赛A题)

    http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2877 题目描述 The problems ca ...

  10. “浪潮杯”山东省第五届ACM大学生程序设计竞赛(总结贴)

    第一次參加省赛有点小激动,尽管是作为打星队參赛,但心情却是上下起伏. 5月9号晚上11点多到威海,有点略冷.可是空气比淄博好多了,大家到了旅馆的时候都非常晚了,抱怨了一下三星级的酒店的待遇,喝杯咖啡早 ...

随机推荐

  1. .NET10 - 预览版1新功能体验(一)

    .NET 10 首个预览版已经在前两天发布,该版本在 .NET Runtime.SDK.libraries.C#.ASP.NET Core.Blazor 和 .NET MAUI 等多个方面都有重大改进 ...

  2. php stripslashes 函数的意思

    脑子不行了,很多东西看过就忘,比如这个stripslashes,知道是去除反斜杠,但为啥用它死活想不起来,搜索一下,把这几篇文章抄下来: 1.反斜杠是怎么回事 两个东西 ini_set(magic_q ...

  3. C# 生成缩略图方法

    private static string CreateThumbnail(string filepath, int tWidth, int tHeight) { if (string.IsNullO ...

  4. Web前端入门第 17 问:前端开发编辑器及插件推荐

    HELLO,这里是大熊学习前端开发的入门笔记. 本系列笔记基于 windows 系统. 虽然说 Web 前端开发用记事本也能玩,但正常的开发者绝不用记事本玩(大佬除外). 想想要用记事本扣一个淘宝.京 ...

  5. 微信小程序获取环境变量

    微信小程序获取环境变量 在微信小程序中,无法直接获取环境变量.但是,我们可以通过其他方式来模拟环境变量的功能. 参考用法 通过 wx.getAccountInfoSync() 获取小程序信息,包含小程 ...

  6. Portainer安装配置

    什么是portainer 官网:https://www.portainer.io/ Portainer(基于 Go) 是一个轻量级的Web管理界面,可让您轻松管理 Docker 主机 或 Swarm ...

  7. etcd和Zookeeper孰优孰劣对比

    背景 最近在看到Pachyderm的介绍时,看到作者拿YARN和Kubernetes做类比,拿Zookeeper和etcd做对比.YARN和Kubernetes的类比还相对比较好理解,毕竟他们都有资源 ...

  8. Java 8的新特性还不了解?快进来!

    能坚持别人不能坚持的,才能拥有你想拥有的.关注 编程大道,让我们一起成长

  9. DNS介绍与实现方法

    简介:域名系统(Domain Name System,缩写:DNS)是互联网的一项服务.是一种可以将域名和IP地址相互映射的以层次结构分布的数据库系,允许终端用户设备将给定的人类可读URL转换为网络可 ...

  10. 保存计算过程的计算器——java实现

    一.设计模型 按照MVC-Model View Control(模型,视图,控制器)的设计思想展开程序的设计和代码的编写.数据模型部分相当于MVC中的Model角色,视图设计部分给出的界面部分相当于M ...