ZOJ 5638——Prime Query——————【线段树区间更新,区间查询,单点更新】
Prime Query
Time Limit: 1 Second Memory Limit: 196608 KB
You are given a simple task. Given a sequence A[i] with N numbers. You have to perform Q operations on the given sequence.
Here are the operations:
- A v l, add the value v to element with index l.(1<=V<=1000)
- R a l r, replace all the elements of sequence with index i(l<=i<= r) with a(1<=a<=10^6) .
- Q l r, print the number of elements with index i(l<=i<=r) and A[i] is a prime number
Note that no number in sequence ever will exceed 10^7.
Input
The first line is a signer integer T which is the number of test cases.
For each test case, The first line contains two numbers N and Q (1 <= N, Q <= 100000) - the number of elements in sequence and the number of queries.
The second line contains N numbers - the elements of the sequence.
In next Q lines, each line contains an operation to be performed on the sequence.
Output
For each test case and each query,print the answer in one line.
Sample Input
1
5 10
1 2 3 4 5
A 3 1
Q 1 3
R 5 2 4
A 1 1
Q 1 1
Q 1 2
Q 1 4
A 3 5
Q 5 5
Q 1 5
Sample Output
2
1
2
4
0
4
题目大意:三种类型的操作。A操作单点更新,给某位置增加值v,R操作区间更新,整个区间都更新为值v,Q操作区间查询,查询区间内的素数个数。
解题思路:用线段树维护三个值,一个lazy标记,一个val表示点的值,一个pnum表示素数的个数。在单点查询的时候,用一个PushDown操作将lazy标记下放,同时将值下发。最后还要用PushUp操作在回溯的时候更新值。对于区间查询来说,在查询的时候将lazy下放。关键要写好PushDown和PushUp这两个操作。(今天比较坑,自己建树的时候,没有上推,QAQ)。
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<iostream>
using namespace std;
#define mid (L+R)/2
#define lson rt*2,L,mid
#define rson rt*2+1,mid+1,R
const int maxn=1e5+200;
const int maxv=1e7+200;
struct SegTree{
int val,pnum,lazy;
}segtrees[maxn*4];
int prime[maxv],pprime[maxv];
void getprime(){
int num_prime=0;
prime[0]=prime[1]=1;
for(int i=2;i<maxv;i++){
if(!prime[i])
pprime[num_prime++]=i;
for(int j=0;j<num_prime && i*pprime[j]<maxv;j++){
prime[i*pprime[j]]=1;//合数标为1,同时,prime[j]是合数i*prime[j]的最小素因子
if(!(i%pprime[j]))//即比一个合数大的质数和该合数的乘积可用一个更大的合数和比其小的质数相乘得到
break;
}
}
}
void PushUp(int rt){
segtrees[rt].pnum = segtrees[rt*2].pnum + segtrees[rt*2+1].pnum; //
}
void build(int rt,int L,int R){
segtrees[rt].val=0;
segtrees[rt].lazy=0;
segtrees[rt].pnum=0;
if(L==R){
int &v=segtrees[rt].val;
scanf("%d",&v);
if(prime[v]){
segtrees[rt].pnum=0;
}else{
segtrees[rt].pnum=1;
}
return ;
}
build(lson);
build(rson);
PushUp(rt);
} void PushDown(int rt,int L,int R){
if(segtrees[rt].lazy==1){ segtrees[rt].lazy=0;
segtrees[rt*2].lazy=1;
segtrees[rt*2+1].lazy=1; segtrees[rt*2].val=segtrees[rt].val;
segtrees[rt*2+1].val=segtrees[rt].val;
segtrees[rt].val=0;
}
}
void add(int rt,int L,int R,int pos,int _val){
if(L==R){
int &v=segtrees[rt].val;
v+=_val;
if(prime[v]){
segtrees[rt].pnum=0;
}else{
segtrees[rt].pnum=1;
}
return ;
}
PushDown(rt,L,R);
if(pos<=mid){
add(lson,pos,_val);
}else{
add(rson,pos,_val);
}
PushUp(rt);
}
void repla(int rt,int L,int R,int l_ran,int r_ran,int _val){
if(l_ran<=L&&R<=r_ran){
segtrees[rt].lazy=1;
segtrees[rt].val=_val;
int &v=segtrees[rt].val;
if(prime[v]){
segtrees[rt].pnum=0;
}else{
segtrees[rt].pnum=R-L+1;
}
return ;
}
PushDown(rt,L,R);
if(l_ran<=mid){
repla(lson,l_ran,r_ran,_val);
} if(r_ran>mid){
repla(rson,l_ran,r_ran,_val);
}
PushUp(rt);
}
int query(int rt,int L,int R,int l_ran,int r_ran){
if(l_ran<=L&&R<=r_ran){
return segtrees[rt].pnum;
}
PushDown(rt,L,R);
int ret=0;
if(l_ran<=mid){
ret+=query(lson,l_ran,r_ran);
}
if(r_ran>mid){
ret+=query(rson,l_ran,r_ran);
}
return ret;
}
int main(){
int T,n,m;
char opr[10];
getprime();
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
build(1,1,n);
int a,b,c;
for(int i=1;i<=m;i++){
scanf("%s",opr);
if(opr[0]=='A'){
scanf("%d %d",&a,&b);
add(1,1,n,b,a);
}else if(opr[0]=='R'){
scanf("%d %d %d",&a,&b,&c);
repla(1,1,n,b,c,a);
}else{
scanf("%d %d",&a,&b);
int ans=query(1,1,n,a,b);
printf("%d\n",ans);
}
}
}
return 0;
}
ZOJ 5638——Prime Query——————【线段树区间更新,区间查询,单点更新】的更多相关文章
- HUD.2795 Billboard ( 线段树 区间最值 单点更新 单点查询 建树技巧)
HUD.2795 Billboard ( 线段树 区间最值 单点更新 单点查询 建树技巧) 题意分析 题目大意:一个h*w的公告牌,要在其上贴公告. 输入的是1*wi的w值,这些是公告的尺寸. 贴公告 ...
- 51nod1287(二分/线段树区间最值&单点更新)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1287 题意:中文题诶- 解法1:b[i] 存储 max(a[0 ...
- hdoj1754 I Hate It【线段树区间最大值维护+单点更新】
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- 【线段树区间最值单点更新模板】BNUOJ 52965 E Excellent Engineers
http://acm.bnu.edu.cn/v3/external/gym/101512.pdf #include<bits/stdc++.h> using namespace std; ...
- POJ3468(线段树区间求和+区间查询)
https://vjudge.net/contest/66989#problem/C You have N integers, A1, A2, ... , AN. You need to deal w ...
- 143 - ZOJ Monthly, October 2015 I Prime Query 线段树
Prime Query Time Limit: 1 Second Memory Limit: 196608 KB You are given a simple task. Given a s ...
- query 线段树 + 区间排序
https://nanti.jisuanke.com/t/41391 这个题目没有很难想,比较暴力,但是要会算复杂度,不会算复杂度,就会觉得自己的算法会超时,实际上不会. 这个题目就是直接暴力求出每一 ...
- SPOJ GSS2 - Can you answer these queries II(线段树 区间修改+区间查询)(后缀和)
GSS2 - Can you answer these queries II #tree Being a completist and a simplist, kid Yang Zhe cannot ...
- poj3667(线段树区间合并&区间查询)
题目链接: http://poj.org/problem?id=3667 题意:第一行输入 n, m表示有 n 间房间(连成一排的), 接下来有 m 行输入, 对于接下来的 m 行输入: 1 x : ...
随机推荐
- http请求中的get和post的区别
1.标准答案 GET在浏览器回退时是无害的,而POST会再次提交请求. GET产生的URL地址可以被Bookmark,而POST不可以. GET请求会被浏览器主动cache,而POST不会,除非手动设 ...
- #np.random.normal,产生制定分布的数集(默认是标准正态分布)
http://docs.scipy.org/doc/numpy/reference/generated/numpy.random.normal.html #np.random.normal,产生制定分 ...
- 17、SAM文件格式说明(转载迷宫中的将军)
1. SAM格式说明 SAM代表Sequence Alignment/Map格式,是一种制表符分隔的文本格式,包含一个可选的头部分(header section,有人称之为“注释部分”),和一个比对部 ...
- 6.6 Ubuntu 安装 截图工具 Shutter
可参考: http://blog.csdn.net/hanshileiai/article/details/46843713
- Struts2学习第七课 动态方法调用
动态方法调用:通过url动态调用Action中的方法. action声明: <package name="struts-app2" namespace="/&quo ...
- MVC项目中的分页实现例子
在开发项目中,写了一个分页实现的例子,现在把源代码贴上,以供以后写代码时参考 在列表的头部,有如下显示, 这个代表一个页面显示10条记录,总共22条记录. 这个是页面底部的显示 那么如何来显示这个分页 ...
- select下拉框如何与接口配合动态生成option选项
前几天在做任务时考虑到这个问题,具体任务用例如下: HTML: JS:
- CSS 框模型概述
在 CSS 中,width 和 height 指的是内容区域的宽度和高度. 增加内边距.边框和外边距不会影响内容区域的尺寸,但是会增加元素框的总尺寸. 假设框的每个边上有 10 个像素的外边距和 5 ...
- 通过增删改查对比Array,Map,Set,Object的使用成本和实现方式
1.Array 和 Map 对比 { // array and map 增 查 改 删 let map = new Map(); let arr = []; // 增 map.set('a', 1); ...
- Servlet方法之service()
1.service一定要用吗?作用是什么?是不是在程序开始运行时,自动装载执行的系统方法(类似于main)? Service是类GenericServlet中最重要的方法,每次客户向服务器发出请求时, ...