哎,没什么坑点,一个简单的区间更新题,但是改了好几天没改对,最终还是过了~~发个纪念下

泪奔。。。

#include<cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#define N 100010
#define MAXN 10000010
using namespace std;
struct dd
{
int cnt;//这个区间内素数的个数
int l,r;
int val;//存的是素数
int flag;//区间更新的标记
}tree[N<<2];
int isp[MAXN];
void inint()//素数打表
{
memset(isp,0,sizeof(isp));
isp[0]=isp[1]=1;
for(int i=2;i<MAXN;i++)
{
if(!isp[i])
{
if(i>MAXN/i)
continue;
for(int j=i*i;j<MAXN;j+=i)
isp[j]=1;
}
}
}
void push_up(int k)//更新父亲节点
{
tree[k].cnt=tree[k<<1].cnt+tree[k<<1|1].cnt;
}
void push_down(int k)//区间更新
{
if(tree[k].flag)
{
tree[k<<1].flag=tree[k<<1|1].flag=tree[k].flag;
tree[k<<1].val=tree[k<<1|1].val=tree[k].val;
tree[k<<1].cnt=(isp[tree[k].flag])?0:tree[k<<1].r-tree[k<<1].l+1;
tree[k<<1|1].cnt=(isp[tree[k].flag])?0:tree[k<<1|1].r-tree[k<<1|1].l+1;
tree[k].flag=0;
}
}
void build(int l,int r,int k)//建树
{
tree[k].l=l;
tree[k].r=r;
tree[k].cnt=0;
tree[k].flag=0;
tree[k].val=0;
if(l==r)
{
int val;
scanf("%d",&val);
tree[k].val=val;
if(!isp[val])
tree[k].cnt=1;
return;
}
int mid=(l+r)/2;
build(l,mid,k<<1);
build(mid+1,r,k<<1|1);
push_up(k);
}
void update1(int val,int pos,int k)//更新一个节点
{
if(tree[k].l==tree[k].r&&tree[k].l==pos)
{
tree[k].val+=val;
if(!isp[tree[k].val])
tree[k].cnt=1;
else
tree[k].cnt=0;
return;
}
push_down(k);//这里的push_down竟然没加!!!泪奔的是,还是自己删掉的,好久才发现
int mid=(tree[k].l+tree[k].r)/2;
if(pos<=mid)
update1(val,pos,k<<1);
else
update1(val,pos,k<<1|1);
push_up(k);
}
void update2(int val,int l,int r,int k)//更新区间
{
if(tree[k].l==l&&tree[k].r==r)
{
tree[k].cnt=(isp[val])?0:tree[k].r-tree[k].l+1;//开始的时候这里的cnt值也忘了改
tree[k].val=val;
tree[k].flag=val;
return;
}
push_down(k);
int mid=(tree[k].l+tree[k].r)/2;
if(r<=mid) update2(val,l,r,k<<1);
else if(l>mid) update2(val,l,r,k<<1|1);
else
{
update2(val,l,mid,k<<1);
update2(val,mid+1,r,k<<1|1);
}
push_up(k);
}

int query(int k,int l,int r)//询问区间内的元素数
{
int sum=0;
if(tree[k].l==l&&tree[k].r==r)
{
return tree[k].cnt;
}
push_down(k);
int mid=(tree[k].l+tree[k].r)/2;
if(mid>=r)
sum+=query(k<<1,l,r);
else if(l>mid)
sum+=query(k<<1|1,l,r);
else
{
sum+=query(k<<1,l,mid);
sum+=query(k<<1|1,mid+1,r);
}
push_up(k);
return sum;
}
int main()
{
int t,n,q;
char op[5];
//printf("%d\n",2|1);
inint();
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&q);
build(1,n,1);
while(q--)
{
scanf("%s",op);
if(op[0]=='A')//pos这个点的元素加val
{
int val,pos;
scanf("%d%d",&val,&pos);
update1(val,pos,1);
}
else if(op[0]=='R')//l,r区间内的元素都改为val
{
int val,l,r;
scanf("%d%d%d",&val,&l,&r);
update2(val,l,r,1);
}
else if(op[0]=='Q')//询问区间内的元素数
{
int l,r;
scanf("%d%d",&l,&r);
int sum=query(1,l,r);
printf("%d\n",sum);
}
}
}
return 0;
}

