poj1195 Mobile phones 二维线段树入门

二维线段树就是树套树,线段树套线段树。。。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define REP(i,a,b) for(int i=a;i<=b;i++)
#define MS0(a) memset(a,0,sizeof(a))
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1

using namespace std;

typedef long long ll;
const int maxn=1500;
const int INF=1e9+10;

int n;
int op;
int x,y,z;
int xt1,yt1,xt2,yt2;
struct NodeY
{
    int l,r;
    int cnt;
};
struct NodeX
{
    int l,r;
    int cnt;
    NodeY ty[maxn<<2];
    void up(int rt)
    {
        ty[rt].cnt=ty[rt<<1].cnt+ty[rt<<1|1].cnt;
    }
    void build(int l,int r,int rt)
    {
        ty[rt].l=l;ty[rt].r=r;
        ty[rt].cnt=0;
        if(l==r) return;
        int m=(l+r)>>1;
        build(lson);
        build(rson);
        up(rt);
    }
    void update(int p,int c,int l,int r,int rt)
    {
        if(l==r){
            ty[rt].cnt+=c;
            return;
        }
        int m=(l+r)>>1;
        if(p<=m) update(p,c,lson);
        else update(p,c,rson);
        up(rt);
    }
    int query(int L,int R,int l,int r,int rt)
    {
        if(L<=l&&r<=R) return ty[rt].cnt;
        int m=(l+r)>>1;
        int res=0;
        if(L<=m) res+=query(L,R,lson);
        if(R>m) res+=query(L,R,rson);
        return res;
    }
};NodeX tx[maxn<<2];

void up(int rt)
{
    tx[rt].cnt=tx[rt<<1].cnt+tx[rt<<1|1].cnt;
}

void build(int l,int r,int rt)
{
    tx[rt].l=l;tx[rt].r=r;
    tx[rt].cnt=0;
    tx[rt].build(1,n,1);
    if(l==r) return;
    int m=(l+r)>>1;
    build(lson);
    build(rson);
    up(rt);
}

void update(int x,int y,int c,int l,int r,int rt)
{
    tx[rt].update(y,c,1,n,1);
    if(l==r) return;
    int m=(l+r)>>1;
    if(x<=m) update(x,y,c,lson);
    else update(x,y,c,rson);
    up(rt);
}

int query(int xL,int xR,int yL,int yR,int l,int r,int rt)
{
    if(xL<=l&&r<=xR) return tx[rt].query(yL,yR,1,n,1);
    int m=(l+r)>>1;
    int res=0;
    if(xL<=m) res+=query(xL,xR,yL,yR,lson);
    if(xR>m) res+=query(xL,xR,yL,yR,rson);
    return res;
}

int main()
{
    freopen("in.txt","r",stdin);
    scanf("%d%d",&op,&n);
    build(1,n,1);
    while(~scanf("%d",&op)&&op!=3){
        if(op==1){
            scanf("%d%d%d",&x,&y,&z);
            x++;y++;
            update(x,y,z,1,n,1);
        }
        else{
            scanf("%d%d%d%d",&xt1,&yt1,&xt2,&yt2);
            xt1++;yt1++;xt2++;yt2++;
            printf("%d\n",query(xt1,xt2,yt1,yt2,1,n,1));
        }
    }
    return 0;
}

时间: 2024-12-26 15:12:24

poj1195 Mobile phones 二维线段树入门的相关文章

POJ1195 Mobile phones 二维树状数组的应用

这题可以用线段树离散化做,用二维树状数组做了一下,不懂得可以看一下这篇文章:http://www.java3z.com/cwbwebhome/article/article1/1369.html?id=4804 题意: 给你一个s*s的正方形区域,先输入一个x,若x==0,则再输入一个s,若x==1,则输入x,y,a,表示矩阵中(x,y)这点的值加上a,若x==2,输入l,b,r,t,代表以左上角的点(l,b)右下角的点(r,t),求这一片矩形内的矩阵元素之和,若x==3则结束此次程序 就是最基

POJ1195:Mobile phones(二维树状数组)

Description Suppose that the fourth generation mobile phone base stations in the Tampere area operate as follows. The area is divided into squares. The squares form an S * S matrix with the rows and columns numbered from 0 to S-1. Each square contain

HDU 1823 二维线段树

二维线段树入门题 分别以身高和活泼度开两维 以身高-100,活泼度*10,为两个区间 所谓的二维就是在第一维查找到正确位置时,进入第二维再查找 #include "stdio.h" #include "string.h" double ans; double Max(double a,double b) { if (a<b) return b;else return a; } struct Mark { int l,r; double x; }; struct

HDU 1823 Luck and Love 二维线段树(树套树)

点击打开链接 Luck and Love Time Limit: 10000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 5460    Accepted Submission(s): 1364 Problem Description 世界上上最远的距离不是相隔天涯海角 而是我在你面前 可你却不知道我爱你 ―― 张小娴 前段日子,枫冰叶子给Wiskey做了个征婚启事

POJ1195 Mobile phones 【二维线段树】

Mobile phones Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 14291   Accepted: 6644 Description Suppose that the fourth generation mobile phone base stations in the Tampere area operate as follows. The area is divided into squares. The

poj 1195:Mobile phones(二维线段树,矩阵求和,经典题)

Mobile phones Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 14391   Accepted: 6685 Description Suppose that the fourth generation mobile phone base stations in the Tampere area operate as follows. The area is divided into squares. The

POJ1195-数据结构嵌套(二维线段树)

第一次写传说中的数据结构套数据结构,果然坑了一晚上,不过回头想想也没什么难的.二维线段树是一颗基于X轴的线段树,每颗该线段树的节点又是一颗基于Y轴的线段树.X轴线段树的某个节点所表示的Y轴线段树 维护的是该X轴线段树的两个儿子所表示的Y轴线段树维护的数据之和,如果X轴线段树的这个节点没有儿子,则其表示的Y轴线段树 维护的 就是 所有横坐标为X的数据,巨绕.. 下面是POJ1195标程:P.S.该题内存限制64M,一开始全用的int,一个int 4字节,大概2100*2100*5个int,1024

HDU1832 二维线段树求最值(模板)

Luck and Love Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 50 Accepted Submission(s): 20   Problem Description 世界上上最远的距离不是相隔天涯海角而是我在你面前可你却不知道我爱你                ―― 张小娴 前段日子,枫冰叶子给Wiskey做了个征婚启事,聘

ZOJ 2859 二维线段树

思路:自己写的第二发二维线段树1A,哈哈,看来对二维的push操作比较了解了:但是还没遇到在两个线段树中同时进行push操作的,其实这题我是想在x维和y维同时进行push操作的,但是想了好久不会,然后看到这题又给出10秒,然后想想在x维线段直接单点查询肯定也过了,然后在第二维就只有pushup操作,在第一维线段树没有pushup操作.要是在第一维也有pushup操作的话,那就不用单点查询那么慢了.不过也A了,想找题即在二维同时进行pushup和pushdown操作的. #include<iost