0%

Sum

题意:
考虑维护一个这样的问题:
(1) 给出一个数组A,标号为1~n
(2) 修改数组中的一个位置。
(3) 询问区间[l,r]中所有子集的位运算and之和mod($10^9$+7)。

传送门
题解:
按位建立线段树,每一颗线段树维护每一位从1到n的区间和。
第p位的值为a,则贡献为:$2^p$*($2^a$-1);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MOD=1e9+7;
const int MAX_N=1e5+5;
int a[MAX_N];
int tree[MAX_N<<2][32];
int cnt[32];
ll mod_pow(ll x,ll n)
{
ll res=1;
while(n)
{
if(n&1) res=res*x%MOD;
x=x*x%MOD;
n>>=1;
}
return res%MOD;
}

int lc(int x){return x<<1;}
int rc(int x){return x<<1|1;}

void push_up(int p,int t)
{
tree[p][t]=(tree[lc(p)][t]+tree[rc(p)][t])%MOD;
}

void build(int p,int l,int r)
{
if(l==r)
{
for(int i=0;i<32;i++)
{
tree[p][i]=(a[l]>>i)&1;
}
return;
}
int mid=(l+r)>>1;
build(lc(p),l,mid);
build(rc(p),mid+1,r);
for(int i=0;i<32;i++)
push_up(p,i);
}

void query(int nl,int nr,int p,int l ,int r)
{
if(nl<=l&&r<=nr)
{
for(int i=0;i<32;i++)
{
cnt[i]=(cnt[i]+tree[p][i])%MOD;
}
return;
}
int mid=(l+r)>>1;
if(nl<=mid) query(nl,nr,lc(p),l,mid);
if(mid<nr) query(nl,nr,rc(p),mid+1,r);
}
void update(int nl,int nr,int p,int l ,int r,int k )
{
if(nl<=l&&r<=nr)
{
a[l]=k;
for(int i=0;i<32;i++)
{
tree[p][i]=(a[l]>>i)&1;
}
return;
}
int mid=(l+r)>>1;
if(nl<=mid) update(nl,nr,lc(p),l,mid,k);
if(mid<nr) update(nl,nr,rc(p),mid+1,r,k);
for(int i=0;i<32;i++)
push_up(p,i);
}


int main()
{
int n;scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
build(1,1,n);
int m; scanf("%d",&m);
while(m--)
{
int b; scanf("%d",&b);
if(b==1){
int x,y;
scanf("%d%d",&x,&y);
update(x,x,1,1,n,y);
}
else{
memset(cnt,0,sizeof(cnt));
int l,r;
scanf("%d%d",&l,&r);
query(l,r,1,1,n);
ll ans=0;
for(int i=0;i<32;i++)
{
ans=(ans+(((mod_pow(2,cnt[i])-1)%MOD)*(mod_pow(2,i)%MOD))%MOD)%MOD;
}
printf("%lld\n",ans);
}
}
return 0;
}
-------------本文结束感谢您的阅读-------------