“东信杯”广西大学第一届程序设计竞赛(同步赛)J-RMQ(线段树+位运算)

“东信杯”广西大学第一届程序设计竞赛(同步赛) 链接:https://ac.nowcoder.com/acm/contest/283/B 来源:牛客网   不吉利的数 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 131072K,其他语言262144K 64bit IO Format: %lld 题目描述 在数学中,某个序列的子序列是从最初序列通过去除某些元素但不破坏余下元素的相对位置(在前或在后)而形成的新序列。 ... 阅读详情

思路来源

https://ac.nowcoder.com/acm/contest/view-submission?submissionId=37515332

代码1

#include<cstdio>
#include<cstring>
 
using namespace std;
typedef long long ll;
const int maxn=200020, maxsz=800020;
 //yh为lazy标记
//sum为节点区间和,其实没必要维护,每次都要统计sigma(cs[i]<<i)的话会退化,查询的时候现加即可
//cs[i]代表该节点所代表[l,r]区间中,第i位为1的个数。
struct pj{ll yh, sum, cs[20];} tr[maxsz];
ll a[maxn], ans;
 
void updata(int x) {
    for (int i=0; i<20; ++i)
        tr[x].cs[i]=tr[x<<1].cs[i]+tr[x<<1|1].cs[i];
}
 
void get_new(int x, int l, int r, int z) {
//要或的z的右起第i位为1
    for (int i=0; i<20; ++i)
        if(z>>i&1) tr[x].cs[i]=(r-l+1);
}
 
void push_down(int x, int l, int r) {
    if(!tr[x].yh) return;
    int mid=(l+r)>>1;
    get_new(x<<1, l, mid, tr[x].yh);
    get_new(x<<1|1, mid+1, r, tr[x].yh);
//下放lazy标记,同时该节点标记清零
    tr[x<<1].yh|=tr[x].yh; tr[x<<1|1].yh|=tr[x].yh;
    tr[x].yh=0;
}
 
void build(int x, int l, int r) {
    if(l==r) {
        for (int i=0; i<20; ++i)
            tr[x].cs[i]=a[l]>>i&1;
        return;
    }
    int mid=(l+r)>>1;
    build(x<<1, l, mid); build(x<<1|1, mid+1, r);
    updata(x);//即pushup操作
}
 
void change(int x, int l, int r, int l0, int r0, int z) {
    if(l0<=l&&r<=r0)//[l,r]完全包含在要更新的[l0,r0]区间内,没有必要下溯了 
    {
        get_new(x, l, r, z);
        tr[x].yh|=z;
        return;
    }
    //[l,r]与[l0,r0]相交,势必用到[l,r]内的值,未更新的[l,r]不能用所以要下推
    push_down(x, l, r);
    int mid=(l+r)>>1;
    //若l0<=mid,即[l,mid]包含l0;同理若r0>mid,即[mid+1,r]包含r0;
    //这说明在子区间里有需要更新的相交段
    //由于[l,r]初始是[1,n]所以根本不会进一个与[l0,r0]完全不相交的区间
    if(l0<=mid) change(x<<1, l, mid, l0, r0, z);
    if(r0>mid) change(x<<1|1, mid+1, r, l0, r0, z);
    updata(x);
}

//同上,很好理解了QAQ
void get_ans(int x, int l, int r, int l0, int r0) {
    if(l0<=l&&r<=r0) {
        for (int i=0; i<20; ++i) ans+=(tr[x].cs[i]<<i);
        return;
    }
    push_down(x, l, r);
    int mid=(l+r)>>1;
    if(l0<=mid) get_ans(x<<1, l, mid, l0, r0);
    if(r0>mid) get_ans(x<<1|1, mid+1, r, l0, r0);
}
 
int main() {
    int n, m; scanf("%d%d", &n, &m);
    for (int i=1; i<=n; ++i) scanf("%lld", a+i);
    build(1, 1, n); ll z; char s[100];
    for (int ty, x, y; m--; ) {
        scanf("%s%d%d", s, &x, &y);
        if(s[0]=='S') {
            ans=0;
            get_ans(1, 1, n, x, y);
            printf("%lld\n", ans);
        } else {
            scanf("%lld", &z);
            change(1, 1, n, x, y, z);
        }
    }
    return 0;
}

