zoukankan      html  css  js  c++  java
  • POJ poj 2155 Matrix

    题目链接【http://poj.org/problem?id=2155】

    /*
    poj 2155 Matrix
    题意:矩阵加减,单点求和
    二维线段树,矩阵加减,单点求和。
    */
    using namespace std;
    const int INF = 0x3f3f3f3f;
    const int MAXN = 1010;
    int N, Q;
    struct Nodey
    {
        int l, r;
        int val;
    };
    int locx[MAXN], locy[MAXN];
    struct Nodex
    {
        int l, r;
        Nodey sty[MAXN * 3];
        void build(int i, int _l, int _r)
        {
            sty[i].l = _l;
            sty[i].r = _r;
            sty[i].val = 0;
            if(_l == _r)
            {
                locy[_l] = i;
                return;
            }
            int mid = (_l + _r) >> 1;
            build(i << 1, _l, mid);
            build((i << 1) | 1, mid + 1, _r);
        }
        void add(int i, int _l, int _r, int val)
        {
            if(sty[i].l == _l && sty[i].r == _r)
            {
                sty[i].val += val;
                return;
            }
            int mid = (sty[i].l + sty[i].r) >> 1;
            if(_r <= mid)
                add(i << 1, _l, _r, val);
            else if(_l > mid)
                add((i << 1) | 1, _l, _r, val);
            else
            {
                add(i << 1, _l, mid, val);
                add((i << 1) | 1, mid + 1, _r, val);
            }
        }
    } stx[MAXN * 3];
    void build(int i, int l, int r)
    {
        stx[i].l = l;
        stx[i].r = r;
        stx[i].build(1, 1, N);
        if(l == r)
        {
            locx[l] = i;
            return;
        }
        int mid = (l + r) >> 1;
        build(i << 1, l, mid);
        build((i << 1) | 1, mid + 1, r);
    }
    void add(int i, int x1, int x2, int y1, int y2, int val)
    {
        if(stx[i].l == x1 && stx[i].r == x2)
        {
            stx[i].add(1, y1, y2, val);
            return;
        }
        int mid = (stx[i].l + stx[i].r) / 2;
        if(x2 <= mid)
            add(i << 1, x1, x2, y1, y2, val);
        else if(x1 > mid)
            add((i << 1) | 1, x1, x2, y1, y2, val);
        else
        {
            add(i << 1, x1, mid, y1, y2, val);
            add((i << 1) | 1, mid + 1, x2, y1, y2, val);
        }
    }
    int sum(int x, int y)
    {
        int ret = 0;
        for(int i = locx[x]; i; i >>= 1)
            for(int j = locy[y]; j; j >>= 1)
                ret += stx[i].sty[j].val;
        return ret;
    }
    int main()
    {
        int T;
        scanf("%d", &T);
        while(T--)
        {
            scanf("%d%d", &N, &Q);
            build(1, 1, N);
            char op[10];
            int x1, x2, y1, y2;
            while(Q--)
            {
                scanf("%s", op);
                if(op[0] == 'C')
                {
                    scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
                    //(x1,y1)左上角,右下角
                    add(1, x1, x2, y1, y2, 1);
                }
                else
                {
                    scanf("%d%d", &x1, &y1);
                    if(sum(x1, y1) % 2 == 0)
                        printf("0
    ");
                    else
                        printf("1
    ");
                }
            }
            if(T)
                printf("
    ");
        }
        return 0;
    }
  • 相关阅读:
    高可用网站多点部署架构实战经验总结
    使用阿里云发送邮件完美解决 端口 25 465
    阿里云 SSL 证书 总结
    支付宝支付接入流程
    阿里云服务器ECS的环境部署和安装
    对接 第三方物流APP 手机版
    智付支付接入心得
    二次开发本地配置域名
    从1到n整数中1出现的次数:O(logn)算法
    MongoDB——增删改查
  • 原文地址:https://www.cnblogs.com/pealicx/p/7327232.html
Copyright © 2011-2022 走看看