Counting Black 【POJ - 1656】【二维线段树+内存优化】

题目链接


  这道题卡了内存,但是处理这个内存的方式却也简单,可以直接用short int来减少内存的使用,于是就可以用四叉树——二维线段树过了。


#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <limits>
#include <vector>
#include <stack>
#include <queue>
#include <set>
#include <map>
#define lowbit(x) ( x&(-x) )
//子节点
#define s1 (rt<<2)-2
#define s2 (rt<<2)-1
#define s3 (rt<<2)
#define s4 (rt<<2)+1
#define Creat_Mid int mid_x=(lx + rx)>>1, mid_y=(ly + ry)>>1
//得到面积
#define getarea (rx - lx + 1)*(ry - ly + 1)
#define get1 (mid_x - lx + 1)*(mid_y - ly + 1)
#define get2 (mid_x - lx + 1)*(ry - mid_y)
#define get3 (rx - mid_x)*(mid_y - ly + 1)
#define get4 (rx - mid_x)*(ry - mid_y)
//子节点
#define son1 s1, lx, ly, mid_x, mid_y
#define son2 s2, lx, mid_y+1, mid_x, ry
#define son3 s3, mid_x+1, ly, rx, mid_y
#define son4 s4, mid_x+1, mid_y+1, rx, ry
//查询
#define ques qlx, qly, qrx, qry
//能往下走吗?
#define q1 qlx<=mid_x && qly<=mid_y
#define q2 qlx<=mid_x && qry>mid_y
#define q3 qrx>mid_x && qly<=mid_y
#define q4 qrx>mid_x && qry>mid_y
//返回
#define pushup tree[rt] = tree[s1] + tree[s2] + tree[s3] + tree[s4]
#define INF 0x3f3f3f3f
#define pi 3.141592653589793
#define e 2.718281828459045
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int maxN = 2000001;
int Q;
short int tree[maxN], lazy[maxN];
char sss[100];
void pushdown(int rt, int lx, int ly, int rx, int ry)
{
    if(lazy[rt]!=-1)
    {
        lazy[s1] = lazy[s2] = lazy[s3] = lazy[s4] = lazy[rt];
        Creat_Mid;
        tree[s1] = lazy[rt] * get1;
        tree[s2] = lazy[rt] * get2;
        tree[s3] = lazy[rt] * get3;
        tree[s4] = lazy[rt] * get4;
        lazy[rt] = -1;
    }
}
void update(int rt, int lx, int ly, int rx, int ry, int qlx, int qly, int qrx, int qry, int val)
{
    //if(lx>rx || ly>ry) return;
    if(qlx<=lx && qly<=ly && qrx>=rx && qry>=ry)
    {
        tree[rt] = val*getarea;
        lazy[rt] = val;
        return;
    }
    Creat_Mid;
    pushdown(rt, lx, ly, rx, ry);
    if(q1) update(son1, ques, val);
    if(q2) update(son2, ques, val);
    if(q3) update(son3, ques, val);
    if(q4) update(son4, ques, val);
    pushup;
}
int query(int rt, int lx, int ly, int rx, int ry, int qlx, int qly, int qrx, int qry)
{
    //if(lx>rx || ly>ry) return 0;
    if(qlx<=lx && qly<=ly && qrx>=rx && qry>=ry) return tree[rt];
    pushdown(rt, lx, ly, rx, ry);
    Creat_Mid;
    int ans = 0;
    if(q1) ans+=query(son1, ques);
    if(q2) ans+=query(son2, ques);
    if(q3) ans+=query(son3, ques);
    if(q4) ans+=query(son4, ques);
    return ans;
}
int main()
{
    while(scanf("%d", &Q)!=EOF)
    {
        memset(tree, 0, sizeof(tree));
        memset(lazy, -1, sizeof(lazy));
        while(Q--)
        {
            scanf("%s", sss);
            int x, y, L;
            scanf("%d%d%d", &x, &y, &L);
            if(sss[0] == 'B') update(1, 1, 1, 100, 100, x, y, x+L-1, y+L-1, 1);
            else if(sss[0] == 'W') update(1, 1, 1, 100, 100, x, y, x+L-1, y+L-1, 0);
            else printf("%d\n", query(1, 1, 1, 100, 100, x, y, x+L-1, y+L-1));
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41730082/article/details/84346786
今日推荐