ZOJ 2015 10月份 月赛 3911 Prime Query
这道题我改啊,改啊,交啊,就对了。
#include <stdio.h> #include <stdlib.h> #include <math.h> #include<cstring> #include<algorithm> using namespace std; const int N = 10000005; const int M = 100005; int a[N]; int p[M]; int tree[M*4],cover[M*4]; void Prime() { a[1] = 1; for (int i=2; i<sqrt(N); i++) { if(a[i]); else{ for (int j=2*i; j<N ;j+=i) { a[j]=1; } } } } void down(int i,int l,int r) { int k; int mid=(l+r)>>1; if (cover[i] != -1) { if(l!=r){cover[i<<1]=cover[i<<1|1]=cover[i]; if(!a[cover[i]])k=1; else k=0; tree[i<<1]=k*(mid-l+1); tree[i<<1|1]=k*(r-mid);} else p[l]=cover[i]; cover[i]=-1; } } void build(int rt,int l,int r) { if(l==r){ if(!a[p[l]]) tree[rt]=1; else tree[rt]=0; return; } int mid=(l+r)>>1; build(rt<<1,l,mid); build(rt<<1|1,mid+1,r); tree[rt]=tree[rt<<1]+tree[rt<<1|1]; } void A(int v,int l,int rt,int L,int R) { down(rt,L,R); if(L==R){ if(!a[p[l]+=v]) tree[rt]=1; else tree[rt]=0; return; } int mid=(L+R)>>1; if(l<=mid)A(v,l,rt<<1,L,mid); if(l>mid)A(v,l,rt<<1|1,mid+1,R); tree[rt]=tree[rt<<1]+tree[rt<<1|1]; } int Q(int l,int r,int rt,int L,int R) { down(rt,L,R); if(L>=l&&R<=r){ return tree[rt]; } int ans=0; int mid=(L+R)>>1; if(l<=mid)ans+=Q(l,r,rt<<1,L,mid); if(r>mid)ans+=Q(l,r,rt<<1|1,mid+1,R); return ans; } void Re(int k,int l,int r,int rt,int L,int R) {down(rt,L,R); if(L>=l&&R<=r){ if(!a[k]) tree[rt]=R-L+1; else tree[rt]=0; cover[rt]=k; return; } int mid=(L+R)>>1; if(l<=mid)Re(k,l,r,rt<<1,L,mid); if(r>mid)Re(k,l,r,rt<<1|1,mid+1,R); tree[rt]=tree[rt<<1]+tree[rt<<1|1]; } int main() { Prime(); int T,n,m; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d",&p[i]); } build(1,1,n); memset(cover,-1,sizeof cover); char s[10]; while(m--) { scanf("%s",s); if(s[0]=='A') { int v,l; scanf("%d%d",&v,&l); A(v,l,1,1,n); //for(int i=1;i<=n;i++)printf("%d ",p[i]); // puts(""); } else if(s[0]=='Q') { int l,r; scanf("%d%d",&l,&r); printf("%d\n",Q(l,r,1,1,n)); //for(int i=1;i<=n;i++)printf("%d ",p[i]); // puts(""); } else if(s[0]=='R') { int x,l,r; scanf("%d%d%d",&x,&l,&r); Re(x,l,r,1,1,n); // for(int i=1;i<=n;i++)printf("%d ",p[i]); // puts(""); } } } }
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 10000005;
const int M = 100005;
int a[N];
int p[M];
int tree[M*4],cover[M*4];
void Prime()
{
a[1] = 1;
for (int i=2; i<sqrt(N); i++) {
if(a[i]);
else{
for (int j=2*i; j<N ;j+=i) {
a[j]=1;
}
}
}
}
void down(int i,int l,int r)
{
int k;
int mid=(l+r)>>1;
if (cover[i] != -1)
{
if(l!=r){cover[i<<1]=cover[i<<1|1]=cover[i];
if(!a[cover[i]])k=1;
else k=0;
tree[i<<1]=k*(mid-l+1);
tree[i<<1|1]=k*(r-mid);}
else p[l]=cover[i];
cover[i]=-1;
}
}
void build(int rt,int l,int r)
{
if(l==r){
if(!a[p[l]])
tree[rt]=1;
else tree[rt]=0;
return;
}
int mid=(l+r)>>1;
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
tree[rt]=tree[rt<<1]+tree[rt<<1|1];
}
void A(int v,int l,int rt,int L,int R)
{ down(rt,L,R);
if(L==R){
if(!a[p[l]+=v])
tree[rt]=1;
else tree[rt]=0;
return;
}
int mid=(L+R)>>1;
if(l<=mid)A(v,l,rt<<1,L,mid);
if(l>mid)A(v,l,rt<<1|1,mid+1,R);
tree[rt]=tree[rt<<1]+tree[rt<<1|1];
}
int Q(int l,int r,int rt,int L,int R)
{ down(rt,L,R);
if(L>=l&&R<=r){
return tree[rt];
}
int ans=0;
int mid=(L+R)>>1;
if(l<=mid)ans+=Q(l,r,rt<<1,L,mid);
if(r>mid)ans+=Q(l,r,rt<<1|1,mid+1,R);
return ans;
}
void Re(int k,int l,int r,int rt,int L,int R)
{down(rt,L,R);
if(L>=l&&R<=r){
if(!a[k])
tree[rt]=R-L+1;
else tree[rt]=0;
cover[rt]=k;
return;
}
int mid=(L+R)>>1;
if(l<=mid)Re(k,l,r,rt<<1,L,mid);
if(r>mid)Re(k,l,r,rt<<1|1,mid+1,R);
tree[rt]=tree[rt<<1]+tree[rt<<1|1];
}
int main() {
Prime();
int T,n,m;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&p[i]);
}
build(1,1,n);
memset(cover,-1,sizeof cover);
char s[10];
while(m--)
{
scanf("%s",s);
if(s[0]=='A')
{
int v,l;
scanf("%d%d",&v,&l);
A(v,l,1,1,n);
//for(int i=1;i<=n;i++)printf("%d ",p[i]);
// puts("");
}
else if(s[0]=='Q')
{
int l,r;
scanf("%d%d",&l,&r);
printf("%d\n",Q(l,r,1,1,n));
//for(int i=1;i<=n;i++)printf("%d ",p[i]);
// puts("");
}
else if(s[0]=='R')
{
int x,l,r;
scanf("%d%d%d",&x,&l,&r);
Re(x,l,r,1,1,n);
// for(int i=1;i<=n;i++)printf("%d ",p[i]);
// puts("");
}
}
}
}