SPOJ MULTQ3 7299 Multiples of 3 (区间更新)
题目连接:http://www.spoj.com/problems/MULTQ3/
#include <iostream>
#include <stdio.h>
#include <string.h>
#define lson rt<<1,L,mid
#define rson rt<<1|1,mid+1,R
/*
题意:给出n个数,初试为0,给出两个操作;
0 A B :将[A,B]区间中的每个数+1
1 A B :询问[A,B]区间中有多少个能被3整除的数。
思路:每个节点存储三个值:num0:整除3的个数,num1:除以3余1的个数,num2:除以3余2的个数
更新的时候,只要将这三个值互换即可
*/
using namespace std;
const int maxn=;
int n,m; struct Node{
//num0:整除3的个数,num1:除以3余1的个数,num2:除以3余2的个数
int num0,num1,num2;
int lazy; //标记该区间+1的次数,如果三次+1相当于不变
}tree[maxn<<]; void build(int rt,int L,int R){
tree[rt].num0=(R-L+);
tree[rt].num1=tree[rt].num2=;
tree[rt].lazy=;
if(L==R)
return;
int mid=(R+L)>>;
build(lson);
build(rson);
}
void pushUp(int rt){
tree[rt].num0=tree[rt<<].num0+tree[rt<<|].num0;
tree[rt].num1=tree[rt<<].num1+tree[rt<<|].num1;
tree[rt].num2=tree[rt<<].num2+tree[rt<<|].num2;
}
void pushDown(Node &rt,Node &ls,Node &rs){
if(rt.lazy==){
/*
+1一次:
num0->num1
num1->num2
num2->num0
*/
int tmp;
tmp=ls.num0;
ls.num0=ls.num2;
ls.num2=ls.num1;
ls.num1=tmp;
ls.lazy=(ls.lazy+rt.lazy)%; tmp=rs.num0;
rs.num0=rs.num2;
rs.num2=rs.num1;
rs.num1=tmp;
rs.lazy=(rs.lazy+rt.lazy)%; rt.lazy=;
}
else if(rt.lazy==){
/*
+1二次:
num0->num2
num2->num1
num1->num0
*/
int tmp;
tmp=ls.num0;
ls.num0=ls.num1;
ls.num1=ls.num2;
ls.num2=tmp;
ls.lazy=(ls.lazy+rt.lazy)%; tmp=rs.num0;
rs.num0=rs.num1;
rs.num1=rs.num2;
rs.num2=tmp;
rs.lazy=(rs.lazy+rt.lazy)%;
rt.lazy=;
}
}
void update(int rt,int L,int R,int l,int r){
if(l<=L&&R<=r){
int tmp;
tmp=tree[rt].num0;
tree[rt].num0=tree[rt].num2;
tree[rt].num2=tree[rt].num1;
tree[rt].num1=tmp;
tree[rt].lazy=(tree[rt].lazy+)%;
return;
}
pushDown(tree[rt],tree[rt<<],tree[rt<<|]);
int mid=(L+R)>>;
if(l<=mid)
update(lson,l,r);
if(r>mid)
update(rson,l,r);
pushUp(rt);
}
int query(int rt,int L,int R,int l,int r){
if(l<=L&&R<=r){
return tree[rt].num0;
}
pushDown(tree[rt],tree[rt<<],tree[rt<<|]);
int ret=;
int mid=(L+R)>>;
if(l<=mid)
ret+=query(lson,l,r);
if(r>mid)
ret+=query(rson,l,r);
return ret;
}
int main()
{
int t,a,b;
scanf("%d%d",&n,&m);
build(,,n);
for(int i=;i<=m;i++){
scanf("%d%d%d",&t,&a,&b);
a++;b++;
if(t==){
update(,,n,a,b);
}
else{
int ans=query(,,n,a,b);
printf("%d\n",ans);
}
}
return ;
}
SPOJ MULTQ3 7299 Multiples of 3 (区间更新)的更多相关文章
- HDU 4348.To the moon SPOJ - TTM To the moon -可持久化线段树(带修改在线区间更新(增减)、区间求和、查询历史版本、回退到历史版本、延时标记不下放(空间优化))
To the moon Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- HDU 1556 Color the ball(线段树区间更新)
Color the ball 我真的该认真的复习一下以前没懂的知识了,今天看了一下线段树,以前只会用模板,现在看懂了之后,发现还有这么多巧妙的地方,好厉害啊 所以就应该尽量搞懂 弄明白每个知识点 [题 ...
- hihoCoder 1080 : 更为复杂的买卖房屋姿势 线段树区间更新
#1080 : 更为复杂的买卖房屋姿势 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho都是游戏迷,“模拟都市”是他们非常喜欢的一个游戏,在这个游戏里面他们 ...
- hdu 3397 Sequence operation(线段树:区间更新)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3397 题意:给你一个长度为n的0,1序列,支持下列五种操作, 操作0(0 a b):将a到b这个区间的 ...
- 【HDU 4614】Vases and Flowers(线段树区间更新懒惰标记)
题目0到n-1的花瓶,操作1在下标a开始插b朵花,输出始末下标.操作2清空[a,b]的花瓶,求清除的花的数量.线段树懒惰标记来更新区间.操作1,先查询0到a-1有num个空瓶子,然后用线段树的性质,或 ...
- HDU 1698 Just a Hook(线段树/区间更新)
题目链接: 传送门 Minimum Inversion Number Time Limit: 1000MS Memory Limit: 32768 K Description In the g ...
- HDU 5023 A Corrupt Mayor's Performance Art(线段树区间更新)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5023 解题报告:一面墙长度为n,有N个单元,每个单元编号从1到n,墙的初始的颜色是2,一共有30种颜色 ...
- HDU 4902 Nice boat 2014杭电多校训练赛第四场F题(线段树区间更新)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4902 解题报告:输入一个序列,然后有q次操作,操作有两种,第一种是把区间 (l,r) 变成x,第二种是 ...
- hdu 1556:Color the ball(第二类树状数组 —— 区间更新,点求和)
Color the ball Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...
随机推荐
- Java线程面试题 Top 50(转载)
原文链接:http://www.importnew.com/12773.html 本文由 ImportNew - 李 广 翻译自 javarevisited.欢迎加入Java小组.转载请参见文章末尾的 ...
- 将n(0<=n<=10000)的阶乘分解质因数,求其中有多少个m
给定两个数m,n,其中m是一个素数. 将n(0<=n<=10000)的阶乘分解质因数,求其中有多少个m. 输入 第一行是一个整数s(0<s<=100),表示测试数据的组数 随后 ...
- C#调用C、C++结构体数组的方法总结
一个客户要使用C#调用我们用C++开发的一个动态链接库,本来我没有C#的开发经验,就随便写了一个例程.以为很简单就可以搞定,没想到客户开发的过程中遇到了不少问题,最困难的就是用C#调用C++接口中的自 ...
- [Guava源码分析]Objects 和 ComparisonChain:帮助重写Object方法
我的技术博客经常被流氓网站恶意爬取转载.请移步原文:http://www.cnblogs.com/hamhog/p/3874194.html,享受整齐的排版.有效的链接.正确的代码缩进.更好的阅读体验 ...
- Mysql表基本操作
一. 创建表的方法 语法:create table 表名( 属性名数据类型完整约束条件, 属性名数据类型条完整约束件, ......... 属性名数据类型 ); (1)举例:1 create tabl ...
- 《linux源代码包的编译安装》RHEL6
linux下源代码包的编译安装其实没那么复杂. 我是win7系统装的虚拟机,就简单说下: 举个简单的例子: http://www.openssl.org/ 这是openssl的官网,下载openssl ...
- WP开发笔记——字符串 转 MD5 加密
将字符串进行MD5加密,返回加密后的字符串. 从这里下载Md5.cs文件:http://pan.baidu.com/s/1hq3gpnu. 添加到Windows Phone 7项目中,在代码里面这样调 ...
- linux系统目录架构
/bin目录:可执行的二进制文件,shell命令(就是我们说的命令:cp ls ...),所有用户都有权执行. /boot目录:引导目录,整个操作系统启动所需的所有文件都在该目录下,其中最主要的就是v ...
- MQTT开发小记(一)
最近在协助公司硬件组进行MQTT协议的嵌入式SDK包开发. 简述一下MQTT MQTT简单的来说是一种订阅/发布模式的通信形式,一般分为客户端和服务器端. MQTT服务器端可以简单理解为一个消息中转站 ...
- [译]Redis大冒险
原文:ALCA in Redis-land 一篇对使用Redis在NoSQL的世界中冒险之旅的总结. The legs of our journey 像每次出发一样,先对我们这次的旅程路线做个介绍: ...