珂朵莉树求助
查看原帖
珂朵莉树求助
675915
cuteAru楼主2023/8/31 11:30
#include<bits/stdc++.h>
using namespace std;
//极致暴力珂朵莉!!! 
//inline int read(){
//   int s=0,w=1;
//   char ch=getchar();
//   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
//   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
//   return s*w;
//}//通用快写 
//inline void write(register long long x)
//{
//    if(x<0)
//	{
//        putchar('-');
//        x=-x;
//    }
//    if(x>9) write(x / 10);
//    putchar(x % 10 + '0');
//}//通用快读 
long long primes[1000100];
bool f[1000100];
typedef long long LO;
struct Tree
{
	int l,r;//用的区间
	mutable LO value;//修改返回的迭代器
	//重;载
	Tree(int L,int R=-1,LO V=0):l(L),r(R),value(V){}
    bool operator<(const Tree&z) const
    {
        return l<z.l;
    }
};
set<Tree> s;
set<Tree>::iterator fl(register int p)//拆分区间使连续段分裂完整 
{
	set<Tree>::iterator it=s.lower_bound(Tree(p));
	if(it!=s.end() && it->l==p) return it;//已经完整不用拆
	it--;
	register int l=it->l,r=it->r;
	LO val=it->value;
    s.erase(it);
	s.insert(Tree(l,p-1,val));//删除原连续段然后插入新连续段
    return s.insert(Tree(p,r,val)).first;//返回迭代器 
}
inline void hb(register int l,register int r,LO t)//平推/平摊区间 使成为大区间 
{
    set<Tree>::iterator q=fl(r+1);
    set<Tree>::iterator p=fl(l);
    s.erase(p,q);
	s.insert(Tree{l,r,t});
}
void sss()
{
	register int i,j;
	for(i=4;i<=1e7;i+=2) f[i]=true,sum++;
	for(i=3;i<=sqrt(1e7);++i)
	{	
		if(!f[i])
		{
			for(j=i;i*j<=1e7;++j)
			{
				if(!f[i*j])
				{
					f[i*j]=true;
				}
			}
		}
	}
}
int main()
{
	sss();
	register LO n,m,i,res,l,r,x;
	char a;
	scanf("%lld%lld",&n,&m);
	for (i=1;i<=n;++i)
	{
		scanf("%lld",&x);
		s.insert(Tree(i,i,x));
	}
	while(m--)
	{
		char p[3];
		scanf("%s",p);
		if(p[0]=='A')
		{
			scanf("%lld%lld",&x,&l);
			fl(l + 1),fl(l)->value+=x;
		}
		else if(p[0]=='R')
		{
			scanf("%lld%lld%lld",&x,&l,&r);
			hb(l,r,x);
		}
		else if(p[0]=='Q')
		{
			scanf("%lld%lld",&l,&r);
			set<Tree>::iterator itr=fl(r+1),itl=fl(l);
			res=0;
			for (set<Tree>::iterator i=itl;i!=itr;i++)
				if (i->value<=1e7 && !f[i->value])
					res+=(i->r)-(i->l)+1;
			printf("%lld\n",res);
		}
	}
	return 0;
}

一直unknown error

qwq

2023/8/31 11:30
加载中...