初见完全没有思路.....感觉像是线段树 但二维感觉完全不可做嘛

于是只能去看了看题解 然而还是疯狂爆零+WA..

和yycc神犇调了两三个小时才调出来...

——————以下个人理解

考虑到每次的修改都是对整行和整列进行操作

可以把每行缩成一个点 这样修改就相当于对这个点进行单点修改

同理也把每列缩成一个点

那么对于每一次修改操作 我们只需要将这个点的横坐标与纵坐标进行修改即可

也就是维护两棵线段树,分别表示行和列

显然可以看出对于图里的每一个点,只有有红雾和没红雾两种状态,并且又说两次红雾会抵消

于是每一次修改就相当于做一次取反操作 还需要支持的另一个操作就是朴素的区间求和

但这显然不是正解 因为每一次操作时实际对于蕾咪所在的那个点是完全没有影响的 而在我们的修改时没有考虑到这一点

似乎没有什么好办法?......好像标记的话会退化回O(Nlogn)....

当然是选择容斥它辣.....但是蒟蒻博主也不会...我太弱啦!

又请教了一下yycc神犇

画图可知 a条横着的直线与b条竖着的直线的交点数为a*b

而每一个交点我们在横竖修改的时候都分别对他对多标记了一次

所以只需在结果上减去一个ansx*ansy*2就是答案了

码农题

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cmath>
  6. #include<queue>
  7. #include<stack>
  8. #include<set>
  9. #include<map>
  10. #include<limits.h>
  11. #include<ctime>
  12. #define N 1000001
  13. typedef long long ll;
  14. const int inf=0x3fffffff;
  15. const int maxn=2017;
  16. using namespace std;
  17. inline ll read()
  18. {
  19. ll f=1,x=0;char ch=getchar();
  20. while(ch>'9'|ch<'0')
  21. {
  22. if(ch=='-')
  23. f=-1;
  24. ch=getchar();
  25. }
  26. while(ch<='9'&&ch>='0')
  27. {
  28. x=(x<<3)+(x<<1)+ch-'0';
  29. ch=getchar();
  30. }
  31. return f*x;
  32. }
  33. struct tsdl{
  34. ll w;
  35. }xtr[N],ytr[N];
  36. void updatex(ll l,ll r,ll pos,ll x)
  37. {
  38. if(l==r)
  39. {
  40. xtr[pos].w^=1;
  41. return;
  42. }
  43. ll mid=l+r>>1;
  44. if(mid>=x)updatex(l,mid,pos<<1,x);
  45. else updatex(mid+1,r,pos<<1|1,x);
  46. xtr[pos].w=xtr[pos<<1].w+xtr[pos<<1|1].w;
  47. }
  48. void updatey(ll l,ll r,ll pos,ll x)
  49. {
  50. if(l==r)
  51. {
  52. ytr[pos].w^=1;
  53. return;
  54. }
  55. ll mid=l+r>>1;
  56. if(mid>=x)updatey(l,mid,pos<<1,x);
  57. else updatey(mid+1,r,pos<<1|1,x);
  58. ytr[pos].w=ytr[pos<<1].w+ytr[pos<<1|1].w;
  59. }
  60. ll queryx(ll l,ll r,ll a,ll b,ll pos)
  61. {
  62. if(l>=a&&r<=b)
  63. {
  64. return xtr[pos].w;
  65. }
  66. ll ans=0;
  67. ll mid=l+r>>1;
  68. if(mid>=a)ans+=queryx(l,mid,a,b,pos<<1);
  69. if(mid<b)ans+=queryx(mid+1,r,a,b,pos<<1|1);
  70. return ans;
  71. }
  72. ll queryy(ll l,ll r,ll a,ll b,ll pos)
  73. {
  74. if(l>=a&&r<=b)
  75. {
  76. return ytr[pos].w;
  77. }
  78. ll ans=0;
  79. ll mid=l+r>>1;
  80. if(mid>=a)ans+=queryy(l,mid,a,b,pos<<1);
  81. if(mid<b)ans+=queryy(mid+1,r,a,b,pos<<1|1);
  82. return ans;
  83. }
  84. int main()
  85. {
  86. ll n=read(),m=read(),k=read();
  87. while(k--)
  88. {
  89. ll opt=read();
  90. switch(opt)
  91. {
  92. case 1:
  93. {
  94. ll x=read(),y=read();
  95. updatex(1,n,1,x);
  96. updatey(1,m,1,y);
  97. break;
  98. }
  99. case 2:
  100. {
  101. ll ans=0;
  102. ll xa=read(),ya=read(),xb=read(),yb=read();
  103. ll ansx=queryx(1,n,xa,xb,1);
  104. ll ansy=queryy(1,m,ya,yb,1);
  105. cout<<ansy*(xb-xa+1)+ansx*(yb-ya+1)-ansx*ansy*2<<endl;
  106. }
  107. }
  108. }
  109. }

