码迷,mamicode.com
首页 > Web开发 > 详细

BZOJ1452: [JSOI2009]Count

时间:2018-02-11 23:43:27      阅读:438      评论:0      收藏:0      [点我收藏+]

标签:href   images   jpg   for   des   pac   alt   ble   树状   

Description

技术分享图片

Input

技术分享图片

Output

技术分享图片

Sample Input

技术分享图片

Sample Output

1
2

HINT

 

技术分享图片

 
 
话说这好像是我第一次做树状数组的题
树状数组裸题,还是二维的,多一层for而已
 
代码如下:
#include<cmath>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
using namespace std;
int a[310][310][110];
int c[310][310];
int n,m;
int lowbit(int x){return x&-x;}
void change(int x,int y,int cc,int d)
{
    for(int i=x;i<=n;i+=lowbit(i))
        for(int j=y;j<=m;j+=lowbit(j))
            a[i][j][cc]+=d;
}
/*
3 3
1 2 3
3 2 2
2 1 3
*/
int findsum(int x,int y,int cc)
{
    int sum=0;
    for(int i=x;i>=1;i-=lowbit(i))
        for(int j=y;j>=1;j-=lowbit(j))
            sum+=a[i][j][cc];
    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",&c[i][j]);
            change(i,j,c[i][j],1);
        }
    int Q;
    scanf("%d",&Q);
    while(Q--)
    {
        int k,x,y,cc,tx,ty;
        scanf("%d",&k);
        if(k==1)
        {
            scanf("%d%d%d",&x,&y,&cc);
            change(x,y,c[x][y],-1);
            c[x][y]=cc;
            change(x,y,c[x][y],1);
        }
        else
        {
            scanf("%d%d%d%d%d",&x,&tx,&y,&ty,&cc);
            int ans;
            ans=findsum(tx,ty,cc)+findsum(x-1,y-1,cc);
            ans=ans-(findsum(x-1,ty,cc)+findsum(tx,y-1,cc));
            printf("%d\n",ans);
        }
    }
    return 0;
}

by_lmy

BZOJ1452: [JSOI2009]Count

标签:href   images   jpg   for   des   pac   alt   ble   树状   

原文地址:https://www.cnblogs.com/MT-LI/p/8443391.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!