区间更新 zoj3911的更多相关文章

  1. HDU 1556 Color the ball(线段树区间更新)

    Color the ball 我真的该认真的复习一下以前没懂的知识了,今天看了一下线段树,以前只会用模板,现在看懂了之后,发现还有这么多巧妙的地方,好厉害啊 所以就应该尽量搞懂 弄明白每个知识点 [题 ...

  2. hihoCoder 1080 : 更为复杂的买卖房屋姿势 线段树区间更新

    #1080 : 更为复杂的买卖房屋姿势 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho都是游戏迷,“模拟都市”是他们非常喜欢的一个游戏,在这个游戏里面他们 ...

  3. hdu 3397 Sequence operation(线段树:区间更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3397 题意:给你一个长度为n的0,1序列,支持下列五种操作, 操作0(0 a b):将a到b这个区间的 ...

  4. 【HDU 4614】Vases and Flowers(线段树区间更新懒惰标记)

    题目0到n-1的花瓶,操作1在下标a开始插b朵花,输出始末下标.操作2清空[a,b]的花瓶,求清除的花的数量.线段树懒惰标记来更新区间.操作1,先查询0到a-1有num个空瓶子,然后用线段树的性质,或 ...

  5. HDU 1698 Just a Hook(线段树/区间更新)

    题目链接: 传送门 Minimum Inversion Number Time Limit: 1000MS     Memory Limit: 32768 K Description In the g ...

  6. HDU 5023 A Corrupt Mayor's Performance Art(线段树区间更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5023 解题报告:一面墙长度为n,有N个单元,每个单元编号从1到n,墙的初始的颜色是2,一共有30种颜色 ...

  7. HDU 4902 Nice boat 2014杭电多校训练赛第四场F题(线段树区间更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4902 解题报告:输入一个序列,然后有q次操作,操作有两种,第一种是把区间 (l,r) 变成x,第二种是 ...

  8. hdu 1556:Color the ball(第二类树状数组 —— 区间更新,点求和)

    Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  9. hdu 1556:Color the ball(线段树,区间更新,经典题)

    Color the ball Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

随机推荐

  1. EasyUi 分页 和 表格数据加载

    这里说明的是将说有数据先返回到前端再由前端去分页,性能可能没有先在后台分好页再返回给前端高 但如果操作不涉及大数据的话也没什么大问题,具体问题具体分析 要使用分页控件首先要声明初始化一下: //设置分 ...

  2. CSS 3 阴影,倒影,渐变

    盒子阴影 box-shadow:盒子的阴影 第一个参数:设置的是阴影的水平偏移量 第二个参数:设置的是阴影的垂直偏移量 第三个参数:设置阴影的模糊程度 第四个参数:设置阴影外延值 第五个参数:阴影的颜 ...

  3. TOSHIBA TEC EXT Printer Z-Mode

    Z-Mode functionality automatically converts the Zebra data stream into a TOSHIBA data stream (TPCL). ...

  4. 002_kafka_相关术语详细解析

    参考: http://www.cnblogs.com/likehua/p/3999538.html http://kafka.apache.org/documentation.html#getting ...

  5. Django URL传递参数的方法总结(转)

    1 无参数情况 配置URL及其视图如下: 1 2 3 4 (r'^hello/$', hello)   def hello(request): return HttpResponse("He ...

  6. JAVA OOP 基础知识提纲

    OOP: 面向对象: 认识事物的一个过程,是整体(特征/行为) 认识事物的方式.人类认识事物的自然思维习惯. 对象及类 对象是实实在在具体存在的东西,主要是从两个角度(行为,特征)去观察 类:是一组具 ...

  7. 使用Dottrace跟踪代码执行时间

    当自己程序遇到性能问题,比如IIs请求反应缓慢,客户端程序执行缓慢,怎么分析是哪里出了问题呢?dottrace可以帮助.net程序跟踪出代码里每个方法的执行时间,这样让我们更清晰的看出是哪里执行时间过 ...

  8. 一个getjson()方式调用实例【前后台】,适于跨域访问。

    题记:首次发个随笔,把以前写的一个笔记发过来,劝当记录,以供查询. jquery的推出确实解决了大部分程序员都感到头痛的事情,无论是对于UI的访问和处理,还是在一系列的远程访问等方面都有了很大的改善, ...

  9. SQL Server 2008中查看锁信息

    ;with tran_locks as(select resource_type,db_name(resource_database_id) as db_name,resource_descripti ...

  10. java web图片上传和文件上传

    图片上传和文件上传本质上是一样的,图片本身也是文件.文件上传就是将图片上传到服务器,方式虽然有很多,但底层的实现都是文件的读写操作. 注意事项 1.form表单一定要写属性enctype=" ...