洛谷p3801:红色的幻想乡的更多相关文章

  1. 洛谷——P3801 红色的幻想乡

    P3801 红色的幻想乡 推荐阅读 https://blog.csdn.net/qq_41252892/article/details/79035942 非常清楚 线段树单点修改 emmm没什么了 # ...

  2. 洛谷 P3801 红色的幻想乡

    题目背景 蕾米莉亚的红雾异变失败后,很不甘心. 题目描述 经过上次失败后,蕾米莉亚决定再次发动红雾异变,但为了防止被灵梦退治,她决定将红雾以奇怪的阵势释放. 我们将幻想乡看做是一个n*m的方格地区,一 ...

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

    题目背景 蕾米莉亚的红雾异变失败后,很不甘心. 题目描述 经过上次失败后,蕾米莉亚决定再次发动红雾异变,但为了防止被灵梦退治,她决定将红雾以奇怪的阵势释放. 我们将幻想乡看做是一个n*m的方格地区,一 ...

  4. 【洛谷3345_BZOJ3924】[ZJOI2015]幻想乡战略游戏(点分树)

    大概有整整一个月没更博客了 -- 4 月为省选爆肝了一个月,最后压线进 B 队,也算给 NOIP2018 翻车到 316 分压线省一这个折磨了五个月的 debuff 画上了一个不算太差的句号.结果省选 ...

  5. luogu P3801 红色的幻想乡

    嘟嘟嘟 首先人人都能想到是线段树,不过二维线段树肯定会MLE+TLE的. 我们换一种想法,不去修改整个区间,而是修改一个点:开横竖两个线段树,分别记录哪些行和列被修改了.因为如果两阵红雾碰撞,则会因为 ...

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

    红色的幻想乡 思路: 线段树+容斥原理: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 100005 #de ...

  7. [luogu3801]红色的幻想乡

    题目描述 经过上次失败后,蕾米莉亚决定再次发动红雾异变,但为了防止被灵梦退治,她决定将红雾以奇怪的阵势释放. 我们将幻想乡看做是一个n*m的方格地区,一开始没有任何一个地区被红雾遮盖.蕾米莉亚每次站在 ...

  8. 洛谷P3224 [HNOI2012]永无乡(线段树合并+并查集)

    题目描述 永无乡包含 nnn 座岛,编号从 111 到 nnn ,每座岛都有自己的独一无二的重要度,按照重要度可以将这 nnn 座岛排名,名次用 111 到 nnn 来表示.某些岛之间由巨大的桥连接, ...

  9. 洛谷 P3224 [HNOI2012]永无乡

    题面 永无乡包含 \(n\) 座岛,编号从 \(1\) 到 \(n\) ,每座岛都有自己的独一无二的重要度,按照重要度可以将这 \(n\) 座岛排名,名次用 \(1\) 到 \(n\) 来表示.某些岛 ...

随机推荐

  1. 中标麒麟龙芯平台--docker基础镜像制作

    Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源.Docker 的出现为开发人员和运维人员带来了极大的便利.Docker在X86下常见的发行版Linux如Ub ...

  2. C. Neko does Maths(数论 二进制枚举因数)

     题目链接:https://codeforces.com/contest/1152/problem/C 题目大意:给你a和b,然后让你找到一个k,使得a+k和b+k的lcm. 学习网址:https:/ ...

  3. centos7.6设置sftp服务

    sftp是Secure File Transfer Protocol的缩写,安全文件传送协议. CentOS自带 SSH 服务,直接配置即可 1. 查看ssh版本 sftp是基于ssh协议的,首先查看 ...

  4. 吴恩达《机器学习》课程笔记——第六章:Matlab/Octave教程

    上一篇  ※※※※※※※※  [回到目录]  ※※※※※※※※  下一篇 这一章的内容比较简单,主要是MATLAB的一些基础教程,如果之前没有学过matlab建议直接找一本相关书籍,边做边学,matl ...

  5. L2-005 集合相似度 (25 分) (STL——set)

    链接:https://pintia.cn/problem-sets/994805046380707840/problems/994805070149828608 题目: 给定两个整数集合,它们的相似度 ...

  6. Spring Cloud 2-Config 分布式配置中心(七)

    Spring Cloud  Config  1.github配置 2.服务端配置 pom.xml application.xml Application.java 3.配置和命名 1. 配置加载顺序 ...

  7. Django-CSRF,AJAX,FORM

    内容总览1.CSRF相关1>CSRF源码分析2>ajax的实现(ajax的实例(异步计算,参数测试,上传))3>ajax通过csrf的校验 2.FORM组件1>基本使用2> ...

  8. 023_System Integrity Protection in macos

    背景:之前写的在/usr/bin下的一个登陆线上脚本,由于使用timemachine还原了系统,发现怎么也修改不了,加sudo也不行. 后来查询才得知系统默认开启了"系统集成保护" ...

  9. 帆软报表(finereport)使用row_number ()进行组内排序

    ROW_NUMBER()函数将针对SELECT语句返回的每一行,从1开始编号,赋予其连续的编号.在查询时应用了一个排序标准后,只有通过编号才能够保证其顺序是一致的,当使用ROW_NUMBER函数时,也 ...

  10. CF666E Forensic Examination [后缀自动机,线段树合并]

    洛谷 Codeforces 思路 最初的想法:后缀数组+区间众数,似乎并不能过. 既然后缀数组不行,那就按照套路建出广义SAM,然后把\(S\)放在上面跑,得到以每个点结尾会到SAM上哪个节点. 询问 ...