• 树状数组 (模板)


    树状数组的一维和二维模板

    模板
    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 地兵布阵 一维:

    View Code
    #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 二维:

    View Code
    #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;
    }



  • 相关阅读:
    javaEE(16)_Servlet监听器
    javaEE(15)_Servlet过滤器
    引用与指针的区别
    centos7 设置 查看 开机 启动项
    apache-httpd代理请求,selinux造成503问题的解决方法
    screen命令下,自启动设置
    PHP利用preg_split函数格式化日期
    PHP敏感信息脱敏函数
    php-sql-server-2017
    SQL Server修改表的模式schema
  • 原文地址:https://www.cnblogs.com/nanke/p/2370512.html
Copyright © 2020-2023  润新知