题意:给出N个数,M个操作。操作有修改和询问两种,每次修改将一个数改成另一个数,每次询问一个区间的所有连续子区间的异或和。n,m<=100000,ai<=1000

题解:

当年(其实也就是今年)做不出来的题。。D1T1啊。。。

因为ai<=1000,我们可以拆位处理。拆成10个二进制位,每位开1棵线段树。

对于每个节点,维护:

d:这段区间的异或和

L[0],L[1]:子区间一定从左端点开始,异或和为0,1的子区间分别有多少个

R[0],R[1]:子区间一定从右端点开始,异或和为0,1的子区间分别有多少个

s[0],s[1]:异或和为0,1的子区间分别有多少个

然后重点就是合并啦。

 node upd(int ind,int tmp,node lc,node rc)
{
int dl=lc.d,dr=rc.d;
node x;
if(tmp!=) x=t[ind][tmp];
x.d=lc.d^rc.d;
x.L[]=(lc.L[]+rc.L[(dl==) ? :])%mod;
x.L[]=(lc.L[]+rc.L[(dl==) ? :])%mod;
x.R[]=(rc.R[]+lc.R[(dr==) ? :])%mod;
x.R[]=(rc.R[]+lc.R[(dr==) ? :])%mod;
x.s[]=(lc.s[]+rc.s[]+(lc.R[]*rc.L[])%mod+(lc.R[]*rc.L[])%mod)%mod;
x.s[]=(lc.s[]+rc.s[]+(lc.R[]*rc.L[])%mod+(lc.R[]*rc.L[])%mod)%mod;
return x;
}

我打成node形式。。因为最后查询的时候有多个区间也要合并。。

