hdu 3584 二进制0,1反转 三维树状数组 及三维树状数组模板

先贴自己类比二维树状数组写的三维树状数组模板: 开始的时候循环体内j=y,k=z,没写,以为自己思路错了,,,hehe.....

更高维的树状数组以此类比

const int MAXN = 100+10;
int c[MAXN][MAXN][MAXN];int X,Y,Z;
int N;

inline int lowbit(int x){return x&(-x);}
void update(int x, int y, int z, int v)
{
    int i=x,j=y,k=z;
    while(i<=X)
    {
        j=y;
        while(j<=Y)
        {
            k=z;
            while(k<=Z)
            {
                c[i][j][k]+=v;
                k+=lowbit(k);
            }
            j+=lowbit(j);
        }
        i+=lowbit(i);
    }
}
int sum(int x, int y, int z)
{
    int i=x,j=y,k=z,ret=0;
    while(i>0)
    {
        j=y;
        while(j>0)
        {
            k=z;
            while(k>0)
            {
                ret+=c[i][j][k];
                k-=lowbit(k);
            }
            j-=lowbit(j);
        }
        i-=lowbit(i);
    }
    return ret;
}

http://acm.hdu.edu.cn/showproblem.php?pid=3584

方法仍然是看论文:《浅谈信息学竞赛中的“0”和“1”——二进制思想在信息学竞赛中的应用》 好神奇

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <iostream>
#include <cmath>
#include <map>
#include <set>
#include <queue>
using namespace std;

#define ls(rt) rt*2
#define rs(rt) rt*2+1
#define ll long long
#define ull unsigned long long
#define rep(i,s,e) for(int i=s;i<e;i++)
#define repe(i,s,e) for(int i=s;i<=e;i++)
#define CL(a,b) memset(a,b,sizeof(a))
#define IN(s) freopen(s,"r",stdin)
#define OUT(s) freopen(s,"w",stdout)

const int MAXN = 100+10;
int c[MAXN][MAXN][MAXN];int X,Y,Z;
int N;

inline int lowbit(int x){return x&(-x);}
void update(int x, int y, int z, int v)
{
    int i=x,j=y,k=z;
    while(i<=X)
    {
        j=y;
        while(j<=Y)
        {
            k=z;
            while(k<=Z)
            {
                c[i][j][k]+=v;
                k+=lowbit(k);
            }
            j+=lowbit(j);
        }
        i+=lowbit(i);
    }
}
int sum(int x, int y, int z)
{
    int i=x,j=y,k=z,ret=0;
    while(i>0)
    {
        j=y;
        while(j>0)
        {
            k=z;
            while(k>0)
            {
                ret+=c[i][j][k];
                k-=lowbit(k);
            }
            j-=lowbit(j);
        }
        i-=lowbit(i);
    }
    return ret;
}

int main()
{
    //IN("hdu3584.txt");
    int m;
    int op,x1,y1,z1,x2,y2,z2;
    while(~scanf("%d%d",&N,&m))
    {
        CL(c,0);
        X=Y=Z=N;
        while(m--)
        {
            scanf("%d",&op);
            if(op == 1)
            {
                scanf("%d%d%d%d%d%d",&x1,&y1,&z1,&x2,&y2,&z2);
                update(x1,y1,z1,1);
                update(x1,y1,z2+1,1);
                update(x1,y2+1,z1,1);
                update(x2+1,y1,z1,1);
                update(x2+1,y2+1,z2+1,1);
                update(x2+1,y1,z2+1,1);
                update(x1,y2+1,z2+1,1);
                update(x2+1,y2+1,z1,1);
            }
            else
            {
                scanf("%d%d%d",&x1,&y1,&z1);
                printf("%d\n",sum(x1,y1,z1)%2);
            }
        }
    }
    return 0;
}

hdu 3584 二进制0,1反转 三维树状数组 及三维树状数组模板

时间: 2024-12-26 20:31:54

hdu 3584 二进制0,1反转 三维树状数组 及三维树状数组模板的相关文章

poj 2155 二进制0 1反转---二维树状数组

