红色的幻想乡

题目背景

蕾米莉亚的红雾异变失败后,很不甘心。

题目描述

经过上次失败后,蕾米莉亚决定再次发动红雾异变,但为了防止被灵梦退治,她决定将红雾以奇怪的阵势释放。

我们将幻想乡看做是一个n*m的方格地区,一开始没有任何一个地区被红雾遮盖。蕾米莉亚每次站在某一个地区上,向东南西北四个方向各发出一条无限长的红雾,可以影响到整行/整列,但不会影响到她所站的那个地区。如果两阵红雾碰撞,则会因为密度过大而沉降消失。灵梦察觉到了这次异变,决定去解决它。但在解决之前,灵梦想要了解一片范围红雾的密度。可以简述为两种操作:

1 x y 蕾米莉亚站在坐标(x,y)的位置向四个方向释放无限长的红雾。

2 x1 y1 x2 y2 询问左上点为(x1,y1),右下点为(x2,y2)的矩形范围内,被红雾遮盖的地区的数量。

输入输出格式

输入格式:

第一行三个整数n,m,q,表示幻想乡大小为n*m,有q个询问。

接下来q行,每行3个或5个整数,用空格隔开,含义见题目描述。

输出格式:

对于每一个操作2,输出一行一个整数,表示对应询问的答案。

输入输出样例

输入样例#1:

4 4 3
1 2 2
1 4 4
2 1 1 4 4

输出样例#1:

8

说明

样例解释:

用o表示没有红雾,x表示有红雾,两次释放红雾后幻想乡地图如下:

oxox

xoxo

oxox

xoxo

数据范围:

对于20%的数据,1<=n,m,q<=200

对于 40%的数据,1<=n,m,q<=1000

对于100%的数据,1<=n,m,q<=100000

1<=x1,x2,x<=n x1<=x2

1<=y1,y2,y<=m y1<=y2

by-orangebird

 线段树的运用。

用两个线段树表示行和列,维护第x行,第y列有没有放过雾

由于两片红雾会抵消,相当于每次修改,对应行^=1,对应列^=1。

每一次询问,即区间求和。令x=∑c1[x2-x1],y=∑c2[y2-y1];

由容斥原理,可知ans=x*(y2-y1+1)+y*(x2-x1+1)-x*y*2;

记得开long long

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int c1[400001],c2[400001],n,m,q;
void addh(int rt,int l,int r,int x)
{
	if (l==r)
	{
		c1[rt]^=1;
		return;
	}
	int mid=(l+r)/2;
	if (x<=mid) addh(rt*2,l,mid,x);
	else addh(rt*2+1,mid+1,r,x);
 c1[rt]=c1[rt*2]+c1[rt*2+1];
}
void addl(int rt,int l,int r,int x)
{
	if (l==r)
	{
		c2[rt]^=1;
		return;
	}
	int mid=(l+r)/2;
	if (x<=mid) addl(rt*2,l,mid,x);
	else addl(rt*2+1,mid+1,r,x);
 c2[rt]=c2[rt*2]+c2[rt*2+1];
}
int geth(int rt,int l,int r,int L,int R)
{
	if (l>=L&&r<=R)
	{
		return c1[rt];
	}
	 int mid=(l+r)/2;
	int s=0;
	 if (L<=mid) s+=geth(rt*2,l,mid,L,R);
	 if (R>mid) s+=geth(rt*2+1,mid+1,r,L,R);
	return s;
}
int getl(int rt,int l,int r,int L,int R)
{
	if (l>=L&&r<=R)
	{
		return c2[rt];
	}
	 int mid=(l+r)/2;
	int s=0;
	 if (L<=mid) s+=getl(rt*2,l,mid,L,R);
	 if (R>mid) s+=getl(rt*2+1,mid+1,r,L,R);
	return s;
}
int main()
{int i,j,ch,x,y,x1,x2,y1,y2;
   scanf("%d%d%d",&n,&m,&q);
    for (i=1;i<=q;i++)
    {
    	scanf("%d",&ch);
    	if (ch==1)
    	{
    		scanf("%d%d",&x,&y);
    		addh(1,1,n,x);
    		addl(1,1,n,y);
    	}
    	if (ch==2)
    	{
    		scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
                int x=geth(1,1,n,x1,x2);
		   int y=getl(1,1,n,y1,y2);
		   printf("%lld\n",y*(long long)(x2-x1+1)+x*(long long)(y2-y1+1)-(long long)x*y*2);
    	}
    }
}

  

时间: 2024-10-11 11:47:25

红色的幻想乡的相关文章

AC日记——红色的幻想乡 洛谷 P3801

红色的幻想乡 思路: 线段树+容斥原理: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 #define maxm maxn<<2 #define ll long long class TreeType { private: int L[maxm],R[maxm],mid[maxm],dis[maxm]; public: void build(int now,int l,int r) { L

[luogu P3801] 红色的幻想乡 [线段树][树状数组]

