[luogu3801]红色的幻想乡
题目描述
经过上次失败后,蕾米莉亚决定再次发动红雾异变,但为了防止被灵梦退治,她决定将红雾以奇怪的阵势释放。
我们将幻想乡看做是一个n*m的方格地区,一开始没有任何一个地区被红雾遮盖。蕾米莉亚每次站在某一个地区上,向东南西北四个方向各发出一条无限长的红雾,可以影响到整行/整列,但不会影响到她所站的那个地区。如果两阵红雾碰撞,则会因为密度过大而沉降消失。
灵梦察觉到了这次异变,决定去解决它。但在解决之前,灵梦想要了解一片范围红雾的密度。可以简述为两种操作:
1 x y 蕾米莉亚站在坐标(x,y)的位置向四个方向释放无限长的红雾。
2 x1 y1 x2 y2 询问左上点为(x1,y1),右下点为(x2,y2)的矩形范围内,被红雾遮盖的地区的数量。
解法
因为对于一次修改,一定会修改到底,怎么说的,就是这一列或者是这一整行都被我们修改了,那么我们就可以将这幅图抽象成两条数轴上的操作。
对于每一次的修改,我们只需要单点修改某一个节点上的数。
但是这个节点上需要记录什么信息呢?这种题目很明显用线段树维护比较好(树状数组也很好,但是我还是喜欢线段树),那么要节点要记录的数值有\(l\),和\(r\),除此之外,我们需要知道在这一段区间中,被红雾所覆盖的节点的总数。
然后单点修改就到这里位置。
关于查询操作,我们每次是查询两个线段树的区间和。
我们假设求出求出来的值分别是\(ansx\)和\(ansy\),对于的分别是\(x\)轴上的答案和\(y\)轴上的答案。
然后在定义\(lenx\)和\(leny\)表示查找区间\(x\)的长度和和\(y\)区间的长度。
因为我们知道,两个红雾重合在一起就会被抵消掉,也就是说在查找区间内,所有的\(ansx\)和所有\(ansy\)全都会重合。 为什么?因为每一次修改就一定是修改到底。
那么我们通过容斥原理,如果仅算\(x\)的答案就是\(ansy*x\),也就是当前\(x\)数×有的\(y\),同理\(y\)的答案是\(ansx*y\),但是有消除,所以我们需要\(-\)掉\(2*ansx*ansy\),为什么是\(2*ansx*ansy\),而不是\(ansx*ansy\),因为你不是在去掉重复,而是减掉消除的部分。
ac代码
#include<bits/stdc++.h>
#define LL long long
#define N 100005
using namespace std;
int read(){
int w=0,x=0;char ch=0;
while(!isdigit(ch))w|=ch=='-',ch=getchar();
while(isdigit(ch))x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return w?-x:x;
}
int n,m,q;
struct segment_tree{
#define ls (nod<<1)
#define rs (nod<<1|1)
#define mid ((l+r)>>1)
struct node{
int l,r;
LL s;
}tr[N<<2];
void pushup(int nod){tr[nod].s=tr[ls].s+tr[rs].s;}
void build(int l,int r,int nod){
tr[nod].l=l; tr[nod].r=r; tr[nod].s=0;
if(l==r) return;
build(l,mid,ls);
build(mid+1,r,rs);
}
void update_point(int nod,int k){
int l=tr[nod].l,r=tr[nod].r;
if(l==r){tr[nod].s^=1;return;}
if(k<=mid) update_point(ls,k);
else update_point(rs,k);
pushup(nod);
}
LL query_sec(int nod,int ql,int qr){
int l=tr[nod].l,r=tr[nod].r;
if(ql<=l&&r<=qr) return tr[nod].s;
LL res=0;
if(ql<=mid) res+=query_sec(ls,ql,qr);
if(qr>mid) res+=query_sec(rs,ql,qr);
return res;
}
}tr1,tr2;
int main(){
n=read(),m=read(),q=read();
tr1.build(1,n,1); tr2.build(1,m,1);
while(q--){
int opt=read();
if(opt==1){
int x=read(),y=read();
tr1.update_point(1,x); tr2.update_point(1,y);
}
else{
#define x1 saber
#define x2 archer
#define y1 caster
#define y2 rider
int x1=read(),y1=read(),x2=read(),y2=read();
LL a1=tr1.query_sec(1,x1,x2),a2=tr2.query_sec(1,y1,y2);
LL ans=a1*(LL)(y2-y1+1)+a2*(LL)(x2-x1+1)-a1*a2*2;
printf("%lld\n",ans);
}
}
return 0;
}
对于自己代码的感想
因为\(y1\)成为了关键字,那么就重定义一下(我是一个\(Fate\)迷)QAQ。
[luogu3801]红色的幻想乡的更多相关文章
- AC日记——红色的幻想乡 洛谷 P3801
红色的幻想乡 思路: 线段树+容斥原理: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 #de ...
- 洛谷——P3801 红色的幻想乡
P3801 红色的幻想乡 推荐阅读 https://blog.csdn.net/qq_41252892/article/details/79035942 非常清楚 线段树单点修改 emmm没什么了 # ...
- [luogu P3801] 红色的幻想乡 [线段树][树状数组]
题目背景 蕾米莉亚的红雾异变失败后,很不甘心. 题目描述 经过上次失败后,蕾米莉亚决定再次发动红雾异变,但为了防止被灵梦退治,她决定将红雾以奇怪的阵势释放. 我们将幻想乡看做是一个n*m的方格地区,一 ...
- 洛谷 P3801 红色的幻想乡
题目背景 蕾米莉亚的红雾异变失败后,很不甘心. 题目描述 经过上次失败后,蕾米莉亚决定再次发动红雾异变,但为了防止被灵梦退治,她决定将红雾以奇怪的阵势释放. 我们将幻想乡看做是一个n*m的方格地区,一 ...
- 洛谷p3801:红色的幻想乡
初见完全没有思路.....感觉像是线段树 但二维感觉完全不可做嘛 于是只能去看了看题解 然而还是疯狂爆零+WA.. 和yycc神犇调了两三个小时才调出来... ——————以下个人理解 考虑到每次的修 ...
- luogu P3801 红色的幻想乡
嘟嘟嘟 首先人人都能想到是线段树,不过二维线段树肯定会MLE+TLE的. 我们换一种想法,不去修改整个区间,而是修改一个点:开横竖两个线段树,分别记录哪些行和列被修改了.因为如果两阵红雾碰撞,则会因为 ...
- bzoj3926: [Zjoi2015]诸神眷顾的幻想乡 对[广义后缀自动机]的一些理解
先说一下对后缀自动机的理解,主要是对构造过程的理解. 构造中,我们已经得到了前L个字符的后缀自动机,现在我们要得到L+1个字符的后缀自动机,什么需要改变呢? 首先,子串$[0,L+1)$对应的状态不存 ...
- BZOJ4596: [Shoi2016]黑暗前的幻想乡
Description 四年一度的幻想乡大选开始了,最近幻想乡最大的问题是很多来历不明的妖 怪涌入了幻想乡,扰乱了幻想乡昔日的秩序.但是幻想乡的建制派妖怪(人类) 博丽灵梦和八云紫等人整日高谈所有妖怪 ...
- BZOJ 3926: [Zjoi2015]诸神眷顾的幻想乡
3926: [Zjoi2015]诸神眷顾的幻想乡 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1017 Solved: 599[Submit][S ...
随机推荐
- Ionic App之国际化(1)单个参数的处理
最近的app开发中需要考虑多语言国际化的问题,经查资料,目前大部分使用的是angular-translate.js这个组件,网站说明是这个:https://angular-translate.gith ...
- 轻量级WebApi请求插件:PostMan
时间很宝贵,废话不多说,只说三句,如下: 十年河东,十年河西,莫欺骚年穷!~_~ 打错个字,应该是莫欺少年穷! 学历代表你的过去,能力代表你的现在,学习代表你的将来. 学无止境,精益求精. 本次介绍的 ...
- CF 888E Maximum Subsequence
一道比较套路的题,看到数据范围就差不多有想法了吧. 题目大意:给一个数列和\(m\),在数列任选若干个数,使得他们的和对\(m\)取模后最大 取膜最大,好像不能DP/贪心/玄学乱搞啊.\(n\le35 ...
- [Oracle][DataGuard]Standby数据库文件有损坏时的处理方法
需要参考: [Oracle]Recovering the primary database's datafile using the physical standby, and vice versa ...
- Python3出现"No module named 'MySQLdb'"问题-以及使用PyMySQL连接数据库
Python3 与 Django 连接数据库,出现了报错:Error loading MySQLdb module: No module named 'MySQLdb'.原因如下:在 python2 ...
- 分布式监控系统Zabbix-批量添加聚合图形
之前部署了Zabbix(3.4.4版本)监控环境,由于主机比较多,分的主机组也比较多,添加聚合图形比较麻烦,故采用python脚本进行批量添加聚合图形.脚本下载地址:https://pan.baidu ...
- 【M2】软件工程终期总结报告——阅读作业
PhylabWeb——阅读作业 问题回顾 提问博客地址:http://www.cnblogs.com/kibbon/p/4831104.html 尚待解决的问题: Alpha/Beta,ZBB/RC阶 ...
- 《Linux内核分析》 期中总结
Linux内核分析 期中总结 20135307 张嘉琪 一.Linux内核分析课程总结 学习笔记汇总 第一节 计算机是如何工作的 第二节 操作系统是如何工作的 第三节 构造一个简单的Linux系统Me ...
- 计算机终端安装成功的包 pycharm不能更新
最近在学习python的时候遇到一个麻烦事 要用到pymssql包 在CMD下已经安装成功 但是在pycharm中运行的时候出现 没有这个包 以往的方法是在设置界面 通过+号安装需要的包 但 ...
- React16新特性
React的16版本采用了MIT开源许可证,新增了一些特性. Error Boundary render方法新增返回类型 Portals 支持自定义DOM属性 setState传入null时不会再触发 ...