POJ 2155 树套树—线段树套线段树

Matrix 楼教主出的题目。

题意:一个矩阵初始值都为0,每次给“C X1 Y1 X2 Y2" 去反转这个矩阵。或者"Q X1 Y1"查询这个点是0/1。

第一次接触树套树的题目。

一句AC:对于基本的线段树,再在每个节点建一个y方向上的线段树。tree[n][m]

这道题目更新的时候,对于X方向就是(X1,X2)这个区间,再在其上对Y1,Y2进行更新。

对于查询,X方向上,自顶向下到X1都要对Y进行查询(更新的区间必包括该点),Y方向上则更新到Y1.

#include <stdio.h>
#include <string.h>
#define MAXN 1005
#define mem(a) memset(a, 0, sizeof(a))

bool tree[MAXN<<2][MAXN<<2];
int  X, N, T;
int num, X1, X2, Y1, Y2;
char ch[10];

void updatey(int yl,int yr,int xp,int yp)
{
	if(Y1<=yl && yr<=Y2)
	{
		tree[xp][yp]=!tree[xp][yp];
		return;
	}
	int mid=(yl+yr)>>1;
	if(Y1<=mid) updatey(yl,mid,xp,yp<<1);
	if(Y2>mid )  updatey(mid+1,yr,xp,yp<<1|1);
}

void updatex(int xl,int xr,int xp)
{
	if(X1<=xl && xr<=X2)
	{
		updatey(1,N,xp,1);
		return;
	}
	int mid=(xl+xr)>>1;//下面这句刚开始写错了,按照build写了,忘记是个更新操作...
	if(X1<=mid) updatex(xl,mid,xp<<1);
	if(X2>mid)  updatex(mid+1,xr,xp<<1|1);
}
void queryy(int yl,int yr,int xp,int yp)
{
	num+=tree[xp][yp];
	if(yl==yr)
		return;
	int mid=(yl+yr)>>1;
	if(Y1<=mid) queryy(yl,mid,xp,yp<<1);
	else queryy(mid+1,yr,xp,yp<<1|1);

}
void queryx(int xl,int xr,int xp)
{
	queryy(1,N,xp,1);
	if(xl==xr)
		return;
	int mid=(xl+xr)>>1;
	if(X1<=mid) queryx(xl,mid,xp<<1);
	else queryx(mid+1,xr,xp<<1|1);
}
int main()
{
    while(~scanf("%d", &X))while(X--)
    {
        mem(tree);
        scanf("%d %d%*c", &N,&T);
        for(int i=0;i<T;i++)
        {
           scanf("%s%d%d",ch,&X1,&Y1);
		   if(ch[0]=='Q') num=0,queryx(1,N,1),printf("%d\n",num%2);
		   else
		   {
			   scanf("%d%d",&X2,&Y2);
			   updatex(1,N,1);
		   }
        }
        if(X) printf("\n");
    }
    return 0;
}
时间: 2024-11-02 01:50:25

POJ 2155 树套树—线段树套线段树的相关文章

POJ 2155 二维线段树

POJ 2155  二维线段树 思路:二维线段树就是每个节点套一棵线段树的树. 刚开始因为题目是求A[I,J],然后在y查询那直接ans^=Map[i][j]的时候没看懂,后面自己把图画出来了才理解. 因为只有0和1,所以可以用异或来搞,而不需要每次都需要修改. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> #incl

POJ 2155 Matrix (二维线段树)

http://poj.org/problem?id=2155 Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 18143   Accepted: 6813 Description Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the i-th row and j-th column. I

POJ 2155 二维线段树 经典的记录所有修改再统一遍历 单点查询

本来是想找一个二维线段树涉及懒惰标记的,一看这个题,区间修改,单点查询,以为是懒惰标记,敲到一半发现这二维线段树就不适合懒惰标记,你更新了某段的某列,但其实其他段的相应列也要打标记,但因为区间不一样,又不好打...也可能是我这是在套用一维线段树的思想,还有更好的二维线段树懒惰标记方法 反正到现在我还没搞定二维线段树的懒惰标记,因为这道题不用懒惰标记,因为是二进制序列,区间修改仅限于翻转操作,那就只要记录每次操作,最后查询的时候从上往下把所有修改都来上一遍,就可以了.就类似于树状数组的第二种用法,

POJ - 2155 Matrix (二维树状数组 + 区间改动 + 单点求值 或者 二维线段树 + 区间更新 + 单点求值)

POJ - 2155 Matrix Time Limit: 3000MS   Memory Limit: 65536KB   64bit IO Format: %I64d & %I64u Submit Status Description Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the i-th row and j-th column. Initially we ha

POJ 2155 Matrix (D区段树)

http://poj.org/problem?id=2155 Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 18143   Accepted: 6813 Description Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the i-th row and j-th column. I

POJ 3468 A Simple Problem with Integers(线段树)

题目链接:http://poj.org/problem?id=3468 A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 56005   Accepted: 16903 Case Time Limit: 2000MS Description You have N integers, A1, A2, ... , AN. You need to deal with

【POJ 2482】 Stars in Your Window(线段树+离散化+扫描线)

[POJ 2482] Stars in Your Window(线段树+离散化+扫描线) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 11294   Accepted: 3091 Description Fleeting time does not blur my memory of you. Can it really be 4 years since I first saw you? I still remembe

【POJ】3468 A Simple Problem with Integers ——线段树 成段更新 懒惰标记

A Simple Problem with Integers Time Limit:5000MS   Memory Limit:131072K Case Time Limit:2000MS Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. One type of operation is to add some given number to each

poj 3468:A Simple Problem with Integers(线段树,区间修改求和)

A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 58269   Accepted: 17753 Case Time Limit: 2000MS Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. One type of

POJ 2886 Who Gets the Most Candies?(线段树模拟约瑟夫环,高合成数)

POJ 2886 Who Gets the Most Candies?(线段树模拟约瑟夫环,高合成数) ACM 题目地址:POJ 2886 Who Gets the Most Candies? 题意: N 个小孩围成一圈,他们被顺时针编号为 1 到 N.每个小孩手中有一个卡片,上面有一个非 0 的数字,游戏从第 K 个小孩开始,他告诉其他小孩他卡片上的数字并离开这个圈,他卡片上的数字 A 表明了下一个离开的小孩,如果 A 是大于 0 的,则下个离开的是左手边第 A 个,如果是小于 0 的, 则是