zoukankan      html  css  js  c++  java
  • [bzoj 1452] Count (树状数组) 2017-05-25 11:48 35人阅读 评论(0) 收藏

    传送门
    题目描述
    这里写图片描述
    输入
    这里写图片描述
    输出
    这里写图片描述
    样例输入
    这里写图片描述
    样例输出
    1
    2
    提示
    这里写图片描述

    思路
    因为权值最大为100 所以对于每一种权值建一个树状数组
    然后维护和查询就不多说了
    (PS:输出千万别用cout 我RE了10次 改printf就A了!! QwQ)

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int n,m,q;
    int a[305][305];
    int t[105][305][305];//每一个权值建立的二维数组
    int lowbit(int x){
        return x&(-x);
    }
    void update(int x,int y,int p,int k){
        for(int i=x;i<=n;i+=lowbit(i))
            for(int j=y;j<=m;j+=lowbit(j))
                t[p][i][j]+=k;
    }
    int getsum(int x,int y,int p){
        int sum=0;
        for(int i=x;i;i-=lowbit(i))
            for(int j=y;j;j-=lowbit(j))
                sum+=t[p][i][j];
        return sum;
    }
    int main(){
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                scanf("%d",&a[i][j]);
                update(i,j,a[i][j],1);
            }
        }
        scanf("%d",&q);
        for(int i=1;i<=q;i++){
            int k;
            scanf("%d",&k);
            int x1,x2,y1,y2,c;
            if(k==1){   
                scanf("%d %d %d",&x1,&y1,&c);
                update(x1,y1,a[x1][y1],-1);
                a[x1][y1]=c;
                update(x1,y1,a[x1][y1],1);
            }
            else{
                scanf("%d%d%d%d%d",&x1,&x2,&y1,&y2,&c);
                int ans=0;
                ans=getsum(x2,y2,c)-getsum(x1-1,y2,c)-getsum(x2,y1-1,c)+getsum(x1-1,y1-1,c);
                cout<<ans<<endl;
            }
        }
        return 0;
    } 
  • 相关阅读:
    第十三次ScrumMeeting会议
    第十二次ScrumMeeting博客
    第十一次ScrumMeeting会议
    Alpha阶段事后分析
    Alpha阶段展示
    Alpha阶段发布说明
    团队项目-第十次scrum 会议
    团队项目-第五次Scrum 会议
    # 团队项目测评博客
    # Beta冲刺前准备
  • 原文地址:https://www.cnblogs.com/xljxlj/p/7183643.html
Copyright © 2011-2022 走看看