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

泪奔。。。

#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. Extjs关于alert显示不出—异步问题

    对应extjs提示框不能正常显示,而使用js的本身提示框可以正常,但由于样式不统一,不是 好的解决方法. 解决该问题,要了解extjs异步原理. ext的提示框都是异步的,非阻塞模式的,浏览器js的提 ...

  2. sublime 3

    主题: Theme: Flatland 着色:todo Blue Dawn.tmTheme {     "theme": "Flatland Dark.sublime-t ...

  3. js、jquery对于html内容的转义

    -------2016-7-27 14:23:34-- source:[1]js转义html

  4. FileStream和StreamWriter配合写数据流时,出现数据写不进去的问题

    今天做一个数据导进txt小程序时,发现一个问题,就是没有关闭sw的流,只关闭了fs的,结果写不进去数据,看代码是对的,就是不行,最后就随手填上了sw的关闭后,可以了,反复测试,竟然就是这的问题,有点搞 ...

  5. Logistic 分类器与 softmax分类器

    首先说明啊:logistic分类器是以Bernoulli(伯努利) 分布为模型建模的,它可以用来分两种类别:而softmax分类器以多项式分布(Multinomial Distribution)为模型 ...

  6. Android Tips – 填坑手册

    出于: androidChina   http://www.androidchina.net/3595.html 学习 Android 至今,大大小小的坑没少踩,庆幸的是,在强大的搜索引擎与无私奉献的 ...

  7. angular router-ui

    将模块注入到控制器中的方法: 1.export module 2.在router中resolve解决: 2.1 resolve中直接return值 /*ngInject*/ worker : 'hi' ...

  8. 使用C语言将IE收藏夹生成HTML

    IE收藏夹里收藏的链接很多,查找也不方便,使用C编写一个小工具,可以将收藏夹里的链接文件生成到一个HTML文件上. 源码还有许多地方需要优化,后续我会优化,先分享出来.目的主要是为了练习C语言,这个代 ...

  9. osg,vtk,ogre的区别

    osg使用过一年,阅读过一部分源代码,vtk也断续使用过三四年了,ogre研究的比较深入,基本上比较熟悉它的整体结构,说说个人的看法 vtk是一个算法库,里面包括了很多挺不错的算法,如果做有限元云图, ...

  10. 9_13学习完整修改和查询&&实体类,数据访问类

    完整修改和查询:中间变量运用. 1.先查 2.执行操作 ---------------------------------------------------- namespace ADO.NET_小 ...