Wannafly模擬賽4 C Sum(線段樹)

2021-08-09 14:53:18 字數 2463 閱讀 6081

考慮維護乙個這樣的問題:

(1) 給出乙個陣列a,標號為1~n

(2) 修改陣列中的乙個位置。

(3) 詢問區間[l,r]中所有子集的位運算and之和mod(10

9+7)。

位運算and即為「pascal中的and」和「c/c++中的&」

我們定義集合s=

若集合t,t ∩ s = t,則稱t為s的子集

設f(t)=a

t1 and a

t2 and ... and a

tk  (設k為t集大小,若k=0則f(t)=0) 

所有子集的位運算and之和即為∑f(t)

那麼,現在問題來了。

第一行,乙個正整數n

第二行,n個非負整數,為陣列a

第三行,乙個正整數m,為操作次數

接下來m行格式如下

修改操作: 1 x y,將ax修改為y

詢問操作: 2 l r,區間[l,r]中所有子集的位運算and之和 mod(109+7)

對於每次詢問輸出一行,為該次詢問的答案mod(109+7)。

long long 請使用lld

示例1

3

1 2 3

62 1 3

1 1 2

2 1 3

2 2 3

1 2 5

2 1 3

9157

13

第一次詢問:

answer =1+2+3+(1 and 2)+(1 and 3)+(2 and 3)+(1 and 2 and 3)

=1+2+3+0+1+2+0

=9第二次詢問:

answer =2+2+3+(2 and 2)+(2 and 3)+(2 and 3)+(2 and 2 and 3)

=2+2+3+2+2+2+2

=15第三次詢問:

answer =2+3+(2 and 3)

=2+3+2

=7第四次詢問:

answer =2+5+3+(2 and 5)+(2 and 3)+(3 and 5)+(2 and 5 and 3)

=2+5+3+0+2+1+0

=13

m,n≤105,ai≤109

這題很考驗思維;

一看到問乙個區間中的子集就蒙了,其實仔細想一想就知道&運算只要有乙個0,這個子集這個位的貢獻就是0,所以只要統計,一段區間中這個位的1的個數就可以了

#include #include #include #include using namespace std;

const int n = 2e5+10;

typedef long long ll;

const ll mod = 1e9+7;

struct node

p[n<<2];

void build(int l,int r,int rt)

return ;

}int mid=(l+r)/2;

build(l,mid,rt<<1);

build(mid+1,r,rt<<1|1);

for(int i=0; i<=32; i++) p[rt].a[i]=p[rt<<1].a[i]+p[rt<<1|1].a[i];

return ;

}void update(int pos,int v,int l,int r,int rt)

return ;

}int mid=(l+r)/2;

if(pos<=mid) update(pos,v,l,mid,rt<<1);

else update(pos,v,mid+1,r,rt<<1|1);

for(int i=0; i<=32; i++) p[rt].a[i]=p[rt<<1].a[i]+p[rt<<1|1].a[i];

return ;

}node query(int l,int r,int l,int r,int rt)

ll b[n];

int main()

{ b[0]=1;

for(int i=1;i<=110000;i++) b[i]=b[i-1]*2%mod;

int n;

scanf("%d", &n);

build(1,n,1);

int q;

scanf("%d", &q);

while(q--)

{int x, l, r;

scanf("%d %d %d", &x, &l, &r);

if(x==1) update(l,r,1,n,1);

else

{node res=query(l,r,1,n,1);

ll ans=0;

for(ll i=0;i<=32;i++)

ans=(ans+b[i]*(b[res.a[i]]-1)%mod)%mod;

cout<

Wannafly模擬賽4 題解

a fst是一名可憐的小朋友,他很強,但是經常fst,所以rating一直低迷。但是重點在於,他非常適合acm!並在最近的區域賽中獲得了不錯的成績。拿到獎金後fst決定買一台新筆記本,但是fst發現,在 能承受的範圍內,筆記本的記憶體和速度是不可兼得的。可是,有一些筆記本是被另外一些 完虐 的,也就...

牛客 Wannafly模擬賽4 A

fst是一名可憐的小朋友,他很強,但是經常fst,所以rating一直低迷。但是重點在於,他非常適合acm!並在最近的區域賽中獲得了不錯的成績。拿到獎金後fst決定買一台新筆記本,但是fst發現,在 能承受的範圍內,筆記本的記憶體和速度是不可兼得的。可是,有一些筆記本是被另外一些 完虐 的,也就是記...

Wannafly 模擬賽A Laptop 樹狀陣列

題解 樹狀陣列 二維偏序。要同時滿足i.a j.a,i.b j.b才算完虐,然後這道題不想求逆序數那樣可以求出多對逆序,這道題只能求出多少個被完虐。所以我們排完第乙個序列之後就給編號,然後排序第二個序列,再離散化,然後就進入像計算逆序數那樣計算了,但是這裡有點不同,因為是要同時滿足i.a j.a,i...