洛谷p3801:红色的幻想乡

初见完全没有思路.....感觉像是线段树 但二维感觉完全不可做嘛
于是只能去看了看题解 然而还是疯狂爆零+WA..
和yycc神犇调了两三个小时才调出来...
——————以下个人理解
考虑到每次的修改都是对整行和整列进行操作
可以把每行缩成一个点 这样修改就相当于对这个点进行单点修改
同理也把每列缩成一个点
那么对于每一次修改操作 我们只需要将这个点的横坐标与纵坐标进行修改即可
也就是维护两棵线段树,分别表示行和列
显然可以看出对于图里的每一个点,只有有红雾和没红雾两种状态,并且又说两次红雾会抵消
于是每一次修改就相当于做一次取反操作 还需要支持的另一个操作就是朴素的区间求和
但这显然不是正解 因为每一次操作时实际对于蕾咪所在的那个点是完全没有影响的 而在我们的修改时没有考虑到这一点
似乎没有什么好办法?......好像标记的话会退化回O(Nlogn)....
当然是选择容斥它辣.....但是蒟蒻博主也不会...我太弱啦!
又请教了一下yycc神犇
画图可知 a条横着的直线与b条竖着的直线的交点数为a*b
而每一个交点我们在横竖修改的时候都分别对他对多标记了一次
所以只需在结果上减去一个ansx*ansy*2就是答案了
码农题
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<limits.h>
#include<ctime>
#define N 1000001
typedef long long ll;
const int inf=0x3fffffff;
const int maxn=2017;
using namespace std;
inline ll read()
{
ll f=1,x=0;char ch=getchar();
while(ch>'9'|ch<'0')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch<='9'&&ch>='0')
{
x=(x<<3)+(x<<1)+ch-'0';
ch=getchar();
}
return f*x;
}
struct tsdl{
ll w;
}xtr[N],ytr[N];
void updatex(ll l,ll r,ll pos,ll x)
{
if(l==r)
{
xtr[pos].w^=1;
return;
}
ll mid=l+r>>1;
if(mid>=x)updatex(l,mid,pos<<1,x);
else updatex(mid+1,r,pos<<1|1,x);
xtr[pos].w=xtr[pos<<1].w+xtr[pos<<1|1].w;
}
void updatey(ll l,ll r,ll pos,ll x)
{
if(l==r)
{
ytr[pos].w^=1;
return;
}
ll mid=l+r>>1;
if(mid>=x)updatey(l,mid,pos<<1,x);
else updatey(mid+1,r,pos<<1|1,x);
ytr[pos].w=ytr[pos<<1].w+ytr[pos<<1|1].w;
}
ll queryx(ll l,ll r,ll a,ll b,ll pos)
{
if(l>=a&&r<=b)
{
return xtr[pos].w;
}
ll ans=0;
ll mid=l+r>>1;
if(mid>=a)ans+=queryx(l,mid,a,b,pos<<1);
if(mid<b)ans+=queryx(mid+1,r,a,b,pos<<1|1);
return ans;
}
ll queryy(ll l,ll r,ll a,ll b,ll pos)
{
if(l>=a&&r<=b)
{
return ytr[pos].w;
}
ll ans=0;
ll mid=l+r>>1;
if(mid>=a)ans+=queryy(l,mid,a,b,pos<<1);
if(mid<b)ans+=queryy(mid+1,r,a,b,pos<<1|1);
return ans;
}
int main()
{
ll n=read(),m=read(),k=read();
while(k--)
{
ll opt=read();
switch(opt)
{
case 1:
{
ll x=read(),y=read();
updatex(1,n,1,x);
updatey(1,m,1,y);
break;
}
case 2:
{
ll ans=0;
ll xa=read(),ya=read(),xb=read(),yb=read();
ll ansx=queryx(1,n,xa,xb,1);
ll ansy=queryy(1,m,ya,yb,1);
cout<<ansy*(xb-xa+1)+ansx*(yb-ya+1)-ansx*ansy*2<<endl;
}
}
}
}

