【GDKOI2016】 魔卡少女 线段树
题目大意:给你一个长度为n的序列a1....an,有m次操作
每次操作有两种情况:修改ai的值,询问[l,r]中所有子区间的异或和。
数据范围:n,m≤105,ai≤1000。
对于序列a,我们对每一个二进制位开一个线段树,对于每个节点,我们存储六个值:
sum:该区间内所有位的异或和。
ans:该区间内所有子区间异或和为1的数量。
l0:该区间内以区间左端点为起点的所有区间中,异或和为0的区间数量。
l1:该区间内以区间左端点为起点的所有区间中,异或和为1的区间数量。
r0:该区间内以区间右端点为起点的所有区间中,异或和为0的区间数量。
r1:该区间内以区间右端点为起点的所有区间中,异或和为1的区间数量。
关于pushup的过程,可以参考代码。
然后随便搞一搞就没了。
1 #include<bits/stdc++.h> 2 #define M 400005 3 #define L long long 4 #define MOD 100000007 5 using namespace std; 6 7 struct node{ 8 int l[2],r[2];L sum,ans; 9 node(){l[0]=l[1]=r[0]=r[1]=sum=ans=0;} 10 node(int x){ 11 l[1]=r[1]=sum=ans=x; 12 l[0]=r[0]=x^1; 13 } 14 friend node operator +(node a,node b){ 15 node c; 16 c.sum=a.sum^b.sum; 17 c.l[0]=a.l[0]+b.l[a.sum]; 18 c.l[1]=a.l[1]+b.l[a.sum^1]; 19 c.r[0]=a.r[b.sum]+b.r[0]; 20 c.r[1]=a.r[b.sum^1]+b.r[1]; 21 c.ans=a.ans+b.ans+1LL*a.r[0]*b.l[1]+1LL*a.r[1]*b.l[0]; 22 return c; 23 } 24 }; 25 struct seg{ 26 node a[M]; 27 void updata(int x,int lc,int rc,int k,int op){ 28 if(lc==rc) return void(a[x]=node(op)); 29 int mid=(lc+rc)>>1; 30 if(k<=mid) updata(x<<1,lc,mid,k,op); 31 else updata(x<<1|1,mid+1,rc,k,op); 32 a[x]=a[x<<1]+a[x<<1|1]; 33 } 34 node query(int x,int lc,int rc,int ll,int rr){ 35 if(ll<=lc&&rc<=rr) return a[x]; 36 int mid=(lc+rc)>>1; 37 node res; 38 if(ll<=mid) res=res+query(x<<1,lc,mid,ll,rr); 39 if(mid<rr) res=res+query(x<<1|1,mid+1,rc,ll,rr); 40 return res; 41 } 42 }p[10]; 43 int n,m; 44 int main(){ 45 scanf("%d",&n); 46 for(int i=1;i<=n;i++){ 47 int x; scanf("%d",&x); 48 for(int j=0;j<10;j++) 49 p[j].updata(1,1,n,i,(x>>j)&1); 50 } 51 scanf("%d",&m); 52 while(m--){ 53 char op[10]; int x,y; 54 scanf("%s%d%d",op,&x,&y); 55 if(op[0]=='Q'){ 56 L ans=0; 57 for(int j=0;j<10;j++){ 58 node res=p[j].query(1,1,n,x,y); 59 ans+=res.ans<<j; 60 } 61 printf("%lld\n",ans%MOD); 62 }else{ 63 for(int j=0;j<10;j++) 64 p[j].updata(1,1,n,x,(y>>j)&1); 65 } 66 } 67 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 用 C# 插值字符串处理器写一个 sscanf
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 本地部署DeepSeek后,没有好看的交互界面怎么行!
· 趁着过年的时候手搓了一个低代码框架
· 用 C# 插值字符串处理器写一个 sscanf
· 推荐一个DeepSeek 大模型的免费 API 项目!兼容OpenAI接口!