QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#690211#8836. Highway HoaxRafi22Compile Error//C++145.1kb2024-10-30 21:03:162024-10-30 21:03:16

Judging History

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

  • [2024-10-30 21:03:16]
  • 评测
  • [2024-10-30 21:03:16]
  • 提交

answer

#include <bits/stdc++.h>
#pragma GCC target ("avx2,fma")
#pragma GCC optimize ("Ofast")
#pragma GCC optimize ("unroll-loops")


#define int long long
#define ll long long
#define ld long double
#define endl '\n'
#define st first
#define nd second
#define pb push_back
#define sz(x) (int)(x).size()
#define all(x) (x).begin(), (x).end()
#define FOR(i,l,r) for(int i=(l);i<=(r);i++)
#define ROF(i,r,l) for(int i=(r);i>=(l);i--)
using namespace std;
int inf=1000000000000000007;
//int mod=1000000007;
int mod1=998244353;

#ifdef DEBUG
auto&operator<<(auto&o,pair<auto,auto>p){return o<<"("<<p.first<<", "<<p.second<<")";}
auto operator<<(auto&o,auto x)->decltype(x.end(),o){o<<"{";int i=0;for(auto e:x)o<<","+!i++<<e;return o<<"}";}
#define debug(X...)cerr<<"["#X"]: ",[](auto...$){((cerr<<$<<"; "),...)<<endl;}(X)
#else
#define debug(...){}
#endif

const long long MOD = 998244353;
const long long mod = 998244353;
const long long HALF = 499122177;
const std::vector<long long> ntt_root = {1, 998244352, 911660635, 372528824, 929031873, 452798380, 922799308, 781712469, 476477967, 166035806, 258648936, 584193783, 63912897, 350007156, 666702199, 968855178, 629671588, 24514907, 996173970, 363395222, 565042129, 733596141, 267099868, 15311432};
const std::vector<long long> ntt_iroot = {1, 998244352, 86583718, 509520358, 337190230, 87557064, 609441965, 135236158, 304459705, 685443576, 381598368, 335559352, 129292727, 358024708, 814576206, 708402881, 283043518, 3707709, 121392023, 704923114, 950391366, 428961804, 382752275, 469870224};
void ntt(std::vector<long long> &A){
  int N = A.size();
  int M = __builtin_ctz(N);
  for (int i = M - 1; i >= 0; i--){
    for (int j = 0; j < N; j += (2 << i)){
      long long z = 1;
      for (int k = 0; k < (1 << i); k++){
        long long a = A[j + k] + A[j + (1 << i) + k];
        if (a >= MOD){
          a -= MOD;
        }
        long long b = A[j + k] - A[j + (1 << i) + k];
        if (b < 0){
          b += MOD;
        }
        b *= z;
        b %= MOD;
        A[j + k] = a;
        A[j + (1 << i) + k] = b;
        z *= ntt_root[i + 1];
        z %= MOD;
      }
    }
  }
}
void ntt_inv(std::vector<long long> &A){
  int N = A.size();
  int M = __builtin_ctz(N);
  for (int i = 0; i < M; i++){
    for (int j = 0; j < N; j += (2 << i)){
      long long z = 1;
      for (int k = 0; k < (1 << i); k++){
        A[j + (1 << i) + k] *= z;
        A[j + (1 << i) + k] %= MOD;
        long long a = A[j + k] + A[j + (1 << i) + k];
        if (a >= MOD){
          a -= MOD;
        }
        long long b = A[j + k] - A[j + (1 << i) + k];
        if (b < 0){
          b += MOD;
        }
        A[j + k] = a;
        A[j + (1 << i) + k] = b;
        z *= ntt_iroot[i + 1];
        z %= MOD;
      }
    }
  }
  long long Ninv = 1;
  for (int i = 0; i < M; i++){
    Ninv *= HALF;
    Ninv %= MOD;
  }
  for (int i = 0; i < N; i++){
    A[i] *= Ninv;
    A[i] %= MOD;
  }
}
std::vector<long long> convolution(std::vector<long long> A, std::vector<long long> B){
  int sz = A.size() + B.size() - 1;
  int N = sz == 1 ? 1 : 1 << (32 - __builtin_clz(sz - 1));
  A.resize(N);
  B.resize(N);
  ntt(A);
  ntt(B);
  std::vector<long long> ans(N);
  for (int i = 0; i < N; i++){
    ans[i] = A[i] * B[i] % MOD;
  }
  ntt_inv(ans);
  ans.resize(sz);
  return ans;
}

