列表

详情


NC228384. 绝望

描述

破碎的哭喊和梦想 眼前的理想已只剩下门扉

即便城市被杂音所吞没 变得越来越嘈杂

我也会放歌 不再去掌控方向

所以不如就让静谧 在此回响

——《ninelie》

他抵制不了电脑的诱惑,开始颓废……很快,他就为他的行为付出了代价……
对于一个序列,每个元素有一个初值,有两种操作
1. 输入4个整数 1 l r x


表示将 修改为 ,并输出l~r中a[i]为质数的个数   
2. 输入3个整数 2 l r

输出   ,意义同上

输入描述

第一行输入两个整数
第二行输入个整数,第个整数表示
接下来行,每行一个操作,输入方式如上所述
,
不保证在操作过程中

输出描述

对于每一个操作,输出对应的答案

示例1

输入:

3 3
4 3 4
2 1 3
1 1 3 2
2 1 3

输出:

1
0
0

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 417ms, 内存消耗: 19604K, 提交时间: 2023-01-19 18:44:24

#include <bits/stdc++.h>
#define int long long
using namespace std;
int fa1[500005],fap[500005],a[500005];
int tree[500005];
bitset <500005> p;
inline int lowbit(int x) {
	return x&-x;
}
inline int ask(int x) {
	if(!x) return 0;
	return tree[x]+ask(x^lowbit(x));
}
inline void add(int x,int y) {
	if(x>500000) return ;
	tree[x]+=y,add(x+lowbit(x),y);
}
inline int ff1(int x) {
	if(fa1[x]==x) return x;
	return fa1[x]=ff1(fa1[x]);
}
inline int ffp(int x) {
	if(fap[x]==x) return x;
	return fap[x]=ffp(fap[x]);
}
set <int> s;
inline void change(int l,int r,int x) {
	if(!x) return ;
	l=max(l,2ll);
	while(1)
	{
		int x=*s.lower_bound(l);
		if(x>r) break;
		add(x,-1),s.erase(x); 
	}
	for(int i=ff1(l);i<=r;i=ff1(i+1))
	{
	//	cout << i << "\n";
		if(!p[i]&&x==1) {
			add(i,1),s.insert(i);
		}
		fa1[i]=ff1(i+1);
	}
}
signed main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	s.insert(100000000);
	int n,m;
	cin >> n >> m;
	for(int i=1;i<=n;i++) {
		cin >> a[i];
		fa1[i]=fap[i]=i;
	}
	p[1]=1;
	for(int i=2;i<=500000;i++) {
		if(!p[i]) {
			for(int j=i+i;j<=500000;j+=i) {
				p[j]=1;
			}
		}
	}
	fap[n+1]=fa1[n+1]=n+1;
	for(int i=1;i<=n;i++) {
		if(p[a[i]]) {
			fap[i]=ffp(i+1);
		}
		else {
			add(i,1),s.insert(i);
		}
		if(a[i]!=1) {
			fa1[i]=ff1(i+1);
		}
	}
	while(m--) {
		int op,l,r,x;
		cin >> op >> l >> r;
		if(op==1) {
			cin >> x;
			change(l,r,x);
		}
		cout << ask(r)-ask(l-1) << "\n"; 
	}
	return 0;
}
/*
5 4
1 1 1 1 1
2 1 5
1 1 5 1
1 3 4 2
2 1 5
*/

C++ 解法, 执行用时: 143ms, 内存消耗: 24708K, 提交时间: 2021-10-22 20:06:16

#include<bits/stdc++.h>
using namespace std;
const int M=500005;
int read(){
	char c;int x=0;
	do c=getchar();while(!isdigit(c));
	for(;isdigit(c);c=getchar())x=x*10+c-'0';
	return x;
}
int n,m,p[M],zhi[M];
struct seg{
	int l,r,s,h;
	seg*ls,*rs;
	void push_up(){
		s=ls->s+rs->s;
		h=ls->h&&rs->h;
	}
	void build(int u,int v){
		l=u;r=v;
		if(r-l==1){
			s=read();
			if(p[s])h=1;
			if(s==1||p[s])s=0;
			else s=1;
			return;
		}
		ls=new seg{};
		rs=new seg{};
		ls->build(l,l+r>>1);
		rs->build(l+r>>1,r);
		push_up();
	}
	void add(int u,int v,int x){
		if(h)return;
		if(l>=v||r<=u)return;
		if(r-l==1){
			if(l==1)return;
			if(!s&&!h&&x==1&&!p[l])s=1;
			else s=0,h=1;
			return;
		}
		ls->add(u,v,x);
		rs->add(u,v,x);
		push_up();
	}
	int ask(int u,int v){
		if(!s)return 0;
		if(l>=v||r<=u)return 0;
		if(l>=u&&r<=v)return s;
		return ls->ask(u,v)+rs->ask(u,v);
	}
}S;
int main(){
	int t=0,x,y,z;
	for(int i=2;i<M;i++){
		if(!p[i])zhi[t++]=i;
		for(int j=0;zhi[j]*i<M;j++){
			p[i*zhi[j]]=1;
			if(i%zhi[j]==0)break;
		}
	}
	n=read();
	m=read();
	S.build(1,n+1);
	while(m--){
		t=read();
		x=read();
		y=read();
		if(t==1){
			z=read();
			if(z)S.add(x,y+1,z);
		}
		cout<<S.ask(x,y+1)<<'\n';
	}
	return 0;
}

上一题