求调,不知道是复杂度假了还是常数巨大,一直TLE 7 个点 QWQ
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define Ld long double
#define l(p) tree[p].l
#define r(p) tree[p].r
#define sum(p,k) tree[p].sum[k]
#define chg(p) tree[p].chg
#define add(p) tree[p].add
const int N = 50005,M=20005;
LL n,q,x,y,l,r,pos,mod=19940417,g[50],c[N][25],d[50];
char op[2];
struct Segment_tree{
LL l,r,chg;
LL sum[25],add;
}tree[N*4];
inline LL min(LL a,LL b){
return a<b?a:b;
}
inline LL read(){
LL 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<<1)+(s<<3)+ch-'0';ch=getchar();}
return s*w;
}
inline void print(LL x){
char F[200];LL cnt=0;
if(x==0){putchar('0');putchar('\n');return ;}
if(x<0){putchar('-');x=-x;}
while(x){F[++cnt]=x%10;x/=10;}
while(cnt) putchar(F[cnt--]+'0');
putchar('\n');return ;
}
void ad(LL p,LL k){
if(!k||!p) return ;
LL l1=min(20,r(p)-l(p)+1);
d[0]=1;
for(int i=1;i<=l1;i++) d[i]=(d[i-1]*k)%mod;
for(int i=l1;i>=1;i--){
for(int j=0;j<i;j++){
sum(p,i)=(sum(p,i)+((sum(p,j)*d[i-j]%mod)*c[r(p)-l(p)+1-j][i-j])%mod)%mod;
}
}
add(p)=(add(p)+k)%mod;
return ;
}
void ch(LL p){
if(!p) return ;
for(int i=1;i<=min(20,r(p)-l(p)+1);i+=2)
sum(p,i)=(mod-sum(p,i))%mod;
add(p)=(mod-add(p))%mod;
chg(p)^=1;
return ;
}
void pushup(LL p){
LL l1=min(20,r(p)-l(p)+1),l2=min(20,r(p<<1)-l(p<<1)+1),l3=min(20,r(p<<1|1)-l(p<<1|1)+1);
for(int i=0;i<=l1;i++) sum(p,i)=0;
for(int i=0;i<=l2;i++)
for(int j=0;j<=l3;j++){
if(i+j>20) break;
sum(p,i+j)=(sum(p,i+j)+sum(p<<1,i)*sum(p<<1|1,j)%mod)%mod;
}
return ;
}
void pushdown(LL p){
if(chg(p)){
ch(p<<1);ch(p<<1|1);
chg(p)=0;
}
if(add(p)){
ad(p<<1,add(p));
ad(p<<1|1,add(p));
add(p)=0;
}
return ;
}
void build(LL p,LL l,LL r){
l(p)=l,r(p)=r;
sum(p,0)=1;
if(l==r){
sum(p,1)=(read()%mod+mod)%mod;
return ;
}
int mid=(l+r)>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
pushup(p);
return ;
}
void change(LL p,LL l,LL r,LL x,LL op){
if(l(p)>=l&&r(p)<=r){
if(op==1)
ad(p,x);
else
ch(p);
return ;
}
pushdown(p);
LL mid=(l(p)+r(p))>>1;
if(l<=mid) change(p<<1,l,r,x,op);
if(r>mid) change(p<<1|1,l,r,x,op);
pushup(p);
return ;
}
Segment_tree merge(Segment_tree ls,Segment_tree rs){
LL x=20;
Segment_tree now;
now.r=rs.r,now.l=ls.l;
LL l1=min(x,now.r-now.l+1),l2=min(x,ls.r-ls.l+1),l3=min(x,rs.r-rs.l+1);
for(int i=0;i<=l1;i++) now.sum[i]=0;
for(int i=0;i<=l2;i++)
for(int j=0;j<=l3;j++){
if(i+j>x) break;
now.sum[i+j]=(now.sum[i+j]+ls.sum[i]*rs.sum[j]%mod)%mod;
}
return now;
}
Segment_tree query(LL p,LL l,LL r){
if(l(p)>=l&&r(p)<=r) return tree[p];
pushdown(p);
LL mid=(l(p)+r(p))>>1;
if(r<=mid) return query(p<<1,l,r);
else
if(l>mid) return query(p<<1|1,l,r);
else return merge(query(p<<1,l,r),query(p<<1|1,l,r));
}
int main(){
n=read(),q=read();
c[0][0]=1;c[1][0]=1;c[1][1]=1;
for(int i=2;i<=N-5;i++){
c[i][0]=1;
for(int j=1;j<=min(20,i);j++){
c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
}
}
build(1,1,n);
for(int i=1;i<=q;i++){
cin>>op;l=read(),r=read();
if(op[0]=='I'){
x=read();
x%=mod;
change(1,l,r,(x+mod)%mod,1);
}else
if(op[0]=='R'){
change(1,l,r,0,0);
}else
if(op[0]=='Q'){
x=read();
print((query(1,l,r).sum[x]+mod)%mod);
}
}
return 0;
}