代码2

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
ll ans;
int n,m,a[maxn];
int l,r,v;
ll dat[5*maxn][20],cov[5*maxn][20];
char s[10];
void pushup(int p,int i)
{
    dat[p][i]=dat[p<<1][i]+dat[p<<1|1][i];
}
void build(int p,int l,int r,int i)
{
    cov[p][i]=0;
    if(l==r)
    {
        dat[p][i]=(a[l]>>i)&1;
        return;
    }
    int mid=(l+r)/2;
    build(p<<1,l,mid,i);
    build(p<<1|1,mid+1,r,i);
    pushup(p,i);
}
void pushdown(int p,int l,int r,int i)
{
    if(cov[p][i])
    {
        int mid=(l+r)/2;
        dat[p<<1][i]=mid-l+1;
        dat[p<<1|1][i]=r-mid;
        cov[p<<1][i]=1;
        cov[p<<1|1][i]=1;
        cov[p][i]=0;
    }
}
void update(int p,int l,int r,int ql,int qr,int i)
{
    if(ql<=l&&r<=qr)
    {
        dat[p][i]=r-l+1;
        cov[p][i]=1;
        return;
    }
    pushdown(p,l,r,i);
    int mid=(l+r)/2;
    if(ql<=mid)update(p<<1,l,mid,ql,qr,i);
    if(qr>mid)update(p<<1|1,mid+1,r,ql,qr,i);
    pushup(p,i); 
}   
ll ask(int p,int l,int r,int ql,int qr,int i)
{
    if(ql<=l&&r<=qr)return dat[p][i];
    pushdown(p,l,r,i);
    ll res=0;
    int mid=(l+r)/2;
    if(ql<=mid)res+=ask(p<<1,l,mid,ql,qr,i);
    if(qr>mid)res+=ask(p<<1|1,mid+1,r,ql,qr,i);
    return res;
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;++i)
    scanf("%d",&a[i]);
    for(int i=0;i<20;++i)
    build(1,1,n,i);
    for(int i=1;i<=m;++i)
    {
        scanf("%s",s);
        if(s[0]=='S')
        {
            scanf("%d%d",&l,&r);
            ans=0;
            for(int i=0;i<20;++i)
            ans+=ask(1,1,n,l,r,i)*(1ll<<i);
            printf("%lld\n",ans);
        }
        else if(s[0]=='O')
        {
            scanf("%d%d%d",&l,&r,&v);
            for(int i=0;i<20;++i)
            if(v>>i&1)update(1,1,n,l,r,i);
        }
    }
    return 0;
}

心得

感谢高中生的代码.jpg

通俗易懂好评,以后要多总结线段树的板子,

平时要多练多总结,线段树板子背不下来没关系,

但是要懂得如何更新、如何打标记的精髓。

笔记都写在代码里了,回头多整理几道线段树的题吧。

感觉自己在线段树方面还是不熟练,

有的时候是更新一些值时,没有认识到其对区间的影响可以被抽象出来。

 

这题就是完成一个或操作,按二进制位存储,开二十棵线段树,

或者按代码,仍然按4*n建一棵树,开20位存,

和x进行或操作时,如果x在第i位上是1,就将第i位在[l,r]赋值为1,

具体操作就是把代表区间的那个节点的值赋为区间长度即r-l+1。

求和的时候按位求和即可。

 

lazy标记的时候,若该区间先或上x1,再或上x2,其等价于或上(x1|x2),

所以标记就不断的或就可以,下放的时候清零。

 

其实是自己记忆力太差背不下来代码

而且有过两天不见代码就改(要)不(重)动(学)板子的倾向

不然才不会写这么多辣鸡注释

2018年全国大学生电子设计竞赛安徽赛区特等奖“TI杯”获奖作品--灭火飞行器 2018年全国大学生电子设计竞赛安徽赛区特等奖“TI杯”获奖作品--灭火飞行器 2018年全国大学生电子设计竞赛安徽赛区特等奖“TI杯”获奖作品--灭火飞行器 2018年全国大学生电子设计竞赛安徽赛区特等奖“TI杯”获奖作品--灭火飞行器 立即下载

