正题

解题思路:https://www.luogu.org/recordnew/lists?uid=52918&pid=P3870


题目大意

n个灯,操作[0,l,r][0,l,r][0,l,r]表示l∼rl\sim rl∼r的灯取反,操作[1,l,r][1,l,r][1,l,r]表示询问l∼rl\sim rl∼r之间有多少灯亮着。


解题思路

分块,对于每个块维护两个值sum,fsum,fsum,f。sum表示这个块有多少个开着的灯,f表示这个块是否取反。
由于有了f所以我们对于块就可以不用取反了。


code

#include<cstdio>
#include<cmath>
#define pos(x) (x-1)/sq+1
#define N 100010
#define T 500
using namespace std;
int n,m,l,r,x,sq,t;
bool a[N],f[T];
int L[T],R[T],sum[T];
void ycl()
{sq=t=sqrt(n);for(int i=1;i<=t;i++){L[i]=(i-1)*t+1;R[i]=i*t;}if(R[t]<n) t++,L[t]=R[t-1]+1,R[t]=n;
}
void change(int l,int r)
{int q=pos(l),p=pos(r);if(q==p){for(int i=l;i<=r;i++)sum[p]+=1-a[i]*2,a[i]=!a[i];}else{for(int i=q+1;i<=p-1;i++)f[i]=!f[i];for(int i=l;i<=R[q];i++)sum[q]+=1-a[i]*2,a[i]=!a[i];for(int i=L[p];i<=r;i++)sum[p]+=1-a[i]*2,a[i]=!a[i];}
}
int ask(int l,int r)
{int ans=0;int q=pos(l),p=pos(r);if(q==p){for(int i=l;i<=r;i++)ans+=a[i];if(f[p]) return r-l+1-ans;return ans;}else{for(int i=q+1;i<=p-1;i++)if(f[i]) ans+=R[i]-L[i]+1-sum[i];else ans+=sum[i];int k=0;for(int i=l;i<=R[q];i++)k+=a[i];if(f[q]) ans+=R[q]-l+1-k;else ans+=k;k=0;for(int i=L[p];i<=r;i++)k+=a[i];if(f[p]) ans+=r-L[p]+1-k;else ans+=k;}return ans;
}
int main()
{scanf("%d%d",&n,&m);ycl();for(int i=1;i<=m;i++){scanf("%d%d%d",&x,&l,&r);if(x) printf("%d\n",ask(l,r));else change(l,r);}
}

