hdu 1890 二维树状数组


#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;

int sum[1010][1010];
int mark[1010][1010];
int add(int a,int b,int c)
{
    int i,j;
    for(i=a;i<=1001;i+=(i&-i))
    for(j=b;j<=1001;j+=(j&-j))
    sum[i][j]+=c;
    return 0;
}
int find(int a,int b)
{
    int i,j,s=0;
    for(i=a;i>0;i-=(i&-i))
    for(j=b;j>0;j-=(j&-j))
    s+=sum[i][j];
    return s;
}
int max(int a,int b)
{
    return a>b?a:b;
}
int min(int a,int b)
{
    return a<b?a:b;
}
int main()
{
    int i,j,T,Q;
    int a1,a2,b1,b2,n,d=1;
    char str[5];
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&Q);
        printf("Case %d:\n",d++);
        memset(sum,0,sizeof(sum));
        for(i=1;i<=1001;i++)
        for(j=1;j<=1001;j++)
        {
            mark[i][j]=1;
            add(i,j,1);
        }
        while(Q--)
        {
            scanf("%s",str);
            if(str[0]==‘S‘)
            {
                scanf("%d%d%d%d",&a1,&b1,&a2,&b2);
                a1++;a2++;b1++;b2++;
                int k1=max(a1,a2);
                int k2=min(a1,a2);
                int t1=max(b1,b2);
                int t2=min(b1,b2);
                int s1=find(k1,t1);
                int s2=find(k1,t2-1);
                int s3=find(k2-1,t1);
                int s4=find(k2-1,t2-1);
                printf("%d\n",s1-s2-s3+s4);
            }
            else if(str[0]==‘A‘)
            {
                scanf("%d%d%d",&a1,&b1,&n);
                a1++;b1++;
                add(a1,b1,n);
                mark[a1][b1]+=n;
            }
            else if(str[0]==‘D‘)
            {
                scanf("%d%d%d",&a1,&b1,&n);
                a1++;b1++;
                int step=mark[a1][b1]>n?n:mark[a1][b1];
                add(a1,b1,-step);
                mark[a1][b1]-=step;
            }
            else
            {
                scanf("%d%d%d%d%d",&a1,&b1,&a2,&b2,&n);
                a1++;a2++;b1++;b2++;
                int step=mark[a1][b1]>n?n:mark[a1][b1];
                add(a1,b1,-step);
                add(a2,b2,step);
                mark[a1][b1]-=step;
                mark[a2][b2]+=step;
            }
        }
    }
    return 0;
}
时间: 2024-08-03 16:34:42

hdu 1890 二维树状数组的相关文章

HDU 1892 二维树状数组

See you~ Time Limit: 5000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 3485    Accepted Submission(s): 1103 Problem Description Now I am leaving hust acm. In the past two and half years, I learned so many kno

HDU 5465 Clarke and puzzle Nim游戏+二维树状数组

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5465 Clarke and puzzle Accepts: 42 Submissions: 269 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) 问题描述 克拉克是一名人格分裂患者.某一天,有两个克拉克(aa和bb)在玩一个方格游戏. 这个方格是一个n*mn∗m的矩阵,每个格子里有一

hdu 5517 Triple(二维树状数组)

题目链接:hdu 5517 Triple 题意: 有n个两元组A,有m个三元组B,然后set C有一个计算方式. 现在让你找set TOP的size. 题解: 理解题意后,显然对于每个b的分组,只有最大的a才有贡献, 然后就可以发现set B中每个元素按照e分组后,只会对应一个a,所以最多有1e5个三元组可能有贡献. 然后将这个三元组排一下序,用二维树状数组搞搞就行了. 1 #include<bits/stdc++.h> 2 #define F(i,a,b) for(int i=(a);i&l

hdu 4456 Crowd(二维树状数组)

题目链接:hdu 4456 Crowd 题目大意:给定N,然后M次操作 1 x y z:在x,y的位置加z 2 x y z:询问与x,y曼哈顿距离小于z的点值和. 解题思路:将矩阵旋转45度,然后询问就等于是询问一个矩形,可以用容斥定理搞,维护用二维树状数组,但是空间开 不下,直接用离散化,将有用到的点处理出来. #include <cstdio> #include <cstring> #include <algorithm> using namespace std;

HDU 1892 See you~ (二维树状数组)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1892 See you~ Problem Description Now I am leaving hust acm. In the past two and half years, I learned so many knowledge about Algorithm and Programming, and I met so many good friends. I want to say so

HDU_4456_二维树状数组

http://acm.hdu.edu.cn/showproblem.php?pid=4456 第一道二维树状数组就这么麻烦,题目要计算的是一个菱形范围内的和,于是可以把原来的坐标系旋转45度,就是求一个正方形范围内的和,这里还涉及到坐标系平移和放大,由于题目数据较大,用了离散化来保存需要处理的点,放在h数组内,对应的二维树状数组存在tree数组内. #include<iostream> #include<cstring> #include<cstdio> #includ

hdu6078 Wavel Sequence dp+二维树状数组

//#pragma comment(linker, "/STACK:102400000,102400000") /** 题目:hdu6078 Wavel Sequence 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6078 题意:给定a序列和b序列.从a中取一个子序列x(数的位置顺序保持不变),子序列每个数满足a1<a2>a3<a4>a5<a6... 波浪形 从b中取相同长度的子序列y,也满足波浪形. 如果x

HDU1559 最大子矩阵 (二维树状数组)

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1559 最大子矩阵 Time Limit: 30000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 2901    Accepted Submission(s): 1454 Problem Description 给你一个m×n的整数矩阵,在上面找一个x×y的子矩阵,使

【二维树状数组】See you~

https://www.bnuoj.com/v3/contest_show.php?cid=9148#problem/F [题意] 给定一个矩阵,每个格子的初始值为1.现在可以对矩阵有四种操作: A x y n1 :给格点(x,y)的值加n1 D x y n1: 给格点(x,y)的值减n1,如果现在格点的值不够n1,把格点置0 M x1 y1 x2 y2:(x1,y1)移动给(x2,y2)n1个 S x1 y1 x2 y2 查询子矩阵的和 [思路] 当然是二维树状数组 但是一定要注意:lowbi