BZOJ 1452 Count

长知识啦。。二维BIT。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m,q,t[105][305][305],map[305][305];
int a,b,c,d,e,f;
int lowbit(int x)
{
    return x&(-x);
}
void update(int x,int y,int c,int val)
{
    for (int i=x;i<=n;i+=lowbit(i))
        for (int j=y;j<=m;j+=lowbit(j))
            t[c][i][j]+=val;
}
int ask(int x,int y,int c)
{
    int tmp=0;
    for (int i=x;i>=1;i-=lowbit(i))
        for (int j=y;j>=1;j-=lowbit(j))
            tmp+=t[c][i][j];
    return tmp;
}
int main()
{
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++)
        for (int j=1;j<=m;j++)
        {
            scanf("%d",&map[i][j]);
            update(i,j,map[i][j],1);
        }
    scanf("%d",&q);
    for (int i=1;i<=q;i++)
    {
        scanf("%d",&a);
        if (a==1)
        {
            scanf("%d%d%d",&b,&c,&d);
            update(b,c,map[b][c],-1);
            update(b,c,d,1);
            map[b][c]=d;
        }
        else
        {
            scanf("%d%d%d%d%d",&b,&c,&d,&e,&f);
            int q1=0,q2=0,q3=0,q4=0;
            q1=ask(c,e,f);
            if (b>=2) q2=ask(b-1,e,f);
            if (d>=2) q3=ask(c,d-1,f);
            if ((b>=2) && (d>=2)) q4=ask(b-1,d-1,f);
            printf("%d\n",q1-q2-q3+q4);
        }
    }
    return 0;
}
时间: 2024-10-08 13:06:25

BZOJ 1452 Count的相关文章

BZOJ 1452: [JSOI2009]Count (二维树状数组)

Description Input Output Sample Input Sample Output 1 2 HINT 二维树状数组的简单应用,c数组的第一维坐标相当于哈希.如果是修改操作,修改前 将当前的值的个数以及祖先都减1, 修改后将个数加1. #include <iostream> #include <cstring> #include <cstdio> #include <cmath> #include <set> #include

BZOJ 1452: [JSOI2009]Count 二维树状数组

1452: [JSOI2009]Count Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.lydsy.com/JudgeOnline/problem.php?id=1452 Description Input Output Sample Input Sample Output 1 2 HINT 题意 题解: 裸的二维树状数组 代码: //qscqesze #include <cstdio> #include <cmath&g

BZOJ 1452 JSOI 2009 Count 二维树状数组

题目大意:有一个m*n的方格,每一个格子有他自己的权值.2种操作: 1.改变一个格子的权值. 2.查询所有的x1 <= x <= x2 && y1 <= y <= y2的中,有多少个格子颜色是c. 思路:好像是二维树状数组的样子,但是不知道怎么搞.后来研究了数据范围,发现格子最大300*300,颜色最多才100种,于是算一下300*300*100*4/1024/1024大概是35M,题目要求64M,可以搞了.(这里算的精确一点,我当时没怎么算,吧颜色开成300的了,

BZOJ 1452 [JSOI2009] Count

这道题好像有点简单的样子... absi找题目好厉害啊...确实是一道比较裸的2dBIT啊. 水掉吧. 附:2dBIT怎么做: 2dBIT就是BIT套BIT啦. 所以修改loop(x+=lowbit(x)){loop(y+=lowbit(y)){}} 查询loop(x-=lowbit(x)){loop(y-=lowbit(y)){}} 然后查询区间当然是用容斥... 假设查询(x1+1,y1+1)(x2,y2) 那么答案=Q(x1,y1)+Q(x2,y2)-Q(x1,y2)-Q(x2,y1) Q

bzoj 4664: Count

这道题和bzoj上一道叫魔法碰撞的题很像,只不过做法更加巧妙了. 一开始的想法是$f[i][j][k][0/1/2]$表示后i个数有j段当前混乱程度为k的方案,最后一维表示边界还能放几个. 转移的时候枚举每个数是山峰山谷或者中间的数,然后让混乱程度加上$h$或减去$h$. 但是这样做第三维的状态数太大了. 转变思路,从小到大枚举i,让第三维的意义变为当前每一段中的数两两之间的混乱度加上之后合并完所有段后至少会产生的混乱度. 每次$k=k+(j*2+l-2)*(h[i+1]-h[i])$,就是现在

bzoj 3956: Count

3956: Count Description Input Output Sample Input 3 2 0 2 1 2 1 1 1 3 Sample Output 0 3 HINT M,N<=3*10^5,Ai<=10^9 Source CH Round#64 MFOI杯水题欢乐赛day1 By Gromah 题解: 性质很妙的一道题. 首先可以发现这个所有的点队数是很小的,考虑以把一个点作为两个端点中较小的一个,那么另一个端点肯定是向左向右第一个大于等于它的点,这是很显然的.... 我们

BZOJ 2588 Count on a tree 主席树+倍增LCA

题目大意:给定一棵树,每个节点有权值,询问两个节点路径上的权值第k小 这题很卡时间... 树链剖分+二分+树套树的O(nlog^4n)做法可以去死了 没有修改操作,树链剖分+二分+划分树O(nlog^3n),还是死了 我怒了,裸学了一发可持久化线段树(不看任何代码OTZ,我是怎么做到的0.0),二分+主席树,O(nlog^2n),居然还是死了! 最后发现我SB了,完全没有必要二分,直接把4个参全传下去就行了,O(nlogn) 首先我们对于每个节点维护这个节点到根的权值线段树 然后对于每个询问(x

bzoj 2588 Count on a tree 解题报告

Count on a tree 题目描述 给定一棵\(N\)个节点的树,每个点有一个权值,对于\(M\)个询问\((u,v,k)\),你需要回答\(u\) \(xor\) \(lastans\)和\(v\)这两个节点间第\(K\)小的点权.其中\(lastans\)是上一个询问的答案,初始为\(0\),即第一个询问的u是明文. 输入输出格式 输入格式: 第一行两个整数\(N,M\). 第二行有\(N\)个整数,其中第\(i\)个整数表示点\(i\)的权值. 后面\(N-1\)行每行两个整数\((

bzoj 2588 Count on a tree

Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始为0,即第一个询问的u是明文. Input 第一行两个整数N,M. 第二行有N个整数,其中第i个整数表示点i的权值. 后面N-1行每行两个整数(x,y),表示点x到点y有一条边. 最后M行每行两个整数(u,v,k),表示一组询问. Output M行,表示每个询问的答案.最后一个询问不输出换行符 S