【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 题意 给定一个折线图,对于每一条 ...
随机推荐
- 转录组差异表达分析工具Ballgown
Ballgown是分析转录组差异表达的R包. 软件安装: 运行R, source(“http://bioconductor.org/biocLite.R”) biocLite(“ballgown”) ...
- 2018.08.27 lucky(模拟)
描述 Ly 喜欢幸运数字,众所周知,幸运数字就是数字位上只有 4 和 7 的数字. 但是本题的幸运序列和幸运数字完全没关系,就是一个非常非常普通的序列. 哈哈,是 不是感觉被耍了,没错,你就是被耍了. ...
- 2018.07.18 HAOI2009 逆序对数列(线性dp)
传送门 目前只会n2" role="presentation" style="position: relative;">n2n2的dp" ...
- T4系列文章之2:T4工具简介、调试以及T4运行原理(转)
出处:http://www.cnblogs.com/damonlan/archive/2012/01/12/2320429.html 一.前言 经过第一篇,我想大家现在对T4有了基本的印象,应该对T4 ...
- jedis 链接池使用(转)
Jedis作为redis的最佳客户端,它提供了连接池的特性,“连接池”在通常情况下可以有效的提高应用的通信能力,并且这是一种良好的设计模式.Jedis的连接池设计基于apache commons-po ...
- IntellJ IDEA javax.servlet.ServletException 找不到javax.servlet.ServletException的类 java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
误状态:错误显示 解决: (1)说明缺少包---->添加如下包配置 <dependency> <groupId>javax.servlet.jsp</groupId ...
- pyhthon lambda
lambda x:x+1(1) >>>2 可以这样认为,lambda作为一个表达式,定义了一个匿名函数,上例的代码x为入口参数和出口参数,x+1为函数体,(1)为x的入口初始值, 用 ...
- hdu1171 Big Event in HDU(01背包) 2016-05-28 16:32 75人阅读 评论(0) 收藏
Big Event in HDU Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- fleet中service之间的依赖关系
最近有人在topcoder上提出使用fleet在集群上部署service时有时候会发现,当启动依赖于整个集群服务的service时,只会检查那个service所在机器的依赖关系,这样就会造成一些问题, ...
- QTP之回放模式(ReplayType)
QTP的回放模式有两种,如下所示: 1. Event模式 -- 事件跟踪 2. Mouse模式 -- 鼠标跟踪 Event模式就是我们平时默认用的模式,也就是事件,其实QTP的click方 ...