题目

【题目描述】

君君是中山大学的四年级学生。有一天在家不小心开启了放置在爸爸书房中的一本古书。于是,君君把放在书中最上面的一张牌拿出来观摩了一下,突然掀起一阵大风把书中的其她所有牌吹散到各地。这时一只看上去四不像的可爱生物「封印之兽」可鲁贝洛斯从书中钻了出来,它告诉君君书中的牌叫「库洛牌」,现在散落各地已实体化,要君君将它们全部再次封印起来,以免危害世界,于是君君开始过上了收服「库洛牌」的旅程。

经过不懈努力,君君集齐了 $N$ 张库洛牌,最后的审判就要来临,为了战胜审判者月,君君开始研究起这 $N$ 张库洛牌的魔法效果。君君已经将 $N$ 张库洛牌从左到右依次排列好,这 $N$ 张库洛牌的魔法值从左到右依次为 $a_1, a_2, a_3,…,a_N$ 。她将告诉你这 $N$ 张库洛牌的魔法值。在最后的审判时,审判者月将会选择一个区间进行 PK,君君预测了可能进行 PK 的若干区间,她想请你帮助她计算这些区间的魔法效果,以便她更好地布置战术。一个区间内,所有连续子序列都会产生魔法效果。一个连续子序列 $p_1, p_2, p_3,…,p_k$ 的魔法效果定义为 $p_1⊕p_2⊕p_3⊕…⊕p_k$ ($⊕$ 表示异或)。一个区间的魔法效果定义为所有连续子序列的魔法效果的和。例如有 $5$ 张库洛牌,魔法值为 $1, 1, 2, 4, 5$,询问区间 $[2, 4]$ 的魔法效果。区间 $[2, 4]$ 包含的连续子序列为 $\{1\}, \{2\},\{4\}, \{1,2\}, \{2,4\}, \{1,2,4\}$, 它们的魔法值分别为 $1,2,4,3,6,7$,所以区间 $[2,4]$ 的魔法效果为 $1 + 2 + 4 + 3 + 6 + 7 = 23$。

库洛牌的魔法效果狂拽炫酷吊炸天,这个值可能很大,所以你只需要输出这个值模 $100000007$。另外,任性的君君可以在询问的过程中对库洛牌的魔法值进行修改。

现在,君君给出了 $M$ 个操作,操作格式如下:

1. `M p x` 表示将第 $p$ 张库洛牌的魔法值修改为 $x$。

2. `Q l r` 表示询问区间 $[l,r]$ 的魔法效果。

Pascal 语言中,异或操作符为 xor,C++ 语言中,异或操作符为^。

【输入格式】

第一行为一个整数 $N$,表示有 $N$ 张库洛牌。

第二行为 $N$ 个整数,表示一开始 $N$ 张库洛牌的值。

第三行为一个整数 $M$,表示有 $M$ 个操作。

接下来 $M$ 行,每行表示一个操作,格式如题目描述所示。

【输出格式】

对于每个操作 $2$,输出一行,每行一个数,表示询问的区间 $[l,r]$ 的魔法效果模 $100000007$。

【样例输入】

5
1 2 3 4 5
7
Q 1 3
M 2 7
Q 1 3
M 2 2
Q 1 3
M 4 2
Q 1 5

【样例输出】

10
26
10
47

【数据范围与提示】

$30\%$ 的数据,$N,M≤300$。

另外 $20\%$ 的数据,$N,M\le 30000$,操作 $1$ 的数量不超过 $50$。

$80\%$ 的数据,$N,M≤30000$。

$100\%$ 的数据,$N≤100000,M≤100000,0≤a_i,x≤1000$。

题解

看到 $ a_i \leq 1000 $,就感觉到有玄机

做前缀异或和 $ sum $,区间 $ [l_i,r_i] $ 的答案即为 $sum[r_i] \ xor \ sum[l_i-1] $,可以发现,每一位的异或值互不影响,并且第 $i$ 位要为 $ 1 $ 必须满足一个为 $ 0 $ 一个为 $ 1 $,所以这一段区间这个位贡献就是 区间内 $ 0 $ 的个数 $\times 1$ 的个数

维护区间信息,自然是线段树

