题目链接
这道题卡了内存,但是处理这个内存的方式却也简单,可以直接用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;
}