信息工程大学第五届超越杯程序设计竞赛(同步赛)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点多到威海,有点略冷.可是空气比淄博好多了,大家到了旅馆的时候都非常晚了,抱怨了一下三星级的酒店的待遇,喝杯咖啡早 ...
随机推荐
- 基于DotNetty实现自动发布 - 背景篇
故事背景 小公司,单体项目,接口和页面都在一起,生产和测试环境都是 Windows 服务器和 IIS, 本地编译完成,把相关的页面和程序集拷贝到服务器上,尤其是涉及到多个页面,一个个页面找到对应的位置 ...
- 利用标准IO函数接口实现计算一个本地磁盘某个文件的大小,文件名通过命令行进行传递
利用标准IO函数接口实现计算一个本地磁盘某个文件的大小,文件名通过命令行进行传递 方法一:使用ftell函数直接获取光标偏移量 相关标准库函数 SYNOPSIS #include <stdio. ...
- dxSpreadSheet的报表
这个玩意还真的很棒.几乎把excel的都融进来了.现在说Repoert. In addition to all the functionality available in the Spreadshe ...
- CDF与开源DevOps持续交付系统JenkinsX,Spinnaker,Tekton,Screwdriver
什么是CDF 持续交付基金会(CDF)是许多快速增长的持续交付项目(包括Jenkins.Jenkins X.Spinnaker,Tekton和Screwdriver)的中立供应商.CDF通过开放模型. ...
- Kylin-Server-V10-SP3物理机安装简要过程
1.下载镜像 链接: https://eco.kylinos.cn/partners/mirror.html?class_id=1&query_key=V10 选择: 银河麒麟高级服务器操作系 ...
- Clion搭建C++开发环境
1.下载和安装MinGW 1)下载链接:http://www.mingw.org/ 2)选择安装目录,目录尽可能简单(如:D:\MinGW)且不要包含中文和空格 3)添加相关的包 所需的包如下:min ...
- 一文带你深度剖析什么叫Transformer
Transformer概述 Transformer是基于自注意机制(self-attention)的神经网络模型.其经常用于来处理时序数据.我们知道还有另外的常用的两类深度神经网络模型循环神经网络(R ...
- AOP流程及原理
目录 一.AOP结构介绍 @Pointcut 通知 原理 连接点 拦截器 二.Bean介入点 EnableAspectJAutoProxy AspectJAutoProxyRegistrar Anno ...
- Spring的容器创建过程
Spring容器的refresh()[创建刷新] 一.prepareRefresh()刷新前的预处理 1.initPropertySources()初始化一些属性设置;子类自定义个性化的属性设置方法: ...
- 🎀idea - properties文件unicode中文显示
简介 idea中properties文件中文默认展示为unicode码 unicode 中文展示为 \u开头的ASCII 调整中文显示 idea -> settings -> Editor ...