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

泪奔。。。

#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. js判断鼠标进入以及离开容器的方向

      (注:以下代码涉及到jQuery,建议前端大牛绕路~~~) 1.遇到的问题      如图当鼠标右箭头位置上下移动的时候  下面的城市列表容器不能隐藏. 2.方法: 网上搜了些前端大牛们的解决办法 ...

  2. Unquotted string '"2016-07-19"'

    自己挖的坑,含泪跳进去也要填平.   ---题记 1.问题: a. 在前端使用JSON.stringify(json)转化数组对象为字符串,然后传给后台: var dateArray = new Ar ...

  3. scala中的下划线_

    1.作为“通配符”,类似Java中的*. 例如 import scala.math._ 2.:_*作为一个整体,告诉编译器你希望将某个参数当作参数序列处理! 例如 val s = sum(1 to 5 ...

  4. android应用保活机制

    android应用保活的基本原理: 都是通过双进程互拉以及设置进程的重要性,除非你root后 把自己的进程设置成系统进程. 互拉的方式有很多种 1.可以通过监听系统广播来把自己拉起来 2.可以多个ap ...

  5. MySQL学习笔记--数据类型

    一.数据类型(内容参考<SQL学习指南>)不完整 1.文本类型 文本类型 最大字节数 tinytext 255 text 65535 varchar 65536 mediumtext 16 ...

  6. python--分布式爬虫

    //server import socket, select, re, queue, redis from multiprocessing import Pool, cpu_count from py ...

  7. Python学习笔记之字符串

    一.字符串格式化 >>> format="Hello,%s. %s enough for ya?" >>> values=('World','H ...

  8. Yii MySQL修改数据库的数据

    最新学习Yii框架,分享一些学习心得,适合初学者,大神请按ctrl + w //第一种方法 <?php /* * $id 代表主键,可以是一个也可以是一个集合. * $attributes 代表 ...

  9. preload pic

    http://www.farinspace.com/jquery-image-preload-plugin/

  10. [Android] Web Console: Uncaught TypeError: Object [object Object] has no method 'xxx'

    我们开发的产品,有一部分功能,需要在WebView中打开web页面,然后在web页面中通过js方法回调部分native的功能. 对于web回调native的开发方式,如果不了解的话,可以参考我以前的一 ...