开 $10$ 课线段树,模拟维护前缀异或和,存下每一位的 $ 0,1 $ 个数,直接查询即可

考虑维护,修改 $ x $ 为 $y$ 即为将 $ [x,n] \ xor \ (x_{las} \ xor \ y) $

然后忘记判断子节点的 $tag$ 调得心态爆炸

代码

 #include<bits/stdc++.h>
#define LL long long
#define _(d) while(d(isdigit(ch=getchar())))
using namespace std;
int R(){
int x;bool f=;char ch;_(!)if(ch=='-')f=;x=ch^;
_()x=(x<<)+(x<<)+(ch^);return f?x:-x;}
const int N=1e5+,P=1e8+;
int n,m,a[N],sum[N],tag[N<<];
char ch[];
struct seg{int num[][];}tr[N<<];
#define Ls rt<<1
#define Rs rt<<1|1
seg make(seg a,seg b){
seg c;
for(int i=;i<=;i++){
c.num[][i]=a.num[][i]+b.num[][i];
c.num[][i]=a.num[][i]+b.num[][i];
}
return c;
}
void build(int rt,int l,int r){
if(l==r){
for(int i=;i<=;i++)
tr[rt].num[(sum[l]>>i)&][i]=;
return;}
int mid=(l+r)>>;
build(Ls,l,mid),build(Rs,mid+,r);
tr[rt]=make(tr[Ls],tr[Rs]);
return;
}
void push(int rt){
int x=tag[rt];tag[rt]=;
for(int i=;i<=;i++)
if((x>>i)&)
swap(tr[rt].num[][i],tr[rt].num[][i]);
tag[Ls]^=x,tag[Rs]^=x;
return;
}
seg query(int rt,int l,int r,int ql,int qr){
if(tag[rt])push(rt);
if(ql<=l&&qr>=r)return tr[rt];
int mid=(l+r)>>;
if(mid>=qr)return query(Ls,l,mid,ql,qr);
if(mid<ql)return query(Rs,mid+,r,ql,qr);
return make(query(Ls,l,mid,ql,qr),query(Rs,mid+,r,ql,qr));
}
LL get(seg a){
LL res=;
for(int i=;i<=;i++)
res=(LL)(res+(1ll<<i)*a.num[][i]*a.num[][i]%P)%P;
return res;
}
void update(int rt,int l,int r,int k,int x){
if(k<=l){
tag[rt]^=x,push(rt);
return;}
int mid=(l+r)>>;
if(tag[Ls])push(Ls);
if(tag[Rs])push(Rs);
if(k<=mid)update(Ls,l,mid,k,x);
update(Rs,mid+,r,k,x);
tr[rt]=make(tr[Ls],tr[Rs]);
return;
}
int main(){
n=R();
for(int i=;i<=n;i++)
a[i]=R(),sum[i]=sum[i-]^a[i];
build(,,n);
m=R();
for(int i=,x,y;i<=m;i++){
scanf("%s",ch+),x=R(),y=R();
if(ch[]=='Q')printf("%lld\n",get(query(,,n,x-,y)));
else
update(,,n,x,a[x]^y),a[x]=y;
}
return ;
}

