POJ 2155 二維線段樹 修改區間查詢點

     這道線段樹,我用的是完全暴力的方式,中間沒有優化;

     說實話,簡直坑爹,對於n長度的區間的線段樹 ,它的節點數目爲N左右,第二維開N的大小居然過不了 ,真是大哭了,檢查了好久好久,本來昨天就該過的,真坑爹!!!!

方法:二維線段樹 ( 樹套樹 ) ,修改區間查詢點;

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cassert>
#include <algorithm>
using namespace std ;

const int N = 1000 + 11 ;

struct Node {
	int lson , rson ;
	int mid() {return (lson+rson)>>1 ;}
};

Node arr[N<<2][N<<1] ;//第二維爲N過不了
int dimension[N<<2] ;
bool flag[N<<2][N<<1] ;
int x1 , y1 , x2 , y2 ;
int n ;
int dim ;
int ans ;

void build(int l , int r , int site , int dimen) {
	arr[site][dimen].lson = l ; arr[site][dimen].rson = r ;
	flag[site][dimen] = false ;
	if(dimen == 0) {
		dimension[site] = dim ;
		build(1 , n , 1 , dim++) ;
	}
	if(l == r) return ;
	int mid = arr[site][dimen].mid() ;
	build(l , mid , site<<1 , dimen) ;
	build(mid+1 , r , site<<1|1 , dimen) ;
}

void update(int site , int dimen) {
	if(dimen == 0 && x1 <= arr[site][dimen].lson && arr[site][dimen].rson <= x2) {
		update(1 , dimension[site]) ;
		return ;
	}else if(dimen != 0 && y1 <= arr[site][dimen].lson && arr[site][dimen].rson <= y2) {
		flag[site][dimen] = !flag[site][dimen] ;
		return ;
	}
	if(arr[site][dimen].lson == arr[site][dimen].rson) return ;
	int mid = arr[site][dimen].mid() ;
	if(dimen == 0 && x1 <= mid || dimen != 0 && y1 <= mid) update(site<<1 , dimen) ;
	if(dimen == 0 && x2 > mid || dimen != 0 && y2 > mid) update(site<<1|1 , dimen) ;
}

void query(int site , int dimen) {
	if(dimen == 0 && arr[site][dimen].lson <= x1 && x1 <= arr[site][dimen].rson) {
		query(1 , dimension[site]) ;
	}else if(dimen != 0 && arr[site][dimen].lson <= y1 && y1 <= arr[site][dimen].rson) {
		if(flag[site][dimen]) ++ans ;
	}
	if(arr[site][dimen].lson == arr[site][dimen].rson) return ;
	int mid = arr[site][dimen].mid() ;
	if(dimen == 0 && x1 <= mid || dimen != 0 && y1 <= mid) query(site<<1 , dimen) ;
	if(dimen == 0 && x1 > mid || dimen != 0 && y1 > mid) query(site<<1|1 , dimen) ;
}

int main() {//freopen("data.in" , "r" , stdin);
    //freopen("data1.out" ,"w" , stdout) ;
	int t , m ;
	scanf("%d" ,&t) ;
	while(t--) {
		scanf("%d%d" ,&n ,&m) ;
		dim = 1 ;
		build(1 ,n , 1 , 0) ;
		char s[3] ;
		while(m--) {
			scanf("%s" ,s) ;
			if(s[0] == 'C') {
				scanf("%d%d%d%d" ,&x1 ,&y1 ,&x2 ,&y2) ;
				update(1 , 0) ;
			}else {
				scanf("%d%d" ,&x1 , &y1) ;
				ans = 0 ;
				query(1 , 0) ;
				if(ans&1) printf("1\n") ;
				else printf("0\n");
			}
		}
		if(t) printf("\n");
	}
}



發佈了48 篇原創文章 · 獲贊 5 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章