POJ 2155 二维线段树 修改区间查询点
来源:互联网 发布:nginx lua 全局变量 编辑:程序博客网 时间:2024/06/07 19:40
这道线段树,我用的是完全暴力的方式,中间没有优化;
说实话,简直坑爹,对于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");}}
0 0
- POJ 2155 二维线段树 修改区间查询点
- POJ 2155 Matrix 二维线段树 区间修改 单点查询
- 【POJ2155】Matrix 二维线段树点修改区间查询
- 线段树点修改 区间查询
- hdu 4819 二维线段树,单点修改区间查询
- POJ - 2155 Matrix (二维树状数组 + 区间修改 + 单点求值 或者 二维线段树 + 区间更新 + 单点求值)
- HDOJ-3974(线段树,区间修改点查询)
- 【线段树II:区间修改+点查询】hdu 4031 Attack
- tyvj P1039 线段树点修改和区间查询
- 线段树-点修改区间查询--hdu1166敌兵布阵
- hdu1556(树状数组/线段树,区间修改,点查询)
- hdu5493(线段树,离线操作,点修改,区间查询)
- [线段树][区间修改&&查询]
- POJ 1195 Mobile phones(二维树状数组,点修改,区间查询)
- 线段树区间修改+区间查询
- 线段树(区间修改,区间查询)
- [模板]-线段树-区间修改 + 区间查询
- UVA11992二维线段树区间修改
- hdu 1408 盐水的故事
- JavaScript的一些知识碎片
- 【BZOJ 2243】 [SDOI2011]染色
- c#序列化和反序列化
- C++双冒号::的作用
- POJ 2155 二维线段树 修改区间查询点
- 三种单例模式浅析
- 解决ScrollView下嵌套ListView、GridView显示不全的问题
- Timer和TimerTask完成定时任务
- 为什么 C++ 中成员函数指针是 16 字节?
- UVA 399 The Falling Leaves(二叉树)
- SQL中的GO
- linux下的profile工具GNU gprof和Valgrind
- 支持不同屏幕(Supporting Different Screens)