QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#782707#9438. Two Boxstrlen_s_WA 21ms94156kbC++174.4kb2024-11-25 21:05:262024-11-25 21:05:30

Judging History

你现在查看的是最新测评结果

  • [2024-11-25 21:05:30]
  • 评测
  • 测评结果:WA
  • 用时:21ms
  • 内存:94156kb
  • [2024-11-25 21:05:26]
  • 提交

answer

#include<bits/stdc++.h>
#define ls (k<<1)
#define rs (k<<1|1)
#define mid (l+r>>1)
#define ll long long
using namespace std;
const int M=3e4+10,N=16,mod=998244353,inv2=499122177,B=15;
ll C[N][N],ivC[N][N];
ll xs[N][N][N];
int n,m,q;
ll pw[N];
ll dp[M][N][N];
int a[N];
struct node{
  ll c[N];
  void init(int len){
    memset(c,0,sizeof(c));
    for(int i=0;i<=len;i++)c[i]=1;
  }
};
node merge(node a,node b,int len){
  for(int i=0;i<=len;i++)a.c[i]=a.c[i]*b.c[i]%mod;
  return a;
}
struct segtree{
  node v[M<<2];
  int cnt[M<<2],sm[M<<2];
  int ik;
  void pushup(int k){v[k]=merge(v[ls],v[rs],ik),cnt[k]=cnt[ls]+cnt[rs],sm[k]=sm[ls]+sm[rs];}
  void build(int k,int l,int r){
    cnt[k]=r-l+1;v[k].init(ik);
    if(l==r)return;
    build(ls,l,mid),build(rs,mid+1,r);
  }
  void upd(int k,int l,int r,int x,node z,int z2,int z3){
    if(x>n)return;
    if(l==r){v[k]=z,cnt[k]+=z2,sm[k]=z3;return;}
    if(mid>=x)upd(ls,l,mid,x,z,z2,z3);
    else upd(rs,mid+1,r,x,z,z2,z3);
    pushup(k);
  }
  void qry(int k,int l,int r,int x,int y,node &ans,int &sum){
    if(x<=l&&r<=y){
      ans=merge(ans,v[k],ik);
      sum+=sm[k];
      return;
    }
    if(mid>=x)qry(ls,l,mid,x,y,ans,sum);
    if(y>mid)qry(rs,mid+1,r,x,y,ans,sum);
  }
  int findl(int k,int l,int r,int x){
    if(x<1)return 0;
    if(!cnt[k])return 0;
    if(l==r)return l+1;
    if(mid>=x)return findl(ls,l,mid,x);
    int p=findl(rs,mid+1,r,x);
    if(p)return p;
    return findl(ls,l,mid,x);
  }
  int findr(int k,int l,int r,int x){
    if(x>n)return n+1;
    if(!cnt[k])return n+1;
    if(l==r)return r;
    if(mid>=x){
      int p=findr(ls,l,mid,x);
      if(p!=n+1)return p;
      return findr(rs,mid+1,r,x);
    }
    return findr(rs,mid+1,r,x);
  }
}T[N];
ll ksm(ll a,int b){
  ll res=1;
  while(b){
    if(b&1)res=res*a%mod;
    a=a*a%mod,b>>=1;
  }
  return res;
}
void init(){
  C[0][0]=1;
  for(int i=1;i<=B;i++){
    C[i][0]=1;
    for(int j=1;j<=i;j++)
      C[i][j]=(C[i-1][j-1]+C[i-1][j])%mod;
  }
  for(int i=0;i<=B;i++)
    for(int j=0;j<=i;j++)
      ivC[i][j]=ksm(C[i][j],mod-2);
  for(int i=0;i<=B;i++)dp[0][i][0]=1;
  for(int i=1;i<=3e4;i++)
    for(int j=0;j<=B;j++)
      for(int k=0;k<=j;k++)
        dp[i][j][k]=((k+1<=j?dp[i-1][j][k+1]*(k+1):0)+(k?dp[i-1][j][k-1]*(j-k+1):0))%mod;
  for(int i=0;i<=3e4;i++)
    for(int j=0;j<=B;j++)
      for(int k=0;k<=j;k++)
        dp[i][j][k]=dp[i][j][k]*ivC[j][k]%mod;
  for(int l=0;l<=B;l++)
    for(int i=0;i<=l;i++)
      for(int j=0;j<=l;j++)
        for(int k=0;k<=min(i,j);k++)
          xs[l][i][j]=(xs[l][i][j]+((k&1)?mod-1:1)*C[i][k]%mod*C[l-i][j-k])%mod;
  pw[0]=1;
  for(int i=1;i<=B;i++)pw[i]=pw[i-1]*inv2%mod;
}
void FWT(ll *c,int len,ll z){
  ll rec[N]={0};
  for(int i=0;i<=len;i++)
    for(int j=0;j<=len;j++)
      rec[i]=(rec[i]+c[j]*xs[len][i][j]%mod*z)%mod;
  for(int i=0;i<=len;i++)c[i]=rec[i];
}
void mdf(int k,int p){
  if(p<1||p>n)return;
  int l=max(T[k].findl(1,1,n,p),1),tr=T[k].findr(1,1,n,p),r=min(tr,n),len=r-l+1;
  if(l>r)return;
  node z;z.init(k);
  T[k].upd(1,1,n,p+1,z,0,0);
  if(k==m){
    for(int i=0;i<=k;i++)z.c[i]=dp[len][k][i];
    if(tr==n+1)for(int i=0;i<k;i++)z.c[i]=(z.c[i]+z.c[i+1])%mod;
    z.c[k]=0;
    FWT(z.c,k-1,1);
    T[k].upd(1,1,n,l,z,0,r-l+1);
    return;
  }
  node ans;ans.init(k);int sum=0;
  T[k+1].qry(1,1,n,l,r,ans,sum);
  len-=sum;
  for(int i=0;i<=k;i++)z.c[i]=dp[len][k][i];
  FWT(z.c,k,1);
  for(int i=0;i<=k;i++)z.c[i]=z.c[i]*ans.c[i]%mod;
  FWT(z.c,k,pw[k]);
  if(tr==n+1)for(int i=0;i<k;i++)z.c[i]=(z.c[i]+z.c[i+1])%mod;
  z.c[k]=0;
  FWT(z.c,k-1,1);
  T[k].upd(1,1,n,l,z,0,r-l+1);
}
void upd(int p,int z){
  if(a[p]==z)return;
  node c;
  if(a[p]<z){
    for(int i=z;i>a[p];i--){
      c.init(i-1);
      T[i].upd(1,1,n,p,c,-1,0);
      mdf(i,p);
    }
  }
  else{
    for(int i=a[p];i>z;i--){
      c.init(i-1);
      T[i].upd(1,1,n,p,c,1,0);
      mdf(i,p-1),mdf(i,p+1);
    }
  }
  for(int i=min(a[p],z);i>=2;i--)mdf(i,p);
  a[p]=z;
}
signed main(){
  ios::sync_with_stdio(0);
  cin.tie(0),cout.tie(0);
  init();
  cin>>n>>m>>q;
  for(int i=2;i<=m;i++)T[i].ik=i-1,T[i].build(1,1,n);
  for(int i=1;i<=n;i++)a[i]=1;
  for(int i=1,x;i<=n;i++){
    cin>>x;
    upd(i,x);
  }
  while(q--){
    int p,x;
    cin>>p>>x;
    upd(p,x);
    cout<<T[2].v[1].c[0]<<'\n';
  }
  return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 8ms
memory: 75260kb

input:

3 3 2
1 3 1
3 2
1 3

output:

5
14

result:

ok 2 tokens

Test #2:

score: 0
Accepted
time: 15ms
memory: 87864kb

input:

6 8 1
3 8 7 7 1 6
1 4

output:

2100

result:

ok "2100"

Test #3:

score: 0
Accepted
time: 11ms
memory: 94156kb

input:

12 10 8
1 3 2 6 3 6 7 7 5 5 4 7
12 4
7 10
4 2
9 8
9 9
8 3
4 9
10 2

output:

2741280
3007680
1503840
1916160
1972800
728640
1821600
621440

result:

ok 8 tokens

Test #4:

score: -100
Wrong Answer
time: 21ms
memory: 78752kb

input:

1939 5 1
5 1 1 2 1 5 4 5 3 1 2 1 3 3 1 2 3 5 5 3 2 2 1 3 1 5 1 4 2 5 4 1 5 4 3 4 5 3 3 3 3 2 1 2 3 5 1 4 2 1 4 1 3 5 2 2 1 4 4 5 3 2 3 2 1 1 5 5 5 5 3 4 3 1 3 1 1 1 3 5 3 5 1 5 4 3 2 1 2 2 2 3 5 2 4 2 3 1 2 5 5 1 2 5 2 5 3 3 3 4 5 1 5 4 5 3 3 5 4 5 3 5 3 2 2 5 3 2 4 3 3 4 2 2 1 3 1 3 5 2 3 4 2 3 2 4...

output:

225761069

result:

wrong answer 1st words differ - expected: '894246250', found: '225761069'