P3870-[TJOI2009]开关【分块】相关推荐

  1. P3870 [TJOI2009]开关 线段树 异或

    题目描述 现有N(2 ≤ N ≤ 100000)盏灯排成一排,从左到右依次编号为:1,2,......,N.然后依次执行M(1 ≤ M ≤ 100000)项操作,操作分为两种:第一种操作指定一个区间[ ...

  2. 2018年12月2526日

    小结:昨天因为整理课件,调代码耗费了大量时间,所以没来得及整理作业,这两天主要做的题目是关于树链剖分和线段树的,难度大约都是省选难度,毕竟只要涉及到树链剖分难度就肯定不低. 一. 完成的题目: 洛谷P ...

  3. 上古时期(大雾)的数据结构pdf

    分块+点分治+Treap byWYCby\ WYCby WYC Part1 分块 概念 就是将nnn个数分成若干个块,然后要处理的时候整块一起的加上局部的直接暴力. 如果将块的大小分配好一般每次都是O ...

  4. 分块算法:莫队(持续更新)

    分块,然后捡到莫队 文章目录 分块算法 普通莫队 前言 HDU多校连续两天都遇到了莫队的题,于是蒟蒻缓慢地开始学习莫队算法 初见莫队,只知道是个离线区间工具,以为会有点复杂.但其实基础的莫队很好理解, ...

  5. 【开关】如何理解树状矩阵和交叉点矩阵

    目录 交叉点矩阵开关 树状多路复用(Tree MUX)矩阵开关--阻塞矩阵 非阻塞矩阵 稀疏矩阵 混合解决方案 实现矩阵有两种常见的方法,通过这两种方法的组合,又可以另外产生很多种实现矩阵的方法.通常 ...

  6. [引擎搭建记录] 分块/分簇延迟渲染

    本文知乎地址:https://zhuanlan.zhihu.com/p/66884611 项目地址:https://link.zhihu.com/?target=https%3A//github.co ...

  7. 开关面板如何自己印字_如何自己动手做一个智能开关

    现在的智能家居这么火,对于想自己动手的小伙伴们来说,都想自己去做一些家里使用 的智设备.现在的中国不缺卖唱卖惨的,缺的是能动手创造一些能实际使用的而不是哗众取宠的人,天天喊着要反击外国技术封锁.那么我 ...

  8. java 二分搜索获得大于目标数的第一位_程序员常用查找算法(顺序、二分、插值、分块、斐波那契)...

    顺序查找 基本思想 属于线性查找和无序查找,从一端开始顺序扫描,直到找到与目标值value相等的元素. 这是最基本的查找方法,也是时间复杂度最高的查找算法. 在数据过多时,这种方法并不适用. 代码实现 ...

  9. 数据库 大数据访问及分区分块优化方案

    本文导读:当系统要满足每秒数万次的读写请求的需求时,我们可以用分布式计算.编写优良的程序代码.对海量数据进行分区操作.建立广泛的索引.建立缓存机制.加大虚拟内存.分批处理.使用数据仓库和多维数据库存储 ...

最新文章

  1. python使用界面-python 可视化界面
  2. 搭建FastDFS分布式文件方式一(Docker版本)
  3. aspen二元体系共沸组分_超详细 | 手把手教你组分结构预测
  4. Holedox Moving
  5. mongodump 备份还原
  6. 区块链应用开发人员_每个区块链开发人员都应该了解这些Web3和Metamask用例
  7. qt5.8连接mysql代码_qt5.8如何连接mysql
  8. java 排序 内存_Java内存模型(二)——重排序
  9. 春运期间长江海事局开辟四类运输“绿色通道”
  10. matlab输入变量 复数,Matlab带符号变量的复数运算及其画图问题
  11. Network 第九篇 - 双机热备-HSRP
  12. 推荐!这款3D全场景编辑器,能快速搭建三维大场景
  13. 应用商店应用计算机,应用市场电脑版
  14. kubernetes使用二进制方法安装部署k8s的v1.23版本安装步骤
  15. linux更改ntfs格式权限,Gentoo Linux下读写NTFS格式分区(ntfs-3g解决NTFS只读不可写的问题)...
  16. 解决win10每次重启后桌面图标排列混乱的问题。
  17. 编译内核 make modules_install报错make[1]: *** [arch/x86/crypto/aegis128-aesni.ko] Error 1 Makefile:1281: r
  18. 错误:没有找到合适的设备:没有找到可用于链接System eth0 的设备
  19. 视频服务器信号转换器,DVI转换器
  20. Linux 二进制文件 甲壳,河蚌的身体外面有坚硬的贝壳,因此它属于甲壳动物.______....

热门文章

  1. js 浅拷贝直接赋值_浅析JavaScript解析赋值、浅拷贝和深拷贝的区别
  2. websocket文档_WebSocket推送 原理扫盲到上手实践
  3. make: *** 没有规则可制作目标“distclean”。 停止。_Makefile伪目标
  4. 墨迹天气语音包_小米有品“智能AI翻译机”评测,还内置了语音助手,随身WiFi功能...
  5. linux开发板显示横向彩虹,给 Linux 终端的输出添加彩虹特效的命令
  6. 81. 搜索旋转排序数组 II(014)二分查找+思路+详解+二种做法
  7. Java当中包装类的理解和一些常用方法的分享(学习后分享)
  8. 紧跟月影大佬的步伐,一起来学习如何写好JS(上)
  9. java swing 面试题_下面有关JAVA swing的描述,说法错误的是?
  10. [数据结构]对称矩阵和三角矩阵压缩公式