魔卡少女(cardcaptor)——线段树的更多相关文章

  1. 【GDKOI2016】 魔卡少女 线段树

    题目大意:给你一个长度为n的序列${a_1....a_n}$,有$m$次操作 每次操作有两种情况:修改$a_i$的值,询问$[l,r]$中所有子区间的异或和. 数据范围:$n,m≤10^5$,$a_i ...

  2. 【BZOJ4399】魔法少女LJJ 线段树合并

    [BZOJ4399]魔法少女LJJ Description 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了LJJ感叹道“这里真是个迷人的 ...

  3. BZOJ4399魔法少女LJJ——线段树合并+并查集

    题目描述 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了LJJ感叹道“这里真是个迷人的绿色世界,空气清新.淡雅,到处散发着醉人的奶浆味: ...

  4. 魔法少女 LJJ——线段树

    题目 [题目描述] 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女 LJJ 已经觉得自己见过世界上的所有稀奇古怪的事情了. LJJ 感叹道“这里真是个迷人的绿色世界,空气清新.淡雅,到处 ...

  5. bzoj4399 魔法少女LJJ 线段树合并+线段树二分+并查集

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4399 题解 毒瘤题 \(9\) 种操作还有支持动态图的连通性 仔细读题 $ c<=7$. ...

  6. BZOJ.4399.魔法少女LJJ(线段树合并)

    BZOJ 注意\(c\leq7\)→_→ 然后就是裸的权值线段树+线段树合并了. 对于取\(\max/\min\)操作可以直接区间修改清空超出范围的值,然后更新到对应位置上就行了(比如对\(v\)取\ ...

  7. bzoj4399 魔法少女LJJ 线段树合并

    只看题面绝对做不出系列.... 注意到\(c \leqslant 7\),因此不会有删边操作(那样例删边干嘛) 注意到\(2, 5\)操作十分的有趣,启示我们拿线段树合并来做 操作\(7\)很好处理 ...

  8. BZOJ 4399: 魔法少女LJJ(线段树)

    传送门 解题思路 出题人真会玩..操作\(2\)线段树合并,然后每棵线段树维护元素个数和.对于\(6\)这个询问,因为乘积太大,所以要用对数.时间复杂度\(O(nlogn)\) 代码 #include ...

  9. 【JZOJ4359】【GDKOI2016】魔卡少女

    题目描述 君君是中山大学的四年级学生.有一天在家不小心开启了放置在爸爸书房中的一本古书.于是,君君把放在书中最上面的一张牌拿出来观摩了一下,突然掀起一阵大风把书中的其她所有牌吹散到各地.这时一只看上去 ...

随机推荐

  1. Using SMOTEBoost(过采样) and RUSBoost(使用聚类+集成学习) to deal with class imbalance

    Using SMOTEBoost and RUSBoost to deal with class imbalance from:https://aitopics.org/doc/news:1B9F7A ...

  2. Docker与LXC、虚拟化技术的区别——虚拟化技术本质上是在模拟硬件,Docker底层是LXC,本质都是cgroups是在直接操作硬件

    先说和虚拟化技术的区别: 难道虚拟技术就做不到吗? 不不不,虚拟技术也可以做到,但是会有一定程度的性能损失,灵活度也会下降.容器技术不是模仿硬件层次,而是 在Linux内核里使用cgroup和name ...

  3. .dhpcd导致cpu飙升问题

    因公司有业务服务器在阿里云上面,阿里云后台报警说,“有恶意程序在挖矿”,引起了高度重视,于是我登陆服务器进行排查. 登陆云服务器:系统centos7.5 第一步使用top查看资源情况. top 可以清 ...

  4. gradle_学习_00_资源贴

    一.官方资料 1.Gradle User Guide 中文版 二.精选资料 1.Gradle学习系列之一——Gradle快速入门 2.Gradle教程

  5. Android之setContentView和LayoutInflater

    setContentView: 1.常用的构造函数: 1)setContentView(int layoutResID) 2)setContentView(View view) 3)setConten ...

  6. Maven发布项目丢失Mybatis Mapper包的映射问题

    由于一些eclipse版本问题,mybatis的mapper包中的sql文件没有被打进包,需要在pom中加入: <build> <!--配置打包时不过滤非java文件开始 --> ...

  7. 2017-2018-1 20179215《Linux内核原理与分析》第八周作业

    实验:ELF文件格式与程序的编译链接 一.可执行文件的创建  从源代码到可执行程序所要经历的过程概述:  源代码(.c .cpp .h)经过c预处理器(cpp)后生成.i文件,编译器(cc1.cc1p ...

  8. bzoj 4501: 旅行 01分数规划+概率期望dp

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=4501 题解: 首先我们不考虑可以删除边的情况下,如何计算期望边数. 然后我们发现这是个有 ...

  9. java多线程编程核心技术——第一章总结

    目录: 1.1进程.多线程的概念,及线程的优点 1.2多线程的使用 1.3currentThread()方法 1.4isAlive()方法 1.5sleep()方法 1.6getId()方法 1.7停 ...

  10. JavaScript-Tool:my97datepicker

    ylbtech-JavaScript-Tool:my97datepicker 1.返回顶部 1. 2.下载 https://files.cnblogs.com/files/storebook/java ...