【GDKOI2016】 魔卡少女 线段树
题目大意:给你一个长度为n的序列${a_1....a_n}$,有$m$次操作
每次操作有两种情况:修改$a_i$的值,询问$[l,r]$中所有子区间的异或和。
数据范围:$n,m≤10^5$,$a_i≤1000$。
对于序列$a$,我们对每一个二进制位开一个线段树,对于每个节点,我们存储六个值:
$sum$:该区间内所有位的异或和。
$ans$:该区间内所有子区间异或和为1的数量。
$l_0$:该区间内以区间左端点为起点的所有区间中,异或和为0的区间数量。
$l_1$:该区间内以区间左端点为起点的所有区间中,异或和为1的区间数量。
$r_0$:该区间内以区间右端点为起点的所有区间中,异或和为0的区间数量。
$r_1$:该区间内以区间右端点为起点的所有区间中,异或和为1的区间数量。
关于pushup的过程,可以参考代码。
然后随便搞一搞就没了。
#include<bits/stdc++.h>
#define M 400005
#define L long long
#define MOD 100000007
using namespace std; struct node{
int l[],r[];L sum,ans;
node(){l[]=l[]=r[]=r[]=sum=ans=;}
node(int x){
l[]=r[]=sum=ans=x;
l[]=r[]=x^;
}
friend node operator +(node a,node b){
node c;
c.sum=a.sum^b.sum;
c.l[]=a.l[]+b.l[a.sum];
c.l[]=a.l[]+b.l[a.sum^];
c.r[]=a.r[b.sum]+b.r[];
c.r[]=a.r[b.sum^]+b.r[];
c.ans=a.ans+b.ans+1LL*a.r[]*b.l[]+1LL*a.r[]*b.l[];
return c;
}
};
struct seg{
node a[M];
void updata(int x,int lc,int rc,int k,int op){
if(lc==rc) return void(a[x]=node(op));
int mid=(lc+rc)>>;
if(k<=mid) updata(x<<,lc,mid,k,op);
else updata(x<<|,mid+,rc,k,op);
a[x]=a[x<<]+a[x<<|];
}
node query(int x,int lc,int rc,int ll,int rr){
if(ll<=lc&&rc<=rr) return a[x];
int mid=(lc+rc)>>;
node res;
if(ll<=mid) res=res+query(x<<,lc,mid,ll,rr);
if(mid<rr) res=res+query(x<<|,mid+,rc,ll,rr);
return res;
}
}p[];
int n,m;
int main(){
scanf("%d",&n);
for(int i=;i<=n;i++){
int x; scanf("%d",&x);
for(int j=;j<;j++)
p[j].updata(,,n,i,(x>>j)&);
}
scanf("%d",&m);
while(m--){
char op[]; int x,y;
scanf("%s%d%d",op,&x,&y);
if(op[]=='Q'){
L ans=;
for(int j=;j<;j++){
node res=p[j].query(,,n,x,y);
ans+=res.ans<<j;
}
printf("%lld\n",ans%MOD);
}else{
for(int j=;j<;j++)
p[j].updata(,,n,x,(y>>j)&);
}
}
}
【GDKOI2016】 魔卡少女 线段树的更多相关文章
- 魔卡少女(cardcaptor)——线段树
题目 [题目描述] 君君是中山大学的四年级学生.有一天在家不小心开启了放置在爸爸书房中的一本古书.于是,君君把放在书中最上面的一张牌拿出来观摩了一下,突然掀起一阵大风把书中的其她所有牌吹散到各地.这时 ...
- 【JZOJ4359】【GDKOI2016】魔卡少女
题目描述 君君是中山大学的四年级学生.有一天在家不小心开启了放置在爸爸书房中的一本古书.于是,君君把放在书中最上面的一张牌拿出来观摩了一下,突然掀起一阵大风把书中的其她所有牌吹散到各地.这时一只看上去 ...
- suoi37 清点更多船只 (卡空间线段树)
sbw巨佬的卡空间方法,把线段树的叶节点只记到长度为16的区间,然后在叶节点上暴力修改查询,这样点数是$\frac{N}{8}$的,可以过... orz #include<bits/stdc++ ...
- BZOJ.2212.[POI2011]Tree Rotations(线段树合并)
题目链接 \(Description\) 给定一棵n个叶子的二叉树,每个叶节点有权值(1<=ai<=n).可以任意的交换两棵子树.问最后顺序遍历树得到的叶子权值序列中,最少的逆序对数是多少 ...
- 【GDKOI2016Day1T1-魔卡少女】【拆位】线段树维护区间内所有连续子区间的异或和
题意:给出N个数,M个操作.操作有修改和询问两种,每次修改将一个数改成另一个数,每次询问一个区间的所有连续子区间的异或和.n,m<=100000,ai<=1000 题解: 当年(其实也就是 ...
- BZOJ4399 魔法少女LJJ【线段树合并】【并查集】
Description 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了 LJJ感叹道"这里真是个迷人的绿色世界,空气清新.淡雅 ...
- 【bzoj4399】魔法少女LJJ 并查集+权值线段树合并
题目描述 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了LJJ感叹道“这里真是个迷人的绿色世界,空气清新.淡雅,到处散发着醉人的奶浆味: ...
- 【BZOJ4399】魔法少女LJJ 线段树合并
[BZOJ4399]魔法少女LJJ Description 在森林中见过会动的树,在沙漠中见过会动的仙人掌过后,魔法少女LJJ已经觉得自己见过世界上的所有稀奇古怪的事情了LJJ感叹道“这里真是个迷人的 ...
- Codeforces Gym100543B 计算几何 凸包 线段树 二分/三分 卡常
原文链接https://www.cnblogs.com/zhouzhendong/p/CF-Gym100543B.html 题目传送门 - CF-Gym100543B 题意 给定一个折线图,对于每一条 ...
随机推荐
- 人类基因组三代组装: cano
git clone https://github.com/marbl/canu.git cd canu/src make -j <number of threads> 使用实例: canu ...
- C语言基础课第四次作业
1.实验代码 7-2 打印九九口诀表 (15 分) #include<stdio.h> #include<math.h> int main(void){ int a, ...
- RAC环境数据库重启实例
1.重启之前最好先看一下节点信息和运行状态 可以通过srvctl status database -d 数据库名 //查看节点信息 Crs_stat //查看节点状态 可以看到数据节点它由两个实例组成 ...
- Win7 SP1 提示ADO的问题
需要安装 Windows6.1-KB2640696-v3-x64.msu 这个Pack
- <%@ include file=""%>与<jsp:include page=""/>
https://www.cnblogs.com/sharpest/p/6117629.html
- HDU 2138 How many prime numbers (判素数,米勒拉宾算法)
题意:给定一个数,判断是不是素数. 析:由于数太多,并且太大了,所以以前的方法都不适合,要用米勒拉宾算法. 代码如下: #include <iostream> #include <c ...
- DUBBO配置规则详解
研究DUBBO也已经大半年了,对它的大部分源码进行了分析,以及对它的内部机制有了比较深入的了解,以及各个模块的实现.DUBBO包含很多内容,如果想了解DUBBO第一步就是启动它,从而可以很好的使用它, ...
- SoC FPGA JTAG电路设计 要点
JTAG协议制定了一种边界扫描的规范,边界扫描架构提供了有效的测试布局紧凑的PCB板上元件的能力.边界扫描可以在不使用物理测试探针的情况下测试引脚连接,并在器件正常工作的过程中捕获运行数据. SoC ...
- 取Mac地址
uses Nb30; //一般用默认的 0 就可以了 ):string; var ncb : TNCB; {NetBios控制块} AdapterS : TAdapterStatus; {网卡状态结构 ...
- Python学习-35.Python中的List Comprehensions(列表解释|列表生成式)
在某些情况下,我们需要对列表进行某些操作,例如对列表中的每一个元素都乘以2,这样一般来说就是遍历每个元素在乘以2.那么写下来就得两行了.而且这会修改原来的列表,如果要求不能修改原来的列表,又得多一行了 ...