题意:

给定一个序列,给定两种操作:

  1. 将一个区间异或上一个给定的值。

  2. 给定 \(l,r\) 求

\[{\large (\sum_{i=l}^r\bigcup_{j=l}^i A_j) \bmod 2^{30}}
\]

\(0\le a_i,x< 2^{30}\),\(1\le l\le r\le n\)

思路

  • 由于操作数以及区间过大,一位一位地去模拟肯定是不行的。因此考虑去离线下来拆位,对于每一个操作的每一位单独维护贡献。

  • 由于是前缀或,因此对于每一位而言,只要有一个数在这一位上是1,那后面的所有值也一定都是1。

    因此问题就转化成了维护区间第一个1所在的位置,答案就是这个位置与右端点的距离。

  • 考虑如何去维护这个东西。显然去查找不可能直接找,需要去二分。但同时还要维护操作1,因此考虑用线段树去维护。

    那怎么在线段树上查找呢?考虑维护节点所代表的区间是不是全为零,如果全为零的话就向右儿子搜,否则向左儿子搜。

    但由于异或操作,还可以维护一个是否全是1方便修改。需要修改的时候将两个标记交换就可以了。

code

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int p=1073741824;
const int N=2e5+7;
int n,m,a[N],loc;bool s1[N<<2],s2[N<<2],b[N],sign,tag[N<<2];
struct ques
{
int opt,l,r,x;long long ans=0;
}q[N];
#define ls (u<<1)
#define rs ((u<<1)|1)
void push_up(int u)
{
s1[u]=s1[ls]|s1[rs];s2[u]=s2[ls]|s2[rs];
}
void push_down(int u)
{
if(!tag[u]) return;
swap(s1[ls],s2[ls]),swap(s1[rs],s2[rs]);
tag[ls]^=1,tag[rs]^=1;
tag[u]=0;
}
void build(int u,int l,int r)
{
tag[u]=0;if(l==r){s1[u]=b[l],s2[u]=b[l]^1;return;}
int mid=(l+r)>>1;build(ls,l,mid);build(rs,mid+1,r);
push_up(u);
}
void modify(int u,int l,int r,int ql,int qr)
{
if(l>=ql&&r<=qr) {swap(s1[u],s2[u]),tag[u]^=1;return;}
int mid=(l+r)>>1;push_down(u);
if(mid>=ql) modify(ls,l,mid,ql,qr);if(mid<qr) modify(rs,mid+1,r,ql,qr);
push_up(u);
}
void query(int u,int l,int r,int ql,int qr)
{
if((!s1[u])||sign||r<ql||l>qr) return;
if(l==r) {if(s1[u]&&l<loc&&l>=ql)loc=l,sign=1;return;}
int mid=(l+r)>>1;push_down(u);
if(mid>=ql) query(ls,l,mid,ql,qr);
if(sign) return;
if(mid<qr) query(rs,mid+1,r,ql,qr);
}
int main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=m;i++) {cin>>q[i].opt>>q[i].l>>q[i].r;if(q[i].opt==1) cin>>q[i].x;}
for(int k=0;k<=30;k++)
{
for(int i=1;i<=n;i++) b[i]=(a[i]>>k)&1;build(1,1,n);
for(int i=1;i<=m;i++)
{
if(q[i].opt==1) {if(((q[i].x>>k)&1)==1) modify(1,1,n,q[i].l,q[i].r);}
else
{
sign=0;loc=q[i].r+1;query(1,1,n,q[i].l,q[i].r);
q[i].ans=(q[i].ans+1ll*(q[i].r-loc+1ll)*(1ll<<k)%p)%p;
}
}
}
for(int i=1;i<=m;i++) if(q[i].opt==2) cout<<q[i].ans<<'\n';
return 0;
}