洛谷p3801:红色的幻想乡的更多相关文章
- 洛谷——P3801 红色的幻想乡
P3801 红色的幻想乡 推荐阅读 https://blog.csdn.net/qq_41252892/article/details/79035942 非常清楚 线段树单点修改 emmm没什么了 # ...
- 洛谷 P3801 红色的幻想乡
题目背景 蕾米莉亚的红雾异变失败后,很不甘心. 题目描述 经过上次失败后,蕾米莉亚决定再次发动红雾异变,但为了防止被灵梦退治,她决定将红雾以奇怪的阵势释放. 我们将幻想乡看做是一个n*m的方格地区,一 ...
- [luogu P3801] 红色的幻想乡 [线段树][树状数组]
题目背景 蕾米莉亚的红雾异变失败后,很不甘心. 题目描述 经过上次失败后,蕾米莉亚决定再次发动红雾异变,但为了防止被灵梦退治,她决定将红雾以奇怪的阵势释放. 我们将幻想乡看做是一个n*m的方格地区,一 ...
- 【洛谷3345_BZOJ3924】[ZJOI2015]幻想乡战略游戏(点分树)
大概有整整一个月没更博客了 -- 4 月为省选爆肝了一个月,最后压线进 B 队,也算给 NOIP2018 翻车到 316 分压线省一这个折磨了五个月的 debuff 画上了一个不算太差的句号.结果省选 ...
- luogu P3801 红色的幻想乡
嘟嘟嘟 首先人人都能想到是线段树,不过二维线段树肯定会MLE+TLE的. 我们换一种想法,不去修改整个区间,而是修改一个点:开横竖两个线段树,分别记录哪些行和列被修改了.因为如果两阵红雾碰撞,则会因为 ...
- AC日记——红色的幻想乡 洛谷 P3801
红色的幻想乡 思路: 线段树+容斥原理: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 #de ...
- [luogu3801]红色的幻想乡
题目描述 经过上次失败后,蕾米莉亚决定再次发动红雾异变,但为了防止被灵梦退治,她决定将红雾以奇怪的阵势释放. 我们将幻想乡看做是一个n*m的方格地区,一开始没有任何一个地区被红雾遮盖.蕾米莉亚每次站在 ...
- 洛谷P3224 [HNOI2012]永无乡(线段树合并+并查集)
题目描述 永无乡包含 nnn 座岛,编号从 111 到 nnn ,每座岛都有自己的独一无二的重要度,按照重要度可以将这 nnn 座岛排名,名次用 111 到 nnn 来表示.某些岛之间由巨大的桥连接, ...
- 洛谷 P3224 [HNOI2012]永无乡
题面 永无乡包含 \(n\) 座岛,编号从 \(1\) 到 \(n\) ,每座岛都有自己的独一无二的重要度,按照重要度可以将这 \(n\) 座岛排名,名次用 \(1\) 到 \(n\) 来表示.某些岛 ...
随机推荐
- 【汇编语言】DOXBox 0.74 常用debug命令
1.查看.修改寄存器(r命令) ①-r ②-r ax(要修改的寄存器) -:m(输入想要改成什么值) 2.查看内存单元(d命令) ①-d 查看128个内存单元内容. ②-d 段地址:偏移地址 查看指 ...
- sql注入--双查询报错注入原理探索
目录 双查询报错注入原理探索 part 1 场景复现 part 2 形成原因 part 3 报错原理 part 4 探索小结 双查询报错注入原理探索 上一篇讲了双查询报错查询注入,后又参考了一些博客, ...
- 《NFC开发实战详解》笔记
地点:30教 5楼 男厕对面 * 时间:下午三点 * 天气:中雨 * 状态:3 * ******************************************************* ...
- 2018-2019-2 网络对抗技术 20165337 Exp4 恶意代码分析
1.实践目标 1.1是监控你自己系统的运行状态,看有没有可疑的程序在运行. 1.2是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件:分析工具尽量使用原生指令或sysinternals,sys ...
- git本机服务器配置(一):git的安装
1. 下载git的Windows版本 https://gitforwindows.org/ 2. 安装 点击next 不需要更改,直接点击next 配置git编辑器,我安装了notepad++所以就选 ...
- Python中字符串二三事
首先说两个运算符: " == " 运算符测试值的等价性,递归地比较所有内嵌对象 " is " 表达式测试对象的同一性,测试两者是否为同一对象(是否为同一地址) ...
- RSA加密解密算法
/** * RSA加密解密算法 * Class Rsa */ class Rsa { /** * 获取pem格式的公钥 * @param $public_key 公钥文件路径或者字符串 * @retu ...
- VMware workstation 上克隆CentOS 6.x 系统后网卡无法启动的问题
在日常学习中,我们往往没有足够的物理机资源来搭建多节点的实验环境,一个比较好的解决方案就是利用虚拟机来模拟物理机完成实验. 这样一来,多节点操作系统的部署就可以利用VMware 自带的系统“克隆”功能 ...
- c编译步骤
这几天查编译问题时,在头文件中加入某些错误信息,却发现没有编译报错.想了一下可能是,还未进行到语法分析阶段. 这里再了解一下编译过程. 一般而言代码编译包含了四个阶段的处理,即预处理(也称预编译,Pr ...
- git clone下载代码
下载master代码git clone http://username:password@git.wondershare.cn/XXX.git 下载指定develop分支代码git clone -b ...