人傻常数大,已经调疯了
查看原帖
人傻常数大,已经调疯了
533452
xingke233楼主2022/11/16 17:43

求调,不知道是复杂度假了还是常数巨大,一直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;
}
2022/11/16 17:43
加载中...