洛谷P3870 [TJOI2009]开关
2024-10-21 09:08:40
题目描述
现有\(N(2 ≤ N ≤ 100000)\)盏灯排成一排,从左到右依次编号为:\(1,2,......,N\)。然后依次执行\(M(1 ≤ M ≤ 100000)\)项操作,操作分为两种:第一种操作指定一个区间\([a, b]\),然后改变编号在这个区间内的灯的状态(把开着的灯关上,关着的灯打开),第二种操作是指定一个区间\([a, b]\),要求你输出这个区间内有多少盏灯是打开的。灯在初始时都是关着的。
输入输出格式
输入格式:
第一行有两个整数\(N\)和\(M\),分别表示灯的数目和操作的数目。接下来有\(M\)行,每行有三个整数,依次为:\(c, a, b\)。其中\(c\)表示操作的种类,当\(c\)的值为\(0\)时,表示是第一种操作。当\(c\)的值为\(1\)时表示是第二种操作。\(a\)和\(b\)则分别表示了操作区间的左右边界\((1 ≤ a ≤ b ≤ N)\)。
输出格式:
每当遇到第二种操作时,输出一行,包含一个整数:此时在查询的区间中打开的灯的数目。
输入输出样例
输入样例#1:
4 5
0 1 2
0 2 4
1 2 3
0 2 4
1 1 4
输出样例#1:
1
2
思路:还是一道线段树区间异或,思路跟之前做的洛谷P2574和洛谷P2846完全一样。
代码:
#include<cstdio>
#include<cctype>
#define maxn 100007
#define ls rt<<1
#define rs rt<<1|1
using namespace std;
int n,m,sum[maxn<<2],lazy[maxn<<2];
inline int qread() {
char c=getchar();int num=0,f=1;
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) num=num*10+c-'0';
return num*f;
}
inline void pushup(int rt) {
sum[rt]=sum[ls]+sum[rs];
}
inline void pushdown(int rt, int len) {
if(lazy[rt]) {
lazy[ls]^=1;
lazy[rs]^=1;
sum[ls]=(len-(len>>1))-sum[ls];
sum[rs]=(len>>1)-sum[rs];
lazy[rt]=0;
}
}
void modify(int rt, int l, int r, int L, int R) {
if(L>r||R<l) return;
if(L<=l&&r<=R) {
lazy[rt]^=1;
sum[rt]=r-l+1-sum[rt];
return;
}
pushdown(rt,r-l+1);
int mid=(l+r)>>1;
modify(ls,l,mid,L,R),modify(rs,mid+1,r,L,R);
pushup(rt);
}
int csum(int rt, int l, int r, int L, int R) {
if(L>r||R<l) return 0;
if(L<=l&&r<=R) return sum[rt];
pushdown(rt,r-l+1);
int mid=(l+r)>>1;
return csum(ls,l,mid,L,R)+csum(rs,mid+1,r,L,R);
}
int main() {
n=qread(),m=qread();
for(int i=1,k,l,r;i<=m;++i) {
k=qread(),l=qread(),r=qread();
if(!k) modify(1,1,n,l,r);
else printf("%d\n",csum(1,1,n,l,r));
}
return 0;
}
最新文章
- Java集合之HashSet
- 连接MySQL错误:Can&#39;t connect to MySQL server (10060)
- jq 解析josn字符串
- Titanium系列--利用Titanium开发android App实战总结
- c#之线程池
- IE浏览器GET传参后台乱码
- E - Power Strings,求最小周期串
- STM32的外部中断配置及使用
- Hibernate(三)之配置文件详解
- Java UDP实现聊天功能代码
- 深入理解JavaScript的this指向问题
- linux抓包工具Charles的配置安装
- python 一些方法函数
- Zabbix3.0学习笔记
- 编码(encode和decode)
- STL-queue和循环队列基本操作的实现
- 【洛谷 P2726】 [SHOI2005]树的双中心(树的重心)
- swddude -- A SWD programmer for ARM Cortex microcontrollers.
- Visio2010建立ER图并直接导出为SQL语句
- Centos7 redis 5.0 服务设置、启动、停止、开机启动
热门文章
- QWidget上下文菜单处理函数
- gcc 4.8.5安装
- 批量处理JDBC语句提高处理速度
- js基础:关于Boolean() 与 if
- 使用MDI窗体实现多窗口效果
- [转]各种开源协议介绍 BSD、Apache Licence、GPL V2 、GPL V3 、LGPL、MIT
- 几个最短路径算法Floyd、Dijkstra、Bellman-Ford、SPFA的比较
- Poj 3903 Stock Exchange(LIS)
- JWT(JSON WEB TOKEN) / oauth2 / SSL
- 【jQuery】praseFloat()方法的用法及注意事项