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\n");
                else
                    printf("1\n");
            }
        }
        if(T)
            printf("\n");
    }
    return 0;
}
时间: 2024-08-03 22:52:28

POJ poj 2155 Matrix的相关文章

POJ 题目2155 Matrix(二维树状数组)

Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 20303   Accepted: 7580 Description Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the i-th row and j-th column. Initially we have A[i, j] = 0 (1

POJ 2155 Matrix (D区段树)

http://poj.org/problem?id=2155 Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 18143   Accepted: 6813 Description Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the i-th row and j-th column. I

POJ - 2155 Matrix (二维树状数组 + 区间改动 + 单点求值 或者 二维线段树 + 区间更新 + 单点求值)

POJ - 2155 Matrix Time Limit: 3000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Submit Status Description Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the i-th row and j-th column. Initially we ha

POJ 2155 Matrix (二维线段树)

http://poj.org/problem?id=2155 Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 18143   Accepted: 6813 Description Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the i-th row and j-th column. I

POJ 2155 Matrix 【二维树状数组】

题目链接:http://poj.org/problem?id=2155 题目大意:给出一个N*N的0矩阵,下面给出两种指令:1. 给出的第一个数据为'C',再给出四个整形数据,x1,y1,y1,y2,对以(x1,y1)(x2,y2)分别为左上角和右下角坐标的矩阵内的元素进行反转(0变1,1变0)         2. 给出的第一个数据为'Q',再给出两个数据,x,y,然后输出此时这个坐标上的元素. 这题用二维树状数组解,树状数组能够对某区间更新所有元素的和,树状数组维护的是c[1][1]到c[i

POJ 2155 Matrix【二维树状数组+YY(区间更新,单点查询)】

题目链接:http://poj.org/problem?id=2155 Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 32950   Accepted: 11943 Description Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the i-th row and j-th col

POJ 3422Kaka&#39;s Matrix Travels(最小费用最大流)

Kaka's Matrix Travels Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9460   Accepted: 3844 Description On an N × N chessboard with a non-negative number in each grid, Kaka starts his matrix travels with SUM = 0. For each travel, Kaka mo

poj Kaka&#39;s Matrix Travels

Kaka's Matrix Travels 题目: 给出一个矩阵,求只能向下或者向右的情况下能得到的最大和.一般的是指遍历一次,而这个是可以重复走K次.每经过一次后就把该点设为0.求最大和. 算法: 想到了用网络流做.但是建图没什么自信.看了别人的才敢开始建.建图其实也不难,就是有一个拆点处理,因为,一个点走一次后其上的值就为0了.这个处理很巧妙!就是拆点后建立两条边,一条是有价值的边,一条是没价值,但是可以通过的边.因为,虽然该点没价值,但是有可能其他点要通过它,这就是这题的巧妙之处!!!思抠

POJ POJ 2778 DNA Sequence AC自动机 + 矩阵快速幂

首先建立Trie和失败指针,然后你会发现对于每个节点 i 匹配AGCT时只有以下几种情况: i 节点有关于当前字符的儿子节点 j 且安全,则i 到 j找到一条长度为 1的路. i 节点有关于当前字符的儿子节点 j 且 不安全,则i 到 j没有路. i 节点没有关于当前字符的儿子节点 但是能通过失败指针找到一个安全的节点j,那么 i 到 j 找到一条长度为1的路. 关于节点安全的定义: 当前节点不是末节点且当前节点由失败指针指回跟节点的路径上不存在不安全节点,那么这个节点就是安全节点. 然后问题就