相关推荐

2018年广西大学生电子设计竞赛赛题PDF

2018年广西大学生电子设计竞赛赛题PDF 题A-电流信号检测装置等

“中国东信杯”广西大学第四届程序设计竞赛(同步赛)

“中国东信杯”广西大学第四届程序设计竞赛(同步赛)“中国东信杯”广西大学第四届程序设计竞赛(同步赛)“中国东信杯”广西大学第四届程序设计竞赛(同步赛)

艾 1191

2018年广西大学生电子设计大赛第一阶段比赛题目

2018年广西大学生电子竞赛初赛题目。一共有4道题目:填图推车(A 题)键控频率发生器(B 题)数控直流电流源(C 题) 自动循迹小车(D 题)远程幅频特性测试装置(H 题)

【牛客 - 283H】图论一顿套模板(思维转化,Dijkstra)

题干:   由于临近广西大学建校90周年校庆,西大开始了喜闻乐见的校园修缮工程! 然后问题出现了,西大内部有许许多多的道路,据统计有N栋楼和M条道路(单向),每条路都有“不整洁度”W,现在校方想知道从S楼到T楼的所有路径中,“不整洁度”乘积最小是多少。 由于答案可能很大,所以你需要将最后的答案对109+7取模。 输入描述:   第一行为四个整数N、M、S、T,意义如上。 第2至第...

xuanweiace的博客 822

2021年秋招面经分享·字节跳动【芯片工程师-系统架构】

前言 如果想参考本人背景情况的可见这篇概述 ============================ 正文开始 ============================== 【时间线】 7.29 字节一面 8.4 字节二面 8.11 字节三面 PS:红字表示我当时没答出来的问题,蓝字表示面试官的解答。 面经分享 一面·技术面【1小时5分钟】   面试官京腔重,聊high了所以没时间撕代码了,但是华为应该不会这样。 自我介绍; 介绍一下APB; APB中3个状态的跳转是怎么跳转的; AXI中va

qq_43132308的博客 5616

关于影响力最大化问题中贪心算法的一些理解

在影响力最大化问题中(Influence Maximization,以下简称IM),贪心算法是最早提出的一种解决方法,并且一直沿用至今。它基于IM问题所具有的单调性(Monotonicity)和子模性(Submodularity)使用一种Hill Climbing策略,不断使用Monte Carlo模拟来寻找在当前情况下的具有最大传播范围的节点,添加至种子集合,得到最终结果,算法伪代码如下所示: 这里算法1其实并没有使用MonteCarlo模拟,而只是使用了贪心的策略...

nianjuan1990的专栏 2852

广西大学东信杯第四届程序设计竞赛(同步赛)部分题解

广西大学东信杯第四届

m0_60283288的博客 2983

从零开始:如何用Python手绘波特图并分析电路稳定性

本文详细介绍了如何使用Python绘制波特图并分析电路稳定性,涵盖从基础理论到实际应用的完整流程。通过NumPy和Matplotlib实现频域分析,包括RC低通滤波器和RLC带通滤波器的案例,以及相位裕度计算等高级技巧,为电子工程师提供了一套高效的电路分析解决方案。

hhh00的博客 374

“东信杯”广西大学第一届程序设计竞赛(同步赛)F-出装方案(二分图最大匹配/状压dp/最大费用最大流)

题目 思路来源 https://ac.nowcoder.com/acm/contest/view-submission?submissionId=37522548(MCMF) https://ac.nowcoder.com/acm/contest/view-submission?submissionId=37514575(状压dp) 心得 本来就是一个二分图最大权匹配的KM板子题...

小衣同学的博客 1488

无人机航拍图像匹配——SIFT算法实践(含代码)

无人机航拍图像匹配——SIFT算法实践(含代码)

zhangzhao147的博客 6395

Qt UI界面美化教程1:【“飞扬青云” Qt精美控件】使用教程1

