【GDKOI2016Day1T1-魔卡少女】【拆位】线段树维护区间内所有连续子区间的异或和...
题意:给出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的子区间分别有多少个
然后重点就是合并啦。
1 node upd(int ind,int tmp,node lc,node rc) 2 { 3 int dl=lc.d,dr=rc.d; 4 node x; 5 if(tmp!=0) x=t[ind][tmp]; 6 x.d=lc.d^rc.d; 7 x.L[0]=(lc.L[0]+rc.L[(dl==0) ? 0:1])%mod; 8 x.L[1]=(lc.L[1]+rc.L[(dl==0) ? 1:0])%mod; 9 x.R[0]=(rc.R[0]+lc.R[(dr==0) ? 0:1])%mod; 10 x.R[1]=(rc.R[1]+lc.R[(dr==0) ? 1:0])%mod; 11 x.s[0]=(lc.s[0]+rc.s[0]+(lc.R[0]*rc.L[0])%mod+(lc.R[1]*rc.L[1])%mod)%mod; 12 x.s[1]=(lc.s[1]+rc.s[1]+(lc.R[0]*rc.L[1])%mod+(lc.R[1]*rc.L[0])%mod)%mod; 13 return x; 14 }
我打成node形式。。因为最后查询的时候有多个区间也要合并。。
代码:
1 #include<cstdio> 2 #include<cstdlib> 3 #include<cstring> 4 #include<cmath> 5 #include<iostream> 6 #include<algorithm> 7 using namespace std; 8 9 typedef long long LL; 10 const int N=100010; 11 const LL mod=100000007; 12 struct node{ 13 int l,r,lc,rc,d; 14 LL L[2],R[2],s[2]; 15 //L:从左开始 16 //R:从右开始 17 //s:总答案 18 }t[10][2*N]; 19 char c[10]; 20 int n,m,tl,a[N][10]; 21 LL bit[15]; 22 23 node upd(int ind,int tmp,node lc,node rc) 24 { 25 int dl=lc.d,dr=rc.d; 26 node x; 27 if(tmp!=0) x=t[ind][tmp]; 28 x.d=lc.d^rc.d; 29 x.L[0]=(lc.L[0]+rc.L[(dl==0) ? 0:1])%mod; 30 x.L[1]=(lc.L[1]+rc.L[(dl==0) ? 1:0])%mod; 31 x.R[0]=(rc.R[0]+lc.R[(dr==0) ? 0:1])%mod; 32 x.R[1]=(rc.R[1]+lc.R[(dr==0) ? 1:0])%mod; 33 x.s[0]=(lc.s[0]+rc.s[0]+(lc.R[0]*rc.L[0])%mod+(lc.R[1]*rc.L[1])%mod)%mod; 34 x.s[1]=(lc.s[1]+rc.s[1]+(lc.R[0]*rc.L[1])%mod+(lc.R[1]*rc.L[0])%mod)%mod; 35 return x; 36 } 37 38 int bt(int ind,int l,int r) 39 { 40 int x=++tl; 41 t[ind][x].l=l;t[ind][x].r=r; 42 t[ind][x].lc=t[ind][x].rc=0; 43 t[ind][x].d=0; 44 memset(t[ind][x].L,0,sizeof(t[ind][x].L)); 45 memset(t[ind][x].R,0,sizeof(t[ind][x].R)); 46 memset(t[ind][x].s,0,sizeof(t[ind][x].s)); 47 if(l<r) 48 { 49 int mid=(l+r)/2; 50 t[ind][x].lc=bt(ind,l,mid); 51 t[ind][x].rc=bt(ind,mid+1,r); 52 int lc=t[ind][x].lc,rc=t[ind][x].rc; 53 t[ind][x]=upd(ind,x,t[ind][lc],t[ind][rc]); 54 } 55 else 56 { 57 int d=a[l][ind]; 58 t[ind][x].d=d; 59 t[ind][x].L[d]=t[ind][x].R[d]=t[ind][x].s[d]=1; 60 } 61 return x; 62 } 63 64 void change(int ind,int x,int p,int d) 65 { 66 if(t[ind][x].l==t[ind][x].r) 67 { 68 t[ind][x].d=d; 69 t[ind][x].L[d]=t[ind][x].R[d]=t[ind][x].s[d]=1; 70 t[ind][x].L[d^1]=t[ind][x].R[d^1]=t[ind][x].s[d^1]=0; 71 return ; 72 } 73 int lc=t[ind][x].lc,rc=t[ind][x].rc,mid=(t[ind][x].l+t[ind][x].r)/2; 74 if(p<=mid) change(ind,lc,p,d); 75 else change(ind,rc,p,d); 76 t[ind][x]=upd(ind,x,t[ind][lc],t[ind][rc]); 77 } 78 79 node query(int ind,int x,int l,int r) 80 { 81 if(t[ind][x].l==l && t[ind][x].r==r) return t[ind][x]; 82 int lc=t[ind][x].lc,rc=t[ind][x].rc,mid=(t[ind][x].l+t[ind][x].r)/2; 83 if(r<=mid) return query(ind,lc,l,r); 84 else if(l>mid) return query(ind,rc,l,r); 85 else 86 { 87 node a0=query(ind,lc,l,mid); 88 node a1=query(ind,rc,mid+1,r); 89 return upd(0,0,a0,a1); 90 } 91 } 92 93 void output(int ind,int x) 94 { 95 int lc=t[ind][x].lc,rc=t[ind][x].rc; 96 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[0],t[ind][x].L[1],t[ind][x].R[0],t[ind][x].R[1],t[ind][x].s[0],t[ind][x].s[1]); 97 if(lc) output(ind,lc); 98 if(rc) output(ind,rc); 99 } 100 101 int main() 102 { 103 freopen("a.in","r",stdin); 104 freopen("me.out","w",stdout); 105 // freopen("cardcaptor.in","r",stdin); 106 // freopen("cardcaptor.out","w",stdout); 107 scanf("%d",&n); 108 int x,ind;node now; 109 bit[0]=1; 110 for(int i=1;i<=10;i++) bit[i]=bit[i-1]*2; 111 memset(a,0,sizeof(a)); 112 for(int i=1;i<=n;i++) 113 { 114 scanf("%d",&x); 115 ind=0; 116 while(x) 117 { 118 a[i][ind]=x%2; 119 x/=2; 120 ind++; 121 } 122 } 123 scanf("%d",&m); 124 for(int i=0;i<10;i++) {tl=0;bt(i,1,n);} 125 for(int i=1;i<=m;i++) 126 { 127 scanf("%s",c); 128 if(c[0]=='Q') 129 { 130 int l,r;LL ans=0; 131 scanf("%d%d",&l,&r); 132 for(int j=0;j<10;j++) 133 { 134 now=query(j,1,l,r); 135 ans=(ans+(bit[j]*now.s[1])%mod)%mod; 136 } 137 printf("%lld\n",ans); 138 } 139 else 140 { 141 int ind=0,p,d; 142 scanf("%d%d",&p,&d); 143 while(d) 144 { 145 change(ind,1,p,d%2); 146 d/=2; 147 ind++; 148 } 149 for(int j=ind;j<10;j++) change(j,1,p,0); 150 } 151 } 152 return 0; 153 }
转载于:https://www.cnblogs.com/KonjakJuruo/p/6028497.html
【GDKOI2016Day1T1-魔卡少女】【拆位】线段树维护区间内所有连续子区间的异或和...相关推荐
- BZOJ-4811: [Ynoi2017]由乃的OJ (树链剖分 线段树维护区间操作值 好题)
4811: [Ynoi2017]由乃的OJ Time Limit: 6 Sec Memory Limit: 256 MB Submit: 366 Solved: 118 [Submit][Stat ...
- Codeforces Round #742 (Div. 2) E. Non-Decreasing Dilemma (线段树维护区间连续问题)
题意: 操作1:把x位置的数字修改成y. 操作2:查询[l,r]之间不下降序列的个数. 题解: 线段树维护区间和问题 (这是套路,想不到只能说做题少别打我) . 用五个变量进行维护. sum区间总个数 ...
- 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 ...
- 线段树维护区间最大值+第 45 届(ICPC)亚洲区域赛(昆明)L题Simone and Graph Coloring
题意: 给你n个数的序列,当满足i<ji<ji<j andandand ai>aja_i>a_jai>aj时,这两个点之间有一条边,现在对点染色,要求每个点相邻 ...
- BZOJ1018 | SHOI2008-堵塞的交通traffic——线段树维护区间连通性+细节
[题目描述] BZOJ1018 | SHOI2008-堵塞的交通traffic 有一天,由于某种穿越现象作用,你来到了传说中的小人国.小人国的布局非常奇特,整个国家的交通系统可 以被看成是一个2行C列 ...
- 【线段树-维护区间最小值和区间和】2021 ICPC网络赛第一场 D: Edge of Taixuan
Problem D: Edge of Taixuan 评测传送门 (ps: 评测时需要先花费一个币买下题目集后方可进行提交并评测.) 题目大意: 给出 n n n个结点, m m m次操作,每次操作给 ...
- E. Sign on Fence(整体二分 + 线段树维护区间最大连续 1 的个数)
E. Sign on Fence 给定一个长度为nnn的数组aaa,1≤ai≤1091 \leq a_i \leq 10 ^ 91≤ai≤109,有mmm次询问,每次给定l,r,kl, r, kl, ...
- P6617 查找 Search 线段树 查找区间内是否有两个和为w的数(w不变)
题解: 每个点x,设置其前驱为离其最近的w-x的位置 每次修改可能影响O(n)个位置: w-x x x x x x x- 这样后面每个位置的前驱都是w-x 如果修改了w-x的值,这样会导致O(n)个修 ...
- 线段树 ---- 2021牛客多校第一场 J Journey among Railway Stations [线段树维护区间可行性判断]
题目链接 题目大意: 一段路上有 NNN 个点,每个点有一个合法时间段[ui,vi][u_i,v_i][ui,vi],相邻两个点有一个长度wiw_iwi.有qqq次询问,每次询问,在 [ui,v ...
最新文章
- 哈佛大学惊人发现:新冠对人类未来影响巨大!
- tarjan详解(转)
- ubuntu mysql sql文件_ubuntu 下mysql导入出.sql文件
- 【企业管理】如何降低内部成本
- 剑与远征“超能力”玩家,恶魔瑟可斯上线第1天就被他拉满
- jvm ide_预热JVM –超快速生产服务器和IDE
- leetcode - 673. 最长递增子序列的个数
- 人工智能为什么这么火?
- 【警惕】大量未修复WebLogic WSAT组件RCE漏洞的主机被挖矿程序攻击
- python安装第三方扩展包_【Python】pip - 安装第三方包的神器
- 设计模式 英文名Design Pattern
- android 播放器封装,Android 播放器二次封装与实现
- js map根据value获取key
- Linux下常用文件系统
- 水星mw325r设置无线服务器未响应,水星MW325R无线路由器上网的设置技巧
- 淘宝服务器哪个运营商速度快,三大运营商,谁的宽带网速最快?
- 项目部署三---linux下Nginx安装
- transition transform translate 之间的区别
- 计算机无法共享的原因,不能共享的原因
- OpenVINO示例介绍