日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

树状数组 (模板)

發布時間:2025/6/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 树状数组 (模板) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
int lowbit(int x) {return x & (-x); } void modify(int x,int add)//一維 { while(x<=MAXN) { a[x]+=add; x+=lowbit(x); } } int get_sum(int x) { int ret=0; while(x!=0) { ret+=a[x]; x-=lowbit(x); } return ret; } void modify(int x,int y,int data)//二維 {for(int i=x;i<MAXN;i+=lowbit(i))for(int j=y;j<MAXN;j+=lowbit(j))a[i][j]+=data; } int get_sum(int x,int y) {int res=0;for(int i=x;i>0;i-=lowbit(i))for(int j=y;j>0;j-=lowbit(j))res+=a[i][j];return res; }



hdu1166 地兵布陣?一維:

#include<stdio.h> #include<string.h> #include<stdlib.h> int c[50011],n; int lowbit(int x)//計算lowbit {return x&(-x); } void add(int i,int val)//將第i個元素更改為val {while(i<=n){c[i]+=val;i+=lowbit(i);} } int sum(int i)//求前i項和 {int s=0;while(i>0){s+=c[i];i-=lowbit(i);}return s; } int main() { int i ,j=0,a,b,v,t,num; char str[]="Add",str1[]="Sub",str2[]="End",sub1[6];scanf("%d",&t); while(t--) { scanf("%d",&n);printf("Case %d:\n",++j);memset(c,0,sizeof(c));for(i=1;i<=n;++i) { scanf("%d",&v); add(i,v); }while(1){ scanf("%s",sub1);if(!strcmp(str2,sub1))break; if(!strcmp(sub1,str)) { scanf("%d %d",&a,&b); add(a,b); } else if(!strcmp(sub1,str1)) { scanf("%d %d",&a,&b); add(a,-b); } else { scanf("%d %d",&a,&b); printf("%d\n",sum(b)-sum(a-1)); } } } return 0; }
hdu2642 Stars 二維:

#include<iostream> #include<algorithm> using namespace std; const int MAXN = 1010; int a[MAXN][MAXN]; bool b[MAXN][MAXN]; int lowbit(int x) {return x & (-x); } void modify(int x,int y,int data) {for(int i=x;i<MAXN;i+=lowbit(i))for(int j=y;j<MAXN;j+=lowbit(j))a[i][j]+=data; } int get_sum(int x,int y) {int res=0;for(int i=x;i>0;i-=lowbit(i))for(int j=y;j>0;j-=lowbit(j))res+=a[i][j];return res; } int main() {int n,x,y,x1,y1;char str[2];scanf("%d",&n);memset(a,0,sizeof(a));memset(b,false,sizeof(b));while(n--){scanf("%s",str);if(str[0]=='B'){scanf("%d %d",&x,&y);x++;y++;if(b[x][y]) continue; modify(x,y,1);b[x][y]=true;}else if(str[0]=='D'){scanf("%d %d",&x,&y);x++;y++;if(!b[x][y]) continue;modify(x,y,-1);b[x][y]=false;}else {scanf("%d %d %d %d",&x,&x1,&y,&y1);x++,y++;x1++,y1++; if(x>x1) swap(x,x1);if(y>y1) swap(y,y1);int ans=get_sum(x1,y1)-get_sum(x-1,y1)-get_sum(x1,y-1)+get_sum(x-1,y-1);printf("%d\n",ans);}}return 0; }

總結

以上是生活随笔為你收集整理的树状数组 (模板)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。