P11071 「QMSOI R1」 Distorted Fate题解的更多相关文章

  1. LuoguP7127 「RdOI R1」一次函数(function) 题解

    Content 设 \(S_k\) 为直线 \(f(x)=kx+k-1\),直线 \(f(x)=(k+1)x+k\) 与 \(x\) 轴围成的三角形的面积.现在给出 \(t\) 组询问,每组询问给定一 ...

  2. 「POI2011 R1」Conspiracy

    「POI2011 R1」Conspiracy 解题思路 : 问题转化为,将点集分成两部分,其中一部分恰好组成一个团,其中另一部分恰好组成一个独立集. 观察发现,如果求出了一个解,那么答案最多可以在这个 ...

  3. LOJ #2541. 「PKUWC 2018」猎人杀(容斥 , 期望dp , NTT优化)

    题意 LOJ #2541. 「PKUWC 2018」猎人杀 题解 一道及其巧妙的题 , 参考了一下这位大佬的博客 ... 令 \(\displaystyle A = \sum_{i=1}^{n} w_ ...

  4. LOJ #2540. 「PKUWC 2018」随机算法(概率dp)

    题意 LOJ #2540. 「PKUWC 2018」随机算法 题解 朴素的就是 \(O(n3^n)\) dp 写了一下有 \(50pts\) ... 大概就是每个点有三个状态 , 考虑了但不在独立集中 ...

  5. 「GXOI / GZOI2019」简要题解

    「GXOI / GZOI2019」简要题解 LOJ#3083. 「GXOI / GZOI2019」与或和 https://loj.ac/problem/3083 题意:求一个矩阵的所有子矩阵的与和 和 ...

  6. 【题解】#6622. 「THUPC 2019」找树 / findtree(Matrix Tree+FWT)

    [题解]#6622. 「THUPC 2019」找树 / findtree(Matrix Tree+FWT) 之前做这道题不理解,有一点走火入魔了,甚至想要一本近世代数来看,然后通过人类智慧思考后发现, ...

  7. 「POJ 3666」Making the Grade 题解(两种做法)

    0前言 感谢yxy童鞋的dp及暴力做法! 1 算法标签 优先队列.dp动态规划+滚动数组优化 2 题目难度 提高/提高+ CF rating:2300 3 题面 「POJ 3666」Making th ...

  8. [LOJ 2022]「AHOI / HNOI2017」队长快跑

    [LOJ 2022]「AHOI / HNOI2017」队长快跑 链接 链接 题解 不难看出,除了影响到起点和终点的射线以外,射线的角度没有意义,因为如果一定要从该射线的射出一侧过去,必然会撞到射线 因 ...

  9. Note -「动态 DP」学习笔记

    目录 「CF 750E」New Year and Old Subsequence 「洛谷 P4719」「模板」"动态 DP" & 动态树分治 「洛谷 P6021」洪水 「S ...

  10. LOJ #2542. 「PKUWC 2018」随机游走(最值反演 + 树上期望dp + FMT)

    写在这道题前面 : 网上的一些题解都不讲那个系数是怎么推得真的不良心 TAT (不是每个人都有那么厉害啊 , 我好菜啊) 而且 LOJ 过的代码千篇一律 ... 那个系数根本看不出来是什么啊 TAT ...

随机推荐

  1. C# 心跳检测实现

    原文链接: https://blog.csdn.net/yupu56/article/details/72356700 TCP网络长连接 手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以 ...

  2. led色块是什么,bin指值是什么

    色块其实就是色温的区域范围. LED的色温按标准是分段的, 既然是分段,就有一个最大值和最小值,在色坐标系中是一个,X和Y的坐标对应的也就有一个最大值和最小值,这样一个色温段就是以小块的区域,即所谓的 ...

  3. Qt QFileSystemModel 的使用

    Model 指的是数据 View 指的是界面,View不用设置,只需要和Model进行绑定,绑定完成之后就是Model的格式了 例子:本例子中QListView QTableView QTreeVie ...

  4. 《uTools:提升效率的神奇工具》

    utools5.0 一.引言 在如今快节奏的工作和生活中,我们都在寻找能够帮助我们节省时间.提高效率的工具.uTools 就是这样一款令人惊艳的工具,它为我的日常带来了极大的便利. 相关链接:uToo ...

  5. (附体验地址)大模型知识引擎:AI 助手能否助力销售技能提升?

    体验地址:https://lke.cloud.tencent.com/webim_exp/#/chat/FAIMcM 腾讯云的大模型知识引擎本身定位于为企业客户及合作伙伴提供服务,因此我在探索如何最佳 ...

  6. Laravel11 从0开发 Swoole-Reverb 扩展包(三) - reverb广播驱动使用流程

    前情提要 我们第一节的时候,已经大致介绍reverb,他 是 Laravel 应用程序的第一方 WebSocket 服务器,可将客户端和服务器之间的实时通信直接带到您的指尖.开源且只需一个 Artis ...

  7. WEBGL 笔记

    目录 前言 h2 { text-align: center } 前言 WebGL 是一个在浏览器里使用的高效渲染二维和三维图形的 javascript API,于 2006 年起源,该技术基于 Ope ...

  8. [每日算法 - 华为机试] 剑指 Offer 57 - II. 和为s的连续正数序列 「滑动窗口」

    入口 力扣https://leetcode.cn/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/ 题目描述 输入一个正整数 target ,输出所 ...

  9. 【长知识】BIOS

    设置最新UEFI BIOS 本章导读 BIOS是电脑启动和操作的基础,若电脑系统中没有BIOS,则所有硬件设备都不能正常使用.UEFI是目前最新的BIOS类型,以后会逐渐取代传统的BIOS.本章将认识 ...

  10. 【Git】国内的项目托管网站-码云

    国内的项目托管网站-码云 1 简介 使用 GitHub 作为项目托管网站如果网速不好很影响效率,大家也可以使用国内的项目托管网站-码云.网址是 https://gitee.com/ ,使用方式跟 Gi ...