Counting Black 【POJ - 1656】【二維線段樹+記憶體優化】
阿新 • • 發佈:2018-11-30
題目連結
這道題卡了記憶體,但是處理這個記憶體的方式卻也簡單,可以直接用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; }