博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
BZOJ 1230 Usaco2008 Nov 开关灯
阅读量:4922 次
发布时间:2019-06-11

本文共 1182 字,大约阅读时间需要 3 分钟。

【题意概述】

  给出一个01序列,初始时序列全为0,每次有修改操作或询问操作,修改操作要求把L~R区间中的0变成1,1变成0,查询操作要求输出L~R区间的1的个数

【题解】

  线段树。

  每次区间修改把区间的$sum$改为$len-sum$即可。

#include
#include
#define ls (cur<<1)#define rs (cur<<1|1)#define len(x) (a[x].r-a[x].l+1)#define mid ((a[cur].l+a[cur].r)>>1)using namespace std;const int maxn=400010;int n,m,x,y,z;struct tree{int l,r,sum,c;}a[maxn];void read(int &k){ k=0; int f=1; char c=getchar(); while (c<'0'||c>'9')c=='-'&&(f=-1),c=getchar(); while ('0'<=c&&c<='9')k=k*10+c-'0',c=getchar(); k*=f;}void build(int cur,int l,int r){ a[cur].l=l; a[cur].r=r; if (l
mid) update(rs,l,r); a[cur].sum=a[ls].sum+a[rs].sum; }}int query(int cur,int l,int r){ if (l<=a[cur].l&&a[cur].r<=r) return a[cur].sum; else{ pushdown(cur); int ret=0; if (l<=mid) ret+=query(ls,l,r); if (r>mid) ret+=query(rs,l,r); return ret; }}int main(){ read(n); read(m); build(1,1,n); for (int i=1;i<=m;i++){ read(x); read(y); read(z); if (x==0) update(1,y,z); else printf("%d\n",query(1,y,z)); } return 0;}

 

  

转载于:https://www.cnblogs.com/DriverLao/p/7763995.html

你可能感兴趣的文章
Maven Nexus
查看>>
js 判断滚动条的滚动方向
查看>>
css,js文件后面加一个版本号
查看>>
webpack第一节(2)
查看>>
python之asyncio三种应用方法
查看>>
转:[Server] 在 Windows 上安裝 PHP 5.3 開發環境
查看>>
【IE6的疯狂之二】IE6中PNG Alpha透明(全集)
查看>>
第一个Shell脚本
查看>>
C++ 小笔记
查看>>
Mysql 语句优化
查看>>
例子:进度条
查看>>
包含单引号的sql
查看>>
HTML 基础 2
查看>>
Java 最常见 200+ 面试题全解析:面试必备(转载)
查看>>
LinkedList
查看>>
Spring框架下PropertyPlaceholderConfigurer类配置roperties文件
查看>>
[原创]独立模式安装Hive
查看>>
链表实现单链表创建、排序(升序)
查看>>
Spring旅程(一)为什么使用Spring
查看>>
centos安装桌面和远程连接
查看>>