题目背景 蕾米莉亚的红雾异变失败后,很不甘心. 题目描述 经过上次失败后,蕾米莉亚决定再次发动红雾异变,但为了防止被灵梦退治,她决定将红雾以奇怪的阵势释放. 我们将幻想乡看做是一个n*m的方格地区,一开始没有任何一个地区被红雾遮盖.蕾米莉亚每次站在某一个地区上,向东南西北四个方向各发出一条无限长的红雾,可以影响到整行/整列,但不会影响到她所站的那个地区.如果两阵红雾碰撞,则会因为密度过大而沉降消失.灵梦察觉到了这次异变,决定去解决它.但在解决之前,灵梦想要了解一片范围红雾的密度.可以简述为两种操

LG3801 红色的幻想乡 线段树+容斥原理

问题描述 经过上次失败后,蕾米莉亚决定再次发动红雾异变,但为了防止被灵梦退治,她决定将红雾以奇怪的阵势释放. 我们将幻想乡看做是一个 \(n \times m\) 的方格地区,一开始没有任何一个地区被红雾遮盖.蕾米莉亚每次站在某一个地区上,向东南西北四个方向各发出一条无限长的红雾,可以影响到整行/整列,但不会影响到她所站的那个地区.如果两阵红雾碰撞,则会因为密度过大而沉降消失.灵梦察觉到了这次异变,决定去解决它.但在解决之前,灵梦想要了解一片范围红雾的密度.可以简述为两种操作: 1 x y 蕾米

洛谷p3801:红色的幻想乡

初见完全没有思路.....感觉像是线段树 但二维感觉完全不可做嘛 于是只能去看了看题解 然而还是疯狂爆零+WA.. 和yycc神犇调了两三个小时才调出来... ——————以下个人理解 考虑到每次的修改都是对整行和整列进行操作 可以把每行缩成一个点 这样修改就相当于对这个点进行单点修改 同理也把每列缩成一个点 那么对于每一次修改操作 我们只需要将这个点的横坐标与纵坐标进行修改即可 也就是维护两棵线段树,分别表示行和列 显然可以看出对于图里的每一个点,只有有红雾和没红雾两种状态,并且又说两次红雾会

luogu3801 红色的幻想乡

题目大意 给一个初始值都是0的0-1矩阵,两个操作:1.选择一个点,将其所在排和列(不包括该点)的数字取反.2.求一个子矩形内的数字和.n,m,q<=100000. 错误思路 为何不能用二维线段树 n,m<=100000,每个x线段树都维护一个有400000个节点的Y线段树,而X节点也要400000个,空间受不了. 如果我们要更新一排,X线段树没有达到"排除一半"的功能,必须遍历到所有X.Y节点,时间受不了. 假命题:将所在排列其它数字取反,等价于把选择的点的数字取反 与后

P3801 红色的幻想乡

基本的线段树和容斥原理 我好菜啊! 题目中其实有一点拐了弯:她把两团雾气中和沉降和在原地放置两种情况分开了. 但你只要画个图就能发现:在都有标记的行和列上,一旦有交叉,这个点就是没雾气的. 在一个点放置雾气,相当于在一行和一列都放了雾气. 一个区域内的雾气,相当于所有有标记的行和列占的总面积再减掉那些沉降掉的. 不难发现:当在行中放了\(x\)个雾气,在列中放了\(y\)个雾气时,被中和掉的就有\(xy\)个. 其实也不难算的,手膜一下就知道了. 代码: #include<cstdio> co

[Zjoi2015]诸神眷顾的幻想乡

[Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1537  Solved: 892 Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看.幽香当然也非常高兴啦. 这时幽香发现了一件非常有趣的事情,太阳花田有n块空地.在过去,幽香为了方便,在这n块空地之间修建了n-1条

【BZOJ3926】[Zjoi2015]诸神眷顾的幻想乡 广义后缀自动机

[BZOJ3926][Zjoi2015]诸神眷顾的幻想乡 Description 幽香是全幻想乡里最受人欢迎的萌妹子,这天,是幽香的2600岁生日,无数幽香的粉丝到了幽香家门前的太阳花田上来为幽香庆祝生日. 粉丝们非常热情,自发组织表演了一系列节目给幽香看.幽香当然也非常高兴啦. 这时幽香发现了一件非常有趣的事情,太阳花田有n块空地.在过去,幽香为了方便,在这n块空地之间修建了n-1条边将它们连通起来.也就是说,这n块空地形成了一个树的结构. 有n个粉丝们来到了太阳花田上.为了表达对幽香生日的祝

BZOJ 4596: [Shoi2016]黑暗前的幻想乡

4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 408  Solved: 232[Submit][Status][Discuss] Description 四年一度的幻想乡大选开始了,最近幻想乡最大的问题是很多来历不明的妖 怪涌入了幻想乡,扰乱了幻想乡昔日的秩序.但是幻想乡的建制派妖怪(人类) 博丽灵梦和八云紫等人整日高谈所有妖怪平等,幻想乡多元化等等,对于幻想乡 目前面临的种种大问题却给不出合适的解