相信很多小伙伴在使用Qt Widget的过程中都会遇到一个问题,开发出来的界面,丑!丑!丑!当然Qt做界面美化可以用到QSS,需要对前端知识有一定了解,后续本套教程将会做讲解。本篇文章,我们直接站在巨人(大佬飞扬青云)的肩膀上,使用他开发好的163款自定义控件,请大家一定支持他,去给他小心心,他的个人主页:本篇文章只讲述如何在 QtDesigner 安装这些控件。

2401_87556704的博客 1421

2024年第七届GXCPC广西大学生程序设计大赛(正式赛)题解

2024年第七届GXCPC广西大学生程序设计大赛(正式赛)题解

奇妙方程式的博客 4248

人体检测技术之TOF

智能人脸/视频锁领域的人体检测需求是要求远距离达到1m左右即可,一旦在此距离内检测人,则锁唤醒进行人脸识别,视频录制等操作。所以,人体检测技术非常关键。选型主要是几个维度:1.支持检测的距离范围,能否准确输出距离信息2.支持检测FOV3.场景适应性如何,如人体衣服颜色4.环境适应性如何,夏天高温环境下的测距是否准确5.批量一致性情况。

AIoT深度探索者 | 嵌入式系统架构师 深耕物联网(IoT)与人工智能(AI)融合技术,聚焦​​边缘计算、图像开发、低功耗通信协议​​,致力于智能硬件,关注我获取最新技术文章信息与海量资源~ 2349

“东信杯”广西大学第一届程序设计竞赛 J 【RMQ】

题目链接:传送门    题意:题意很简单,两种操作,一:区间每一个数或上x,二:求区间每个数或上x的总和。 (或   ' | ') 做法:最开始我想的就是单点更新,果断队友T了,然后队友用位来储存数字,然后延迟标记区间更新就过了,虽然找了很久bug。   ///#include&lt;bits/stdc++.h&gt; ///#include&lt;unordered_map&gt; ...

qq_42211531的博客 576

yolov8x-p2 实现 tensorrt 推理

yolov8x-p2, tensorrt 实现.

J。 2274

【agent实操】OpenClaw玩转股票分析多个AI智能体(agent)出谋划策

本文介绍了一个基于OpenClaw的多Agent股票分析系统。该系统采用"三人组+总调度"模式,包含三个核心Agent:小牛马(策略中枢)、牛老二(基本面分析师)和牛老三(技术面分析师)。相比单Agent模式,该系统具有分析更专业、权限分级更安全、成本控制更优等优势。文章详细说明了系统部署的6个步骤,包括创建独立Agent工作区、配置专属人设与技能等,并提供了环境检查命令和验证方法。通过这种多Agent协作的方式,可以实现更专业、更安全的股票分析。

海兰 809

“东信杯”广西大学第一届程序设计竞赛(同步赛)D 数论只会GCD

题目链接:https://ac.nowcoder.com/acm/contest/283/D   题解:我们先假设A&gt;B,首先第一步:判断 B|A(A能整除B),假设成立,直接输出答案,否则,我们计算item=A/B,假设item&gt;1,直接输出答案,为什么呢?因为item&gt;1,故先手的在下一轮可以随意选择要先手还是不先手,那么假如下一轮是先手win或后手win,此时我就可以按...

Jiandong 982

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

配钥匙 “东信杯”广西大学第一届程序设计竞赛(同步赛)

链接:https://ac.nowcoder.com/acm/contest/283/G 来源:牛客网 题解:关键在能多配,其实也没啥,把所有情况都列出来,求最小值就ok,一道水题,我是来混分的qwq. 代码: #include <iostream> #include <bits/stdc++.h> using name...

difubin1811的博客 435

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

“中国东信杯”广西大学第六届程序设计竞赛 B:炒房(简单版本)

在星海广场环绕𝑛(1≤𝑛≤10)个投资价值为1−10的房子, Alice和Bob轮流收购1。第二行包含𝑛个1−10的数字,表示每套房子的投资价值,数字之间空格分割。输出一行两个数字分别表示Alice和Bob的答案,使用空格分割。套房子首轮Alice可以任取一套房子拆环, 此后两人只能购买这条链两端的房子。两人希望自身购买的房子投资价值和尽量大, 且都选择对自己最有利的方案。以下为题解,提供参考 ,欢迎提供其他思路。求最终Alice,Bob最终获得的房地产投资价值总和。第一行一个𝑛表示房子的数量。