const int N=200007;

vector<pair<int,int>>G[N];
int w[N];
int DP[N][2];

vector<vector<int>>V[2];

vector<int>rek(int p,int l,int r)
{
    if(l>r) return {1,0};
    debug(l,sz(V[p]));
    if(l==r) return V[p][l];
    int m=(l+r)/2;
    vector<int>L=rek(p,l,m);
    vector<int>R=rek(p,m+1,r);
    return conv(L,R);
}

void dfs(int v,int o,int T)
{
    vector<vector<int>>X[2];
    for(auto [u,t]:G[v])
    {
        if(u==o) continue;
        dfs(u,v,t);
        X[t].pb({DP[u][0],DP[u][1]});
    }
    V[0]=X[0],V[1]=X[1];
    vector<int>V0=rek(0,0,sz(V[0])-1);
    vector<int>V1=rek(1,0,sz(V[1])-1);
    debug("XDD",v);
    debug(V0,sz(V[0]));
    debug(V1,sz(V[1]));
    FOR(k,0,min(sz(V0),sz(V1))-1)
    {

        DP[v][0]=(DP[v][0]+V0[k]*V1[k])%mod;
        if(w[v]==1&&k+1<sz(V0)) DP[v][0]=(DP[v][0]+V0[k+1]*V1[k]%mod)%mod;
        if(w[v]==0&&k+1<sz(V1)) DP[v][0]=(DP[v][0]+V0[k]*V1[k+1]%mod)%mod;


        if(T==0&&k+1<sz(V0)) DP[v][1]=(DP[v][1]+V0[k+1]*V1[k]%mod)%mod;
        if(T==1&&k+1<sz(V1)) DP[v][1]=(DP[v][1]+V0[k]*V1[k+1]%mod)%mod;
        if(T==w[v]) DP[v][1]=(DP[v][1]+V0[k]*V1[k]%mod)%mod;
        else
        {
            if(T==1&&k+2<sz(V0)) DP[v][1]=(DP[v][1]+V0[k+2]*V1[k]%mod)%mod;
            if(T==0&&k+2<sz(V1)) DP[v][1]=(DP[v][1]+V0[k]*V1[k+2]%mod)%mod;
        }
    }
    debug(v,DP[v][0],DP[v][1]);
}

signed main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    string s;
    int n;
    cin>>n>>s;
    FOR(i,1,n-1)
    {
        int a,b;
        cin>>a>>b;
        G[a].pb({b,0});
        G[b].pb({a,1});
    }
    FOR(i,1,n) w[i]=(s[i-1]=='S');
    dfs(1,0,0);
    cout<<DP[1][0]<<endl;





    return 0;
}

详细

answer.code: In function ‘std::vector<long long int> rek(long long int, long long int, long long int)’:
answer.code:127:12: error: ‘conv’ was not declared in this scope; did you mean ‘lconv’?
  127 |     return conv(L,R);
      |            ^~~~
      |            lconv
answer.code: In function ‘void dfs(long long int, long long int, long long int)’:
answer.code:133:14: warning: structured bindings only available with ‘-std=c++17’ or ‘-std=gnu++17’ [-Wc++17-extensions]
  133 |     for(auto [u,t]:G[v])
      |              ^