一维二维树状数组写法总结

(有任何问题欢迎留言或私聊 && 欢迎交流讨论哦

@


一维习题:hdu1541 bzoj3211(hdu4027)
二维习题:hdu2642 1892 5517

一维树状数组:

struct FenwickTree {
    int BIT[MXN];
    int lowbit(int x) {return x&(-x);}
    void add_bit(int x, int val, int N) {for(;x <= N; x += lowbit(x)) BIT[x] += val;}
    int query_bit(int x) {int ans = 0; for(; x; x -= lowbit(x)) ans += BIT[x]; return ans;}
}bit;
改点求段:
void add(int x,int v){
  while(x <= n){
    ar[x] += v;
    x += lowbit(x);
  }
}
int query(int x){
  int sum = 0;
  while(x > 0){
    sum += ar[x];
    x -= lowbit(x);
  }
  return sum;
}
int range(int l, int r){
    return query(r) - query(l-1);
}
改段求点:
void add(int x,int v){
  while(x <= n){
    delta[x] += v;
    x += lowbit(x);
  }
}
int query(int x){
  int sum = 0;
  while(x > 0){
    sum += delta[x];
    x -= lowbit(x);
  }
  return sum;
}
void init(){
    for(int i=1;i<=n;++i){
      scanf("%d", &ar[i]);
      add(i, ar[i]-ar[i-1]);
    }
}
int get_pos(int x){
    return query(x);
}
改段求段:

here

//sum[i] = sigma(ar[x])+(i+1)*sigma(delta[x])-sigma(x*delta[x])
//delta[]是差分数组
void add(LL *a, int x, LL v){
  while(x <= n){
    a[x] += v;
    x += lowbit(x);
  }
}
LL query(LL *a, int x){
  LL sum = 0;
  while(x > 0){
    sum += a[x];
    x -= lowbit(x);
  }
  return sum;
}
void init(){
    pre[0] = 0;
    for(int i = 1; i <= n; ++i){
      scanf("%lld", &ar[i]);
      pre[i] = pre[i-1] + ar[i];
    }
}
void update(int l, int r, LL x){
    add(delta, l, x);add(delta, r+1, -x);
    add(deltai, l, l*x);add(deltai, r+1, -x*(r+1));
}
LL range(int l, int r){
    LL sum1 = pre[l-1]+l*query(delta, l-1)-query(deltai, l-1);
    LL sum2 = pre[r]+(r+1)*query(delta, r)-query(deltai, r);
    return sum2-sum1;
}


二维树状数组:

改点求段:
void add(int x, int y, int z){
  int tmp = y;
  while(x<=n){
    y = tmp;
    while(y<=n){
      cw[x][y] += z, y += lowbit(y);
    }
    x += lowbit(x);
  }
}
int query(int x, int y){
  int res = 0, tmp = y;
  while(x){
    y = tmp;
    while(y){
      res += cw[x][y], y -= lowbit(y);
    }
    x -= lowbit(x);
  }
  return res;
}
改段求点:
//d[i][j]表示 a[i][j]与a[i−1][j]+a[i][j−1]−a[i−1][j−1]的差
//delta[][]是差分数组
void add(int x, int y, int z){
  int tmp = y;
  while(x <= n){
    y = tmp;
    while(y <= n){
      delta[x][y] += z, y += lowbit(y);
    }
    x += lowbit(x);
  }
}
void update(int xa,int ya,int xb,int yb,int z){
  add(xa,ya,z);add(xa,yb+1,-z);add(xb+1,ya,-z);add(xb+1,yb+1,z);
}
int query(int x, int y){
  int res = 0, tmp = y;
  while(x){
    y = tmp;
    while(y){
      res += delta[x][y], y -= lowbit(y);
    }
    x -= lowbit(x);
  }
  return res;
}
void init(){
    for(int i = 1; i <= n; ++i){
      for(int j = 1; j <= n; ++j){
        int tmp = ar[i][j]-ar[i-1][j]-ar[i][j-1]+ar[i-1][j-1];
        add(i,j,tmp);
      }
    }
}
改段求段:

sum[x][y] = (x+1)(y+1) \(\Sigma\) (d[i][j]) - (y+1)\(\Sigma\)(id[i][j]) - (x+1)\(\Sigma\)(jd[i][j]) + \(\Sigma\)(ij*d[i][j])

//sum[x][y] = (x+1)(y+1)sigma(d[i][j])-(y+1)sigma(i*d[i][j])-(x+1)sigma(j*d[i][j])+sigma(i*j*d[i][j])

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<assert.h>
#include<bitset>
#define lson rt<<1
#define rson rt<<1|1
#define lowbit(x) (x)&(-(x))
#define all(x) (x).begin(),(x).end()
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const int N = (int)1e3 +107;
int ar[N][N], da[N][N], di[N][N], dj[N][N],dij[N][N];
int n, m, q;
//sumxy = (x+1)(y+1)sigma(d[i][j])-(y+1)sigma(i*d[i][j])-(x+1)sigma(j*d[i][j])+sigma(i*j*d[i][j])
void add(int x, int y, int z){
  for(int i=x;i<=n;i+=lowbit(i)){
    for(int j=y;j<=n;j+=lowbit(j)){
      da[i][j] += z; di[i][j] += z*x; dj[i][j] += z*y; dij[i][j] += z*x*y;
    }
  }
}
void update(int xa,int ya,int xb,int yb,int z){
  add(xa,ya,z);add(xa,yb+1,-z);add(xb+1,ya,-z);add(xb+1,yb+1,z);
}
int query(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 += (x+1)*(y+1)*da[i][j] - (y+1)*di[i][j] - (x+1)*dj[i][j] + dij[i][j];
    }
  }
  return res;
}
int ask(int xa,int ya,int xb,int yb){
  return query(xb,yb)-query(xb,ya-1)-query(xa-1,yb)+query(xa-1,ya-1);
}
void init(){
  for(int i = 1; i <= n; ++i){
    for(int j = 1; j <= n; ++j){
      int tmp = ar[i][j]-ar[i-1][j]-ar[i][j-1]+ar[i-1][j-1];
      add(i,j,tmp);
      //update(i,j,i,j,ar[i][j]);
    }
  }
}
int main(){
  while(~scanf("%d", &n)){
    memset(ar,0,sizeof(ar));
    for(int i=1;i<=n;++i){
      for(int j=1;j<=n;++j){
        scanf("%d",&ar[i][j]);
      }
    }
    init();
    scanf("%d",&q);
    while(q--){
      int op,xa,xb,ya,yb,c;
      scanf("%d%d%d%d%d",&op,&xa,&ya,&xb,&yb);
      if(op==1){
        scanf("%d",&c);
        update(xa,ya,xb,yb,c);
      }else{
        printf("%d\n", ask(xa,ya,xb,yb));
      }
      if(q<=0)break;
    }
  }
  return 0;
}


