题目描述:

给定初始序列 \(A\),然后对原序列有以下操作:

  1. 操作 \(1\): 0 l r v 将区间 \([l,r]\) 全赋值为 \(v\)。
  2. 操作 \(2\):1 l r 查询区间 \([l,r]\) 的质数个数。

注意:多组测试和特殊的输出。

题目分析:

就是一道板子题,首先我们先用欧拉筛筛出值域 \([2,10^6]\) 内的素数并开桶打标记(实际上一个欧拉筛就行了)。

此时,线段树维护的是当前区间内质数的个数,我们可以将操作 \(1\) 变成如下操作:

  • 若 \(v\) 属于质数,则将区间 \([l,r]\) 内的数全赋值成 \(1\)。
  • 若 \(v\) 不属于质数,则将区间 \([l,r]\) 内的数全赋值成 \(0\)。

那么,操作 \(2\) 此时显然就变成了一个区间求和。

时间复杂度,\(O(n\lg n)\)。

代码实现:

#include <bits/stdc++.h>
#define dbg(x) cerr<<#x<<": "<<x<<endl;
using namespace std;
#define MAX_SIZE (int)2e6
#define MAX_RANGE (int)1.1e6 bool nf[MAX_RANGE];
int primes[MAX_RANGE];
inline void primeshai(int n){
for(register int i=2;i<=n;i++){
if(!nf[i])
primes[++primes[0]] = i;
for(register int j=1;j<=primes[0]&&primes[j]*i<=n;j++){
nf[primes[j]*i] = 1;
if(i%primes[j]==0)
break;
}
}
} inline int read()
{
int x=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
return x*f;
} struct SegmentTree{
int sum;
int lazy;
int l,r;
int len;
};
SegmentTree seg[MAX_SIZE<<2];
int a[MAX_SIZE]; void build(int p,int l,int r)
{
seg[p].l = l;
seg[p].r = r;
seg[p].lazy = -1;
seg[p].len = r-l+1;
if(l==r){
seg[p].sum = !nf[a[l]];
return;
}
int mid = (l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
seg[p].sum = seg[p<<1].sum + seg[p<<1|1].sum;
} inline void spread(int p){
if(seg[p].lazy!=-1){
seg[p<<1].sum = seg[p].lazy*seg[p<<1].len;
seg[p<<1|1].sum = seg[p].lazy*seg[p<<1|1].len;
seg[p<<1].lazy = seg[p].lazy;
seg[p<<1|1].lazy = seg[p].lazy;
seg[p].lazy = -1;
}
} inline void modify(int p,int l,int r,int val){
if(l<=seg[p].l&&r>=seg[p].r){
seg[p].sum = val * seg[p].len;
seg[p].lazy = val;
return;
}
if(seg[p].lazy>=0)
spread(p);
int mid = (seg[p].l+seg[p].r)>>1;
if(l<=mid)
modify(p<<1,l,r,val);
if(r>mid)
modify(p<<1|1,l,r,val);
seg[p].sum = seg[p<<1].sum + seg[p<<1|1].sum;
} inline int query(int p,int l,int r){
if(l<=seg[p].l&&r>=seg[p].r)
return seg[p].sum;
if(seg[p].lazy>=0)
spread(p);
int val = 0;
int mid = (seg[p].l+seg[p].r)>>1;
if(l<=mid)
val += query(p<<1,l,r);
if(r>mid)
val += query(p<<1|1,l,r);
return val;
} int main(){
ios::sync_with_stdio(false);
cout.tie(0);
#ifdef LOCAL
freopen("in.in","r",stdin);
freopen("out.out","w",stdout);
double c1 = clock();
#endif
//============================================
primeshai(1e6);
int T;
T = read();
for(int x=1;x<=T;x++){
cout<<"Case "<<x<<':'<<endl;
int n = read();
int q = read();
for(int i=1;i<=n;i++)
a[i] = read();
build(1,1,n);
while(q--){
switch(read()){
case 0:{
int l = read();
int r = read();
int y = read();
modify(1,l,r,!nf[y]);
break;
}
case 1:{
int l = read();
int r = read();
cout<<query(1,l,r)<<endl;
break;
}
}
}
}
//============================================
#ifdef LOCAL
double c2 = clock();
cerr<<"Used Time: "<<c2-c1<<"ms"<<endl;
if(c2-c1>1000)
cerr<<"Warning!! Time Limit Exceeded!!"<<endl;
fclose(stdin);
fclose(stdout);
#endif
return 0;
}

题解 SP13015的更多相关文章

  1. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  2. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  3. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  4. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  5. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  6. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

  9. CF100965C题解..

    求方程 \[ \begin{array}\\ \sum_{i=1}^n x_i & \equiv & a_1 \pmod{p} \\ \sum_{i=1}^n x_i^2 & ...

  10. JSOI2016R3 瞎BB题解

    题意请看absi大爷的blog http://absi2011.is-programmer.com/posts/200920.html http://absi2011.is-programmer.co ...

随机推荐

  1. Django学习笔记:第三章D的路由和视图

    1.网站的入口--路由和视图 URL是网站Web服务的入口.用户在浏览器输入URL发出请求后,django会根据路由系统,运行对应的视图函数,然后返回信息到浏览器中. 1.1 认识路由 创建项目时,会 ...

  2. 如何在 Windows Server 2022 阿里云服务器上搭建自己的 MQTT 服务器之二Mosquitto服务器

    一.介绍 最近几天都在搭建MQTT服务器,几天前搭建好了一个 Apache-Apollo的 MQTT 服务器,当我们在管理我们的主题的时候,发现主题的名称的斜杠(/)变成了点号(.),正好我在调试程序 ...

  3. ChatGPT变笨了,好在还有自知之明

    大家好,我是老章 好久没有写文章了,顺便向大家汇报一下最近在忙的事情(多数无疾而终): 1 开发了一个IMG2Latex工具(截图一个公式,自动把latex代码塞进剪贴板) 2 开发了一个播客转文字稿 ...

  4. 基于 Spark 的物流企业数据仓库 的设计与实现

    1.设计和实现了一种基于 Spark 的分布式 ETL 系统,包括利用 Spark 抽取.转换清洗和加载数据的具体过程. 2.设计和实现了基于 Spark 的物流企业数据仓库,包括物流企业数据仓库的分 ...

  5. 2021-09-27 Core初步实战

    中间件Progarm的定义添加Logging public static IHostBuilder CreateHostBuilder(string[] args) => Host.Create ...

  6. BTC中的数据结构

    BTC中的数据结构 普通指针 普通指针存储的是某个结构体在内存中的地址(假如P是指向一结构体的指针,那么P里面存放的就是该结构体在内存中的起始位置) Hash pointer(哈希指针) 对于如下的节 ...

  7. 聚焦Web前端安全:最新揭秘漏洞防御方法

    在 Web 安全中,服务端一直扮演着十分重要的角色.然而前端的问题也不容小觑,它也会导致信息泄露等诸如此类的问题.在这篇文章中,我们将向读者介绍如何防范Web前端中的各种漏洞.[万字长文,请先收藏再阅 ...

  8. 618京东到家APP-门详页反爬实战

    一.背景与系统安全需求分析 1. 系统的重要性 上图所示是接口所属位置.对电商平台或在线商店而言,分类查商品都是很重要的,通过为用户提供清晰的商品分类,帮助他们快速找到所需产品,节省浏览时间,提升购物 ...

  9. Wood,微型 Java ORM 框架(首次发版)

    Wood,微型 Java ORM 框架(支持:java sql,xml sql,annotation sql:事务:缓存:监控:等...),零依赖! 特点和理念: 跨平台:可以嵌入到JVM脚本引擎(j ...

  10. 关于.Net 6.0 在Linux ,Docker容器中,不安装任何依赖就生成图形验证码!!!!!!!!!!!

    在.Net Framework时代,我们生成验证码大多都是用System.Drawing. 在.Net 6中使用也是没有问题的. 但是,System.Drawing却依赖于Windows GDI+. ...