代码:

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std; typedef long long LL;
const int N=;
const LL mod=;
struct node{
int l,r,lc,rc,d;
LL L[],R[],s[];
//L:从左开始
//R:从右开始
//s:总答案
}t[][*N];
char c[];
int n,m,tl,a[N][];
LL bit[]; node upd(int ind,int tmp,node lc,node rc)
{
int dl=lc.d,dr=rc.d;
node x;
if(tmp!=) x=t[ind][tmp];
x.d=lc.d^rc.d;
x.L[]=(lc.L[]+rc.L[(dl==) ? :])%mod;
x.L[]=(lc.L[]+rc.L[(dl==) ? :])%mod;
x.R[]=(rc.R[]+lc.R[(dr==) ? :])%mod;
x.R[]=(rc.R[]+lc.R[(dr==) ? :])%mod;
x.s[]=(lc.s[]+rc.s[]+(lc.R[]*rc.L[])%mod+(lc.R[]*rc.L[])%mod)%mod;
x.s[]=(lc.s[]+rc.s[]+(lc.R[]*rc.L[])%mod+(lc.R[]*rc.L[])%mod)%mod;
return x;
} int bt(int ind,int l,int r)
{
int x=++tl;
t[ind][x].l=l;t[ind][x].r=r;
t[ind][x].lc=t[ind][x].rc=;
t[ind][x].d=;
memset(t[ind][x].L,,sizeof(t[ind][x].L));
memset(t[ind][x].R,,sizeof(t[ind][x].R));
memset(t[ind][x].s,,sizeof(t[ind][x].s));
if(l<r)
{
int mid=(l+r)/;
t[ind][x].lc=bt(ind,l,mid);
t[ind][x].rc=bt(ind,mid+,r);
int lc=t[ind][x].lc,rc=t[ind][x].rc;
t[ind][x]=upd(ind,x,t[ind][lc],t[ind][rc]);
}
else
{
int d=a[l][ind];
t[ind][x].d=d;
t[ind][x].L[d]=t[ind][x].R[d]=t[ind][x].s[d]=;
}
return x;
} void change(int ind,int x,int p,int d)
{
if(t[ind][x].l==t[ind][x].r)
{
t[ind][x].d=d;
t[ind][x].L[d]=t[ind][x].R[d]=t[ind][x].s[d]=;
t[ind][x].L[d^]=t[ind][x].R[d^]=t[ind][x].s[d^]=;
return ;
}
int lc=t[ind][x].lc,rc=t[ind][x].rc,mid=(t[ind][x].l+t[ind][x].r)/;
if(p<=mid) change(ind,lc,p,d);
else change(ind,rc,p,d);
t[ind][x]=upd(ind,x,t[ind][lc],t[ind][rc]);
} node query(int ind,int x,int l,int r)
{
if(t[ind][x].l==l && t[ind][x].r==r) return t[ind][x];
int lc=t[ind][x].lc,rc=t[ind][x].rc,mid=(t[ind][x].l+t[ind][x].r)/;
if(r<=mid) return query(ind,lc,l,r);
else if(l>mid) return query(ind,rc,l,r);
else
{
node a0=query(ind,lc,l,mid);
node a1=query(ind,rc,mid+,r);
return upd(,,a0,a1);
}
} void output(int ind,int x)
{
int lc=t[ind][x].lc,rc=t[ind][x].rc;
printf("l=%d r=%d d=%d l0=%lld l1=%lld r0=%lld r1=%lld s0=%lld s1=%lld\n",t[ind][x].l,t[ind][x].r,t[ind][x].d,t[ind][x].L[],t[ind][x].L[],t[ind][x].R[],t[ind][x].R[],t[ind][x].s[],t[ind][x].s[]);
if(lc) output(ind,lc);
if(rc) output(ind,rc);
} int main()
{
freopen("a.in","r",stdin);
freopen("me.out","w",stdout);
// freopen("cardcaptor.in","r",stdin);
// freopen("cardcaptor.out","w",stdout);
scanf("%d",&n);
int x,ind;node now;
bit[]=;
for(int i=;i<=;i++) bit[i]=bit[i-]*;
memset(a,,sizeof(a));
for(int i=;i<=n;i++)
{
scanf("%d",&x);
ind=;
while(x)
{
a[i][ind]=x%;
x/=;
ind++;
}
}
scanf("%d",&m);
for(int i=;i<;i++) {tl=;bt(i,,n);}
for(int i=;i<=m;i++)
{
scanf("%s",c);
if(c[]=='Q')
{
int l,r;LL ans=;
scanf("%d%d",&l,&r);
for(int j=;j<;j++)
{
now=query(j,,l,r);
ans=(ans+(bit[j]*now.s[])%mod)%mod;
}
printf("%lld\n",ans);
}
else
{
int ind=,p,d;
scanf("%d%d",&p,&d);
while(d)
{
change(ind,,p,d%);
d/=;
ind++;
}
for(int j=ind;j<;j++) change(j,,p,);
}
}
return ;
}

