考慮維護乙個這樣的問題:
(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)。示例1long long 請使用lld
31 2 3
62 1 3
1 1 2
2 1 3
2 2 3
1 2 5
2 1 3
915713
第一次詢問: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...