c__H__的博客 679

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

2023年第六届GXCPC广西大学生程序设计竞赛(热身赛)题解

2023年第六届GXCPC广西大学生程序设计竞赛(热身赛)题解

奇妙方程式的博客 1209

2025年第八届GXCPC广西大学生程序设计大赛(正式赛)题解

2025年第八届GXCPC广西大学生程序设计大赛(正式赛)题解

奇妙方程式的博客 1794

中国东信杯”广西大学第三届程序设计竞赛

A++++++++++++++++++ 链接:https://ac.nowcoder.com/acm/contest/12263/A 来源:牛客网 题目描述 有一天,小西的好朋友Antinomy来到西大参观,发现校园里有两副巨大的画,一幅的标题是《创新》,一幅的标题是《创业》,但都是空白的。 于是Antinomy问小西:“这两幅画应该是画的什么呀?” 小西:“里面是正在从事创新或者创业的同学。” Antinomy:“什么是创新?” 小西:“从事高水平科研技术研究和参加高水平学科竞赛,简单来说就是学术活动和技

qq_45772483的博客 1085

【牛客 - 283C】模拟只会猜题意(简单模拟)

题干:   小西突然觉得回文串是一种非常优雅的东西,她突然想要把身边所有的字符串都变成回文! 所谓回文串就是一个倒置后仍与自身相等的字符串,如“gxuacmmcauxg”和“gxuacmcauxg”。   小西不喜欢单身狗,所以小西只会处理长度为偶数的字符串。 小西也不喜欢肥宅,所以小西处理的字符串只有小写英文字母。 但是小西是个肥宅,不怎么喜欢活动,所以小西对于每个字母只会将其变为与...

xuanweiace的博客 826

【牛客 - 283F】出装方案(最小费用最大流)

题干:   众所周知,在各种对抗类游戏里装备都是很重要的一环,不同的出装方案会给玩家带来不同的强度。 dalao手里有N件装备,现在dalao要把装备分给N个队友,每个队友只能分一件装备,而每个队友穿上不同的装备会有不同程度的强度提升。 现在给出每个队友对每件装备的强度提升的值,请问dalao的所有分配方案里,最多能让团队的总强度提升多少呢? 输入描述:   第一行有一个整数T,表...

xuanweiace的博客 526

广西大学第一届“东信杯”校赛——肥宅の简单对决(现学现卖系列文章)

广西大学第一届“东信杯”校赛——肥宅の简单对决(现学现卖系列文章) Description 肥宅A和肥宅B在比谁更肥宅,现在他们面前有 n 瓶肥宅快乐水,两人轮流喝肥宅快乐水,肥宅A先喝,规定两人每次只能喝 [1, m] 瓶肥宅快乐水,最后能喝光肥宅快乐水的人胜利。 肥宅为了证明自己都非常聪明,他们会每次都会采取对自己而言最优的策略。 现在请问肥宅A是否能胜利? Input 第一行为一个整数T表示数据组数。 之后T组数据,每组数据为一行两个以空格分隔的整数表示 n 和 m 。 100≤T≤200,1≤n,m

weixin_51550966的博客 378

线段树位运算区间更新(牛客东信杯j题)

思路:其实就是区间更新的时候,不是加减数了,而是用或运算,具体看代码 #include <iostream> #include <algorithm> #include <cstring> #include <cstdio> using namespace std; typedef long long LL; const int maxn = 2...

摆渡人的博客 564
上一篇: “东信杯”广西大学第一届程序设计竞赛(同步赛)F-出装方案(二分图最大匹配/状压dp/最大费用最大流)
下一篇: 2018 Benelux Algorithm Programming Contest (BAPC 18) G-Game Night(滚动)
小衣同学
博客等级 码龄9年 1444粉丝 995原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小衣同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值