【GDKOI2016Day1T1-魔卡少女】【拆位】线段树维护区间内所有连续子区间的异或和的更多相关文章

  1. POJ.2763 Housewife Wind ( 边权树链剖分 线段树维护区间和 )

    POJ.2763 Housewife Wind ( 边权树链剖分 线段树维护区间和 ) 题意分析 给出n个点,m个询问,和当前位置pos. 先给出n-1条边,u->v以及边权w. 然后有m个询问 ...

  2. Can you answer these queries V SPOJ - GSS5 (分类讨论+线段树维护区间最大子段和)

    recursion有一个整数序列a[n].现在recursion有m次询问,每次她想知道Max { A[i]+A[i+1]+...+A[j] ; x1 <= i <= y1 , x2 &l ...

  3. 线段树维护区间前k小

    线段树维护区间前k小 $ solution: $ 觉得超级钢琴太麻烦?在这里线段树提供一条龙服务 . 咳咳,开始讲正题!这道题我们有一个和超级钢琴复杂度一样 $ ~O(~\sum x\times lo ...

  4. CodeForces - 587E[线段树+线性基+差分] ->(线段树维护区间合并线性基)

    题意:给你一个数组,有两种操作,一种区间xor一个值,一个是查询区间xor的结果的种类数 做法一:对于一个给定的区间,我们可以通过求解线性基的方式求出结果的种类数,而现在只不过将其放在线树上维护区间线 ...

  5. hdu_5726_GCD(线段树维护区间+预处理)

    题目链接:hdu_5726_GCD 题意: 给你n个数(n<=1e5)然后m个询问(m<=1e5),每个询问一个区间,问你这个区间的GCD是多少,并且输出从1到n有多少个区间的GCD和这个 ...

  6. FJUT3568 中二病也要敲代码(线段树维护区间连续最值)题解

    题意:有一个环,有1~N编号,m次操作,将a位置的值改为b,问你这个环当前最小连续和多少(不能全取也不能不取) 思路:用线段树维护一个区间最值连续和.我们设出两个变量Lmin,Rmin,Mmin表示区 ...

  7. 滑动窗口(poj,线段树维护区间最值)

    题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...

  8. 51nod 1376【线段树维护区间最大值】

    引自:wonter巨巨的博客 定义 dp[i] := 以数字 i(不是下标 i)为结尾的最长上升长度 然后用线段树维护 dp[i]: 每个节点维护 2 个信息,一个是当前区间的最大上升长度,一个是最大 ...

  9. [CSP-S模拟测试]:椎(线段树维护区间最值和单调栈)

    题目描述 虽不能至,心向往之. $Treap=Tree+Heap$ 椎$=$树$+$堆 小$\pi$学习了计算机科学中的数据结构$Treap$. 小$\pi$知道$Treap$指的是一种树. 小$\p ...

随机推荐

  1. Mininet实验 MAC地址学习分析

    拓扑图 学习过程分析 首先交换机A和交换机B一开始的MAC地址表都是空的. 此时主机11向主机33发送一个数据帧. 数据帧会先到达交换机A,交换机A会获得主机11的MAC地址和端口号.(此时交换机A的 ...

  2. ACM 第十三天

    训练赛题目 题目地址:https://odzkskevi.qnssl.com/415c275cb0a15fcb4ede21b8cb5297de?v=1533963116   A题代码: #includ ...

  3. OSG学习:转动的小汽车示例

    由于只是简单的示例,所以小汽车的模型也比较简单,是由简单的几何体组成. 代码如下: #include <osg\ShapeDrawable> #include <osg\Animat ...

  4. HBase 所有命令解析

    COMMAND GROUPS:Group name: generalCommands: status, table_help, version, whoami Group name: ddlComma ...

  5. Unsupported major.minor version 52.

    面试的时候,京东和美团,360的面试官都问到了同一个问题,java1.7与java1.8的区别, 于是想做个小小的例子: 我的eclipse刚开始是1.7的,后来,我把环境改成了1.8的, 方法:右击 ...

  6. [洛谷P4035][JSOI2008]球形空间产生器

    题目大意:给你$n$个点坐标,要你求出圆心 题解:随机化,可以随机一个点当圆心,然后和每个点比较,求出平均距离$r$,如果到这个点的距离大于$r$,说明离这个点远了,就给圆心施加一个向这个点的力:若小 ...

  7. [洛谷P3833][SHOI2012]魔法树

    题目大意:给一棵树,路径加,子树求和 题解:树剖 卡点:无 C++ Code: #include <cstdio> #include <iostream> #define ma ...

  8. BZOJ4754 & 洛谷4323 & LOJ2072:[JSOI2016]独特的树叶——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4754 https://www.luogu.org/problemnew/show/P4323 ht ...

  9. 【bzoj2743】[HEOI2012]采花 树状数组

    题目描述 萧芸斓是Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一排的,以便于公 ...

  10. HDOJ.1113 Word Amalgamation(map)

    Word Amalgamation 点我挑战题目 点我一起学习STL-MAP 题意分析 给出字典.之后给出一系列======乱序======单词,要求你查字典,如过这个乱序单词对用有多个有序单词可以输 ...