首页 > 编程语言 >信息工程大学第五届超越杯程序设计竞赛(同步赛)A遗失的旋律

信息工程大学第五届超越杯程序设计竞赛(同步赛)A遗失的旋律

时间:2024-03-31 23:24:38浏览次数:30  
标签:cnt0 信息工程 cin long 贡献 遗失 using 程序设计 define

题目链接 :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;
}

 

标签:cnt0,信息工程,cin,long,贡献,遗失,using,程序设计,define
From: https://www.cnblogs.com/ZouYua/p/18107461

相关文章

  • JAVA编程基础与面向对象程序设计(基础)
    1.1标识符与命名规范 标识符:java中的类,方法,变量,包命名的符号。标识符规则(1)只能由字母,数字,下划线,美元符号组成,并且不能一数字开头。(2)java标识符大小写敏感,长度无限制。(3)标识符不可以是java的关键字与保留字。关键字:java中预先定义好的一些有特别意义的单词,它们构......
  • java毕业设计基于微信公交查询小程序设计与实现
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:随着移动互联网技术的飞速发展,智能手机已经成为人们日常生活中不可或缺的一部分。微信作为国内领先的即时通讯软件,其小程序功能为用户提供了便捷的服务和......
  • 00342第四章 结构化程序设计 思考题和练习题(C语言)
    一、单项选择题1.若从键盘输入字符串"HOWAREYOU?",可以直接使用库函数【】。        A.scanf    B.getstr    C.gets    D.都不能直接使用2.C语言的库函数中,可以输出double型变量值的是【】。        A.getchar   ......
  • 大学教材《C语言程序设计》(浙大版)课后习题解析 | 第七、八章
    概述    本文主要提供《C语言程序设计》(浙大版)第七、八章的课后习题解析,以方便同学们完成题目后作为参考对照。后续将更新第九、十章节的课后习题解析,如想了解更多,请持续关注该专栏。专栏直达链接:《C语言程序设计》(浙大版)_孟俊宇-MJY的博客-CSDN博客​http://t.cs......
  • 大学教材《C语言程序设计》(浙大版)课后习题解析 | 第五、六章
    概述   本文主要提供《C语言程序设计》(浙大版)第五、六章的课后习题解析,以方便同学们完成题目后作为参考对照。后续将更新第七、八章节课后习题解析,如想了解更多,请持续关注该专栏。专栏直达链接:《C语言程序设计》(浙大版)_孟俊宇-MJY的博客-CSDN博客http://t.csdnimg......
  • 信息工程大学第五届超越杯程序设计竞赛(同步赛)题解
    比赛传送门c++模板框架#pragmaGCCoptimize(3,"Ofast","inline")#include<bits/stdc++.h>#definerep(i,a,b)for(inti=a;i<b;++i)#defineper(i,a,b)for(inti=a;i>b;--i)#definesesecond#definefifirst#defineendl'\n�......
  • L2-046 天梯赛的赛场安排 团体程序设计天梯赛-练习集 c++ 易懂 模拟
    天梯赛使用OMS监考系统,需要将参赛队员安排到系统中的虚拟赛场里,并为每个赛场分配一位监考老师。每位监考老师需要联系自己赛场内队员对应的教练们,以便发放比赛账号。为了尽可能减少教练和监考的沟通负担,我们要求赛场的安排满足以下条件:每位监考老师负责的赛场里,队员人数不得......
  • 【拯救大学牲】人民邮电出版社C语言程序设计第四章编程题答案
     注:本文所有程序均为笔者自己编写,仅供交流学习使用,欢迎一切纠错与指正。目录1.根据x的值,计算y。2.输入4个整数,从小到大排序。3.求解一元二次方程的实根4.输入一个整数,判断它能否被3和5整除,并输出一下信息之一:5.输入整存整取金额及存期,计算出利息(不计利息税)。利息=金额×......
  • C程序设计(第五版)谭浩强---第十章 文件的输入输出习题
    例1:从键盘输入一些字符,并逐个把它们送到磁盘上去,直到用户输入一个'#'为止#define_CRT_SECURE_NO_WARNINGS1#include<stdio.h>#include<stdlib.h>intmain(){ FILE*fp; charch,filename[20]; printf("输入文件名:"); gets_s(filename); if((fp=fopen(filename......
  • 挑战程序设计竞赛 2.6章习题 poj 3421 X-factor Chains
    https://vjudge.net/problem/POJ-3421#author=GPT_zhGivenapositiveintegerX,anX-factorchainoflengthmisasequenceofintegers,1=X0,X1,X2,…,Xm=XsatisfyingXi<Xi+1andXi|Xi+1wherea|bmeansaperfectlydividesintob.Nowwea......