您的位置:首页 > 其它

POJ 2155 二维线段树 修改区间查询点

2014-12-05 14:55 399 查看
这道线段树,我用的是完全暴力的方式,中间没有优化;

说实话,简直坑爹,对于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");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