【NOIP2016提高A组模拟8.17】Binary
2016-08-17 22:24
295 查看
Description
Input
n,q接下来n个数a[i]
接下来询问如题目
Output
对于每个询问,输出答案Sample Input
6 68 9 1 13 9 3
1 4 5
2 6 9
1 3 7
2 7 7
1 6 1
2 11 13
Sample Output
4519
21
Data Constraint
n,q<100000,a[i]<220Solution
看题,显然二进制,然后线段树,然后就解决了?发现区间永远是1到n,那就不是线段树
而要支持区间加,那就用树状数组
对于每一位,分别%,然后加入树状数组
询问时将x移到外面,即减完后才到树状数组里求解
Code
#include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #define fo(i,a,b) for(int i=a;i<=b;i++) #define N 101000 #define M 1048576 #define lowbit(x) (x&(-x)) #define ll long long using namespace std; int n; ll a ,t[21][2048576]; void add(int b,int x,ll y){for(;x<=M;x+=lowbit(x)) t[b][x]+=y;} void put(int a,ll y){fo(i,1,20) add(i,a%(1<<i)+1,y);} ll sum(int b,int x){ll y=0;for(;x>0;x-=lowbit(x)) y+=t[b][x];return y;} int main() { int ac;scanf("%d%d",&n,&ac); fo(i,1,n) scanf("%lld",&a[i]),put(a[i],1); for(;ac;ac--) { int opt,x,y;scanf("%d%d%d",&opt,&x,&y); if(opt==1) put(a[x],-1),put(y,1),a[x]=y; else { ll ans=0; fo(i,1,20) if((y&(1<<(i-1)))>0) { int l=(1<<(i-1))-x,r=(1<<i)-x-1,jy=(1<<i); l=(l%jy+jy)%jy;r=(r%jy+jy)%jy; if(l>r) ans+=(ll)(sum(i,jy+1)-sum(i,l)+sum(i,r+1))*(ll)(1<<(i-1)); else ans+=(ll)(sum(i,r+1)-sum(i,l))*(ll)(1<<(i-1)); } printf("%lld\n",ans); } } }
相关文章推荐
- JZOJ 4711 Binary【NOIP2016提高A组模拟8.17】
- [jzoj4711]【NOIP2016提高A组模拟8.17】Binary
- JZOJ 4711. 【NOIP2016提高A组模拟8.17】Binary
- 【JZOJ4711】【NOIP2016提高A组模拟8.17】Binary
- Binary 【NOIP2016提高A组模拟8.17】
- 【NOIP2016提高A组模拟8.17】Binary
- 【NOIP2016提高A组模拟8.17】(雅礼联考day1)Binary
- JZOJ.4709【NOIP2016提高A组模拟8.17】Matrix
- [JZSC2016 Part 2]【NOIP2016提高A组模拟8.17】总结
- JZOJ 4709 Matrix【NOIP2016提高A组模拟8.17】
- JZOJ 4710 Value【NOIP2016提高A组模拟8.17】
- Value【NOIP2016提高A组模拟8.17】
- 【NOIP2016提高A组模拟8.17】Matrix
- 【NOIP2016提高A组模拟8.17】Matrix
- 【NOIP2016提高A组模拟8.17】(雅礼联考day1)Matrix
- 【NOIP2016提高A组模拟8.17】Value