POJ 2155 二维线段树 修改区间查询点
2014-12-05 14:55
399 查看
这道线段树,我用的是完全暴力的方式,中间没有优化;
说实话,简直坑爹,对于n长度的区间的线段树 ,它的节点数目为N左右,第二维开N的大小居然过不了 ,真是
了,检查了好久好久,本来昨天就该过的,真坑爹!!!!
方法:二维线段树 ( 树套树 ) ,修改区间查询点;
说实话,简直坑爹,对于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"); } }
相关文章推荐
- POJ 2155 Matrix 二维线段树 区间修改 单点查询
- POJ - 2155 Matrix (二维树状数组 + 区间修改 + 单点求值 或者 二维线段树 + 区间更新 + 单点求值)
- POJ - 2155 Matrix(二维线段树、区间更新单点查询)
- POJ 2155 Matrix (二维线段树入门,成段更新,单点查询 / 二维树状数组,区间更新,单点查询)
- POJ 2155-Matrix(二维树状数组-区间修改 单点查询)
- POJ 2155 二维线段树 经典的记录所有修改再统一遍历 单点查询
- POJ2155【二维树状数组,区间修改,点查询?】【又被输入输出坑】
- POJ 2155 Matrix(二维树状数组+数组数组区间更新+单点查询)
- poj2155-二维树状数组 区间更新 单点查询
- POJ 1195 Mobile phones(二维树状数组,点修改,区间查询)
- POJ-3468 A Simple Problem with Integers (线段树 入门题 区间修改 区间查询)
- POJ 3468 A Simple Problem with Integers (线段树区间修改查询)
- 树套树:二维线段树初步:hdu1823——Luck and Love(单点修改,区间查询)
- hdu 4819 二维线段树,单点修改区间查询
- 【POJ2155】Matrix 二维线段树点修改区间查询
- 模板(线段树 + 树状数组 + 区间修改 + 区间查询)eg:POJ 3468 - A Simple Problem with Integers
- poj2886线段树(单点修改,区间查询)
- poj 3264 Balanced Lineup(线段树单点修改区间查询)
- POJ 1195 Mobile phones(二维树状数组,点修改,区间查询)
- poj 2155 二维树状数组/区间更新单点查询