习题答案:

HDU1892
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<assert.h>
#include<bitset>
#define lson rt<<1
#define rson rt<<1|1
#define lowbit(x) (x)&(-(x))
#define all(x) (x).begin(),(x).end()
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const int N = (int)1e3 +107;
int ar[N][N], da[N][N], di[N][N], dj[N][N],dij[N][N];
int n, m, q;
//sumxy = (x+1)(y+1)sigma(d[i][j])-(y+1)sigma(i*d[i][j])-(x+1)sigma(j*d[i][j])+sigma(i*j*d[i][j])
void add(int x,int y,int c){
  for(int i=x;i<=n;i+=lowbit(i)){
    for(int j=y;j<=n;j+=lowbit(j)){
      da[i][j]+=c;
    }
  }
}
int query(int x,int y){
  int sum=0;
  for(int i=x;i;i-=lowbit(i)){
    for(int j=y;j;j-=lowbit(j)){
      sum+=da[i][j];
    }
  }
  return sum;
}
int ask(int xa,int ya,int xb,int yb){
  return query(xb,yb)-query(xa-1,yb)-query(xb,ya-1)+query(xa-1,ya-1);
}
int main(){
  int tim;
  int tc=0;
  scanf("%d",&tim);
  while(tim--){
    n=1002;
    memset(da,0,sizeof(da));
    for(int i=1;i<=n;++i){
      for(int j=1;j<=n;++j){
        add(i,j,1);
      }
    }
    printf("Case %d:\n", ++tc);
    scanf("%d",&q);
    while(q--){
      char op[2];
      int xa=0,xb=0,ya=0,yb=0,c;
      scanf("%s",op);
      if(op[0]=='S'){
        scanf("%d%d%d%d",&xa,&ya,&xb,&yb);
        xa++;ya++;xb++;yb++;
        if(xa>xb)swap(xa,xb);
        if(ya>yb)swap(ya,yb);
        printf("%d\n", ask(xa,ya,xb,yb));
      }else if(op[0]=='A'){
        scanf("%d%d%d",&xa,&ya,&c);
        xa++;ya++;xb++;yb++;
        add(xa,ya,c);
      }else if(op[0]=='D'){
        scanf("%d%d%d",&xa,&ya,&c);
        xa++;ya++;xb++;yb++;
        c=min(c,ask(xa,ya,xa,ya));
        add(xa,ya,-c);
      }else{
        scanf("%d%d%d%d%d",&xa,&ya,&xb,&yb,&c);
        xa++;ya++;xb++;yb++;
        c=min(c,ask(xa,ya,xa,ya));
        add(xa,ya,-c);
        add(xb,yb,c);
      }
    }
  }
  return 0;
}
HDU2642:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<assert.h>
#include<bitset>
#define lson rt<<1
#define rson rt<<1|1
#define lowbit(x) (x)&(-(x))
#define all(x) (x).begin(),(x).end()
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
const int N = (int)1e3 +107;
int ar[N][N], da[N][N], di[N][N], dj[N][N],dij[N][N];
int n, m, q;
//sumxy = (x+1)(y+1)sigma(d[i][j])-(y+1)sigma(i*d[i][j])-(x+1)sigma(j*d[i][j])+sigma(i*j*d[i][j])
void add(int x, int y, int z){
  for(int i=x;i<=n;i+=lowbit(i)){
    for(int j=y;j<=n;j+=lowbit(j)){
      da[i][j] += z;
    }
  }
}
int query(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 += da[i][j];
    }
  }
  return res;
}
int ask(int xa,int ya,int xb,int yb){
  return query(xb,yb)-query(xb,ya-1)-query(xa-1,yb)+query(xa-1,ya-1);
}
int main(){
  while(~scanf("%d", &q)){
    n=1001;
    memset(da,0,sizeof(da));
    memset(ar,0,sizeof(ar));
    while(q--){
      char op[2];
      int xa,xb,ya,yb,c;
      scanf("%s",op);
      if(op[0]=='B'){
        scanf("%d%d",&xa,&ya);
        xa++;ya++;
        if(ar[xa][ya]==0)add(xa,ya,1);
        ar[xa][ya]=1;
      }else if(op[0]=='D'){
        scanf("%d%d",&xa,&ya);
        xa++;ya++;
        if(ar[xa][ya]==1)add(xa,ya,-1);
        ar[xa][ya]=0;
      }else{
        scanf("%d%d",&xa,&xb);
        scanf("%d%d",&ya,&yb);
        xa++;ya++;
        xb++;yb++;
        if(xa>xb)swap(xa,xb);
        if(ya>yb)swap(ya,yb);
        printf("%d\n", ask(xa,ya,xb,yb));
      }
    }
  }
  return 0;
}
hdu1541
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
const int N=1e5+10;
int a[N],sum[N];
int lowbit(int x){return x&(-x);}
int Sum(int n){
    int sum=0;
    while(n>0){
        sum+=a[n];
        n-=lowbit(n);
    }
    return sum;
}
void add(int x){
    while(x<=N){
        ++a[x];
        x+=lowbit(x);
    }
}
int main() {
    int x,y,n;
    while(~scanf("%d",&n)){
        memset(a,0,sizeof(a));
        memset(sum,0,sizeof(sum));
        for(int i=0;i<n;++i){
            scanf("%d %d",&x,&y);
            //1 5 7 3 5
            //2 6 8 4 6
            //0 1 2 1 3
            x++;
            sum[Sum(x)]++;
            add(x);
        }
        for(int i=0;i<n;++i){
            printf("%d\n",sum[i]);
        }
    }
    return 0;
}