http://poj.org/problem?id=2155 上午自己搞了很久胡思乱想了很久,然后没思路-----看了论文<浅谈信息学竞赛中的"0"和"1"--二进制思想在信息学竞赛中的应用>,豁然开朗啊,,马上A掉---PE了一次o(╯□╰)o 通过论文学到的两点: 1.多维不会的时候,从一维尝试类比: 2.想法的证明,情况数不多的时候,分类讨论证明很好 #include <cstdio> #include <cstring>

HDU 3584 Cube (三维 树状数组)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3584 Cube Problem Description Given an N*N*N cube A, whose elements are either 0 or 1. A[i, j, k] means the number in the i-th row , j-th column and k-th layer. Initially we have A[i, j, k] = 0 (1 <= i, 

HDU - 3584 Cube (三维树状数组 + 区间改动 + 单点求值)

HDU - 3584 Cube Time Limit: 1000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Submit Status Description Given an N*N*N cube A, whose elements are either 0 or 1. A[i, j, k] means the number in the i-th row , j-th column and k-th layer. I

HDU - 3584 Cube (三维树状数组 + 区间修改 + 单点求值)

HDU - 3584 Cube Time Limit: 1000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Submit Status Description Given an N*N*N cube A, whose elements are either 0 or 1. A[i, j, k] means the number in the i-th row , j-th column and k-th layer. I

HDU 5618:Jam&#39;s problem again(CDQ分治+树状数组处理三维偏序)

http://acm.hdu.edu.cn/showproblem.php?pid=5618 题意:-- 思路:和NEUOJ那题一样的.重新写了遍理解了一下,算作处理三维偏序的模板了. 1 #include <cstdio> 2 #include <algorithm> 3 #include <iostream> 4 #include <cstring> 5 using namespace std; 6 #define INF 0x3f3f3f3f 7 #d

hdu 2841 树围成矩阵,人在(0,0)点,最多可看到几棵树

题意:有一个n*m的矩阵上布满了树(矩阵从(1,1)开始),现在有一个农夫站在(0,0)点,问农夫可以看到多少棵树,其中如果这些树在一条线上那么只能看到最前面的那棵树,这个一开始看到确实蒙了..看了题解其实是挺简单的.首先考虑只能看到一条线上最前面的那棵树这个条件,对于坐标 比如 (2,3)(4,6)(6,9)..等 这些坐标是在一条直线上的 可以看出其除了(2,3) 其他的都是由(2,3)的x坐标*k y坐标*k 得到的, 拓展出来就是对于 任意坐标 (x,y) 令a=x/gcd(x,y) b

HDU 4836 The Query on the Tree lca || 欧拉序列 || 动态树

lca的做法还是很明显的,简单粗暴, 不过不是正解,如果树是长链就会跪,直接变成O(n).. 最后跑的也挺快,出题人还是挺阳光的.. 动态树的解法也是听别人说能ac的,估计就是放在splay上剖分一下,做法还是比较复杂的,,, 来一发lca: #include <stdio.h> #include <iostream> #include <algorithm> #include <sstream> #include <stdlib.h> #inc

HDU 4085 Peach Blossom Spring 记忆化搜索枚举子集 斯坦纳树

题目链接:点击打开链接 题意: 第一行输入n个点 m条可修建的无向边 k个人 下面给出修建的边和修建该边的花费. 开始时k个人在1-k的每个点上(一个点各一人) 目标:从m条给定边中修建部分边使得花费和最小 让k个人移动到 [n-k+1, n] 后面的k个点上(每个点放一个人). 思路: 首先就是一道斯坦纳树,还是先求一个dp数组(求解方法:点击打开链接) dp[i][j] 表示以i为根 ,j为8个点中是否在 i 的子树里 时的最小花费. 现在的问题就是如何求答案. 因为一个人到他的目标点这条路

HDU 1166 —— 敌兵布阵 【树状数组 or 线段树】

http://acm.hdu.edu.cn/showproblem.php?pid=1166 需求: 1.点修改 2.区间求和 标准的BIT(二叉索引树,又名树状数组)问题,当然也可以用最基础的仅支持“点修改”的线段树来解决! 线段树版本: #include <cstdio> #include <iostream> #define INF 0x3f3f3f3f using namespace std; const int MAXN = 65536 + 5; // 65536 是最小