【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 题意 给定一个折线图,对于每一条 ...
随机推荐
- mysql数据库中如何查询日期在两个时间之间的关系
select * from banner where addDate between '2017-06-04' and '2017-06-06';
- centos6.5(64位)离线安装scalr
1.下载scalr-server安装备包: 下载地址:http://pan.baidu.com/s/1eSA3dom scalr-server-5.1.0.oss-nightly.2015013004 ...
- DataFrame按行读取:DataFrame之values
http://blog.csdn.net/u014607457/article/details/51290582 def fill_core(self): RatingTable=pd.read_cs ...
- scrapy windows 安装
windows 7 系统下参照官网安装总是会提示出错,现在整理一下安装的流程 1.安装 python 2.7,添加环境变量 C:\Python27\;C:\Python27\Scripts\; 在 C ...
- 201709012工作日记--activity与service的通信机制
service生命周期 Service主要包含本地类和远程类. Service不是Thread,Service 是android的一种机制,当它运行的时候如果是Local Service,那么对应的 ...
- button设置边宽和圆角
UIButton *meifuButton = [UIButton buttonWithType:UIButtonTypeSystem]; [meifuButton setTit ...
- windows下C++实现遍历本地文件
1.假设本地 d:/ 下存放着0.txt,1.txt两个文件 2.开发工具VS,开发语言C++,怎么遍历得到两个文件呢? 废话不多,具体代码请看下面: /** * 入参:文件存放文件夹路径,例如D:\ ...
- Spark RDD详解
1.RDD是什么 RDD(Resilient Distributed Dataset):是Spark的核心数据结构,指的是一个只读的.可分区的分布式数据集,这个数据集的全部或部分可以缓存在内存中,在多 ...
- 作为CTO如何做技术升级
升级技术架构,先要革新观念,最后才是技术问题 升级技术架构,不仅仅是技术升级 说到升级架构,大家第一个都会想到,是不是对技术升级一下就可以了? 我认为不是,技术架构升级要求的是整个公司的升级. 技术架 ...
- DagScheduler 和 TaskScheduler
DagScheduler 和 TaskScheduler 的任务交接 spark 调度器分为两个部分, 一个是 DagScheduler, 一个是 TaskScheduler, DagSchedule ...