具体请访问这个博客:here

树状数组求区间最值

\(bit[x]\) 是区间\([x-lowbit(x)+1, x]\)的最值
能转移到\(x\)的状态是 \(x-2^0, x-2^1 ... x-2^k\)\(2^k < lowbit(x)\)
\(y - lowbit(y) >= x\),则\(query(x,y) = max(bit[y], query(x, y-lowbit(y)))\)
\(y - lowbit(y) < x\),则\(query(x,y) = max(ar[y], query(x, y-1))\)

#include<iostream>
#include<cstdio>
#include<assert.h>
#include<ctime>
#include<algorithm>
#include<cstring>
//#include<bits/stdc++.h>
#define lowbit(x) (x)&(-(x))
#define all(x) x.begin(),x.end()
#define iis std::ios::sync_with_stdio(false)
#define mme(a,b) memset((a),(b),sizeof((a)))
using namespace std;
typedef long long LL;
const int MXN = 2e5+7;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
int n, m;
int ar[MXN], bit[MXN];

int lowbit(int x){return x & (-x);}
inline void mymax(int &a,int b){a = a > b? a: b;}
void update(int x){
  while(x <= n){
    bit[x] = ar[x];
    int tmp = lowbit(x);
    for(int i = 1; i < tmp; i <<= 1){
      //bit[x] = max(bit[x], bit[x-i]);
      mymax(bit[x], bit[x-i]);
    }
    x += lowbit(x);
  }
}
int query(int x,int y){
  int ans = 0;
  while(y >= x){
    //ans = max(ans, ar[y]);
    mymax(ans, ar[y]);
    --y;
    for( ; y - lowbit(y) >= x; y -= lowbit(y)){
      //ans = max(ans, bit[y]);
      mymax(ans, bit[y]);
    }
  }
  return ans;
}
int main(){
  char op;
  int a, b;
  while(scanf("%d%d", &n, &m)!=EOF){
    for(register int i = 0; i <= n; ++i)bit[i] = 0;
    for(register int i = 1; i <= n; ++i){
      scanf("%d", &ar[i]);
      update(i);
    }
    while(m--){
      scanf("%c", &op);
      scanf("%c", &op);
      scanf("%d%d", &a, &b);
      if(op == 'U') {
        ar[a] = b;
        update(a);
      }else {
        a = query(a, b);
        printf("%d\n", a);
      }
    }
  }
  return 0;
}

转载于:https://www.cnblogs.com/Cwolf9/p/9513252.html

以下是对提供的参考资料的总结,按照要求结构化多个要点分条输出: 4G/5G无线网络优化与网规案例分析: NSA站点下终端掉4G问题:部分用户反馈NSA终端频繁掉4G,主要因终端主动发起SCGfail导致。分析显示,在信号较好的环境下,终端可能因节能、过热保护等原因主动释放连接。解决方案建议终端侧进行分析处理,尝试关闭节电开关等。 RSSI算法识别天馈遮挡:通过计算RSSI平均值及差值识别天馈遮挡,差值大于3dB则认定有遮挡。不同设备分组规则不同,如64T和32T。此方法可有效帮助现场人员识别因环境变化引起的网络问题。 5G 160M组网小区CA不生效:某5G站点开启100M+60M CA功能后,测试发现UE无法正常使用CA功能。问题原因在于CA频点集标识配置错误,修正后测试正常。 5G网络优化与策略: CCE映射方式优化:针对诺基亚站点覆盖农村区域,通过优化CCE资源映射方式(交织、非交织),提升RRC连接建立成功率和无线接通率。非交织方式相比交织方式有显著提升。 5G AAU两扇区组网:与三扇区组网相比,AAU两扇区组网在RSRP、SINR、下载速率和上传速率上表现不同,需根据具体场景选择适合的组网方式。 5G语音解决方案:包括沿用4G语音解决方案、EPS Fallback方案和VoNR方案。不同方案适用于不同的5G组网策略,如NSA和SA,并影响语音连续性和网络覆盖。 4G网络优化与资源利用: 4G室分设备利旧:面对4G网络投资压减与资源需求矛盾,提出利旧多维度调优策略,包括资源整合、统筹调配既有资源,以满足新增需求和提质增效。 宏站RRU设备1托N射灯:针对5G深度覆盖需求,研究使用宏站AAU结合1托N射灯方案,快速便捷地开通5G站点,提升深度覆盖能力。 基站与流程管理: 爱立信LTE基站邻区添加流程:未提供具体内容,但通常涉及邻区规划、参数配置、测试验证等步骤,以确保基站间顺畅切换和覆盖连续性。 网络规划与策略: 新高铁跨海大桥覆盖方案试点:虽未提供详细内容,但可推测涉及高铁跨海大桥区域的4G/5G网络覆盖规划,需考虑信号穿透、移动性管理、网络容量等因素。 总结: 提供的参考资料涵盖了4G/5G无线网络优化、网规案例分析、网络优化策略、资源利用、基站管理等多个方面。 通过具体案例分析,展示了无线网络优化中的常见问题及解决方案,如NSA终端掉4G、RSSI识别天馈遮挡、CA不生效等。 强调了5G网络优化与策略的重要性,包括CCE映射方式优化、5G语音解决方案、AAU扇区组网选择等。 提出了4G网络优化与资源利用的策略,如室分设备利旧、宏站RRU设备1托N射灯等。 基站与流程管理方面,提到了爱立信LTE基站邻区添加流程,但未给出具体细节。 新高铁跨海大桥覆盖方案试点展示了特殊场景下的网络规划需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值