提出 #57135103
ソースコード 拡げる
#include<bits/stdc++.h>
#ifdef xay5421
#define D(...) fprintf(stderr,__VA_ARGS__)
#define DD(...) D(#__VA_ARGS__ "="),debug_helper::debug(__VA_ARGS__),D("\n")
#include"/home/xay5421/debug.hpp"
#else
#define D(...) ((void)0)
#define DD(...) ((void)0)
#endif
#define pb push_back
#define eb emplace_back
#define SZ(x) ((int)(x).size())
#define each(x,v) for(auto&x:v)
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
template<class T>void rd(T&x){int f=0,c;while(!isdigit(c=getchar()))f^=!(c^45);x=(c&15);while(isdigit(c=getchar()))x=x*10+(c&15);if(f)x=-x;}
template<class T>void pt(T x,int c=-1){if(x<0)putchar('-'),x=-x;if(x>9)pt(x/10);putchar(x%10+48);if(c!=-1)putchar(c);}
using namespace std;
const int P=998244353;
int ad(int k1,int k2){return k1+k2>=P?k1+k2-P:k1+k2;}
int su(int k1,int k2){return k1-k2<0?k1-k2+P:k1-k2;}
int mu(int k1,int k2){return 1ULL*k1*k2%P;}
void uad(int&k1,int k2){(k1+=k2)>=P&&(k1-=P);}
void usu(int&k1,int k2){(k1-=k2)<0&&(k1+=P);}
template<class... T>int ad(int k1,T... k2){return ad(k1,ad(k2...));}
template<class... T>int su(int k1,T... k2){return su(k1,ad(k2...));}
template<class... T>int mu(int k1,T... k2){return mu(k1,mu(k2...));}
template<class... T>void uad(int&k1,T... k2){return uad(k1,ad(k2...));}
template<class... T>void usu(int&k1,T... k2){return usu(k1,ad(k2...));}
int po(int k1,int k2){
int k3=1;
for(;k2;k2>>=1,k1=mu(k1,k1))if(k2&1)k3=mu(k3,k1);
return k3;
}
using LL=long long;
using ULL=unsigned long long;
const int N=250005,K=20,M=250005;
int n,m,fa[N],a[M],b[M],lg[M],id[M],fac[M],ifac[M];
vector<int>e[N];
int tin[N],tou[N],idx;
int f[N][K],g[N][K];
int L[M],R[M];
void dfs(int k1){
tin[k1]=++idx;
for(auto&x:e[k1]){
dfs(x);
}
tou[k1]=idx;
}
int qmin(int l,int r){
int x=lg[r-l+1];
return min(f[l][x],f[r-(1<<x)+1][x]);
}
int qmax(int l,int r){
int x=lg[r-l+1];
return max(g[l][x],g[r-(1<<x)+1][x]);
}
int tr[M];
void add(int x,int y){for(int i=x;i<M;i+=i&-i)tr[i]+=y;}
int query(int x){int y=0;for(int i=x;i;i&=i-1)y+=tr[i];return y;}
int main(){
#ifdef xay5421
freopen("a.in","r",stdin);
#endif
fac[0]=1;
rep(i,1,M-1)fac[i]=mu(fac[i-1],i);
ifac[M-1]=po(fac[M-1],P-2);
per(i,M-1,1)ifac[i-1]=mu(ifac[i],i);
rep(i,2,M-1)lg[i]=lg[i>>1]+1;
rd(n),rd(m);
rep(i,2,n)rd(fa[i]),e[fa[i]].pb(i);
dfs(1);
rep(i,1,m)rd(a[i]);
rep(i,1,m)rd(b[i]);
rep(i,1,m){
f[i][0]=tin[b[i]];
g[i][0]=tin[b[i]];
}
rep(j,1,K-1)rep(i,1,m-(1<<j)+1){
f[i][j]=min(f[i][j-1],f[i+(1<<(j-1))][j-1]);
g[i][j]=max(g[i][j-1],g[i+(1<<(j-1))][j-1]);
}
rep(i,1,m){
L[i]=R[i]=i;
per(j,K-1,0)if(L[i]-(1<<j)>=1&&tin[a[i]]<=qmin(L[i]-(1<<j),i)&&qmax(L[i]-(1<<j),i)<=tou[a[i]]){
L[i]-=1<<j;
}
per(j,K-1,0)if(R[i]+(1<<j)<=m&&tin[a[i]]<=qmin(i,R[i]+(1<<j))&&qmax(i,R[i]+(1<<j))<=tou[a[i]]){
R[i]+=1<<j;
}
}
int lst=0;
auto push=[&](int cur){
rep(i,lst+1,cur-1){
L[i]=max(L[i],lst+1);
R[i]=min(R[i],cur-1);
}
lst=cur;
};
rep(i,1,m){
if(L[i]==R[i]){
push(i);
}
}
push(m+1);
rep(i,1,m)id[i]=i;
sort(id+1,id+m+1,[&](int lhs,int rhs){
if(R[lhs]-L[lhs]!=R[rhs]-L[rhs])return R[lhs]-L[lhs]<R[rhs]-L[rhs];
if(L[lhs]!=L[rhs])return L[lhs]<L[rhs];
if(a[lhs]!=a[rhs]) return a[lhs]<a[rhs];
return lhs<rhs;
});
set<int>S;
S.insert(0);
S.insert(m+1);
int ans=1;
for(int l=1,r;l<=m;l=r){
r=l+1;
while(r<=m&&R[id[r]]-L[id[r]]==R[id[l]]-L[id[l]]&&L[id[r]]==L[id[l]]&&a[id[l]]==a[id[r]]){
++r;
}
rep(_,l,r-1){
int i=id[_];
R[i]=min(R[i],*S.lower_bound(i)-1);
L[i]=max(L[i],(*--S.upper_bound(i))+1);
int tt=R[i]-L[i]+1-(query(R[i])-query(L[i]-1));
add(L[i],1);
ans=mu(ans,tt);
if(tt==1){
S.insert(L[i]);
S.insert(R[i]);
}
}
}
for(int l=1,r;l<=m;l=r){
r=l+1;
while(r<=m&&R[id[r]]-L[id[r]]==R[id[l]]-L[id[l]]&&L[id[r]]==L[id[l]]&&a[id[l]]==a[id[r]]){
++r;
}
ans=mu(ans,ifac[r-l]);
}
printf("%d\n",ans);
return 0;
}
提出情報
ジャッジ結果
セット名 |
Sample |
All |
得点 / 配点 |
0 / 0 |
900 / 900 |
結果 |
|
|
セット名 |
テストケース |
Sample |
00-sample-001.txt, 00-sample-002.txt, 00-sample-003.txt, 00-sample-004.txt |
All |
00-sample-001.txt, 00-sample-002.txt, 00-sample-003.txt, 00-sample-004.txt, 01-001.txt, 01-002.txt, 01-003.txt, 01-004.txt, 01-005.txt, 01-006.txt, 01-007.txt, 01-008.txt, 01-009.txt, 01-010.txt, 01-011.txt, 01-012.txt, 01-013.txt, 01-014.txt, 01-015.txt, 01-016.txt, 01-017.txt, 01-018.txt, 01-019.txt, 01-020.txt, 01-021.txt, 01-022.txt, 01-023.txt, 01-024.txt, 01-025.txt, 01-026.txt, 01-027.txt, 01-028.txt, 01-029.txt, 01-030.txt, 01-031.txt, 01-032.txt, 01-033.txt, 01-034.txt, 01-035.txt, 01-036.txt |
ケース名 |
結果 |
実行時間 |
メモリ |
00-sample-001.txt |
AC |
11 ms |
6696 KiB |
00-sample-002.txt |
AC |
5 ms |
6568 KiB |
00-sample-003.txt |
AC |
5 ms |
6700 KiB |
00-sample-004.txt |
AC |
5 ms |
6692 KiB |
01-001.txt |
AC |
5 ms |
6584 KiB |
01-002.txt |
AC |
5 ms |
6748 KiB |
01-003.txt |
AC |
5 ms |
6656 KiB |
01-004.txt |
AC |
5 ms |
6732 KiB |
01-005.txt |
AC |
5 ms |
6800 KiB |
01-006.txt |
AC |
216 ms |
80668 KiB |
01-007.txt |
AC |
229 ms |
65092 KiB |
01-008.txt |
AC |
245 ms |
75460 KiB |
01-009.txt |
AC |
271 ms |
75812 KiB |
01-010.txt |
AC |
223 ms |
73520 KiB |
01-011.txt |
AC |
278 ms |
75960 KiB |
01-012.txt |
AC |
220 ms |
74528 KiB |
01-013.txt |
AC |
254 ms |
74132 KiB |
01-014.txt |
AC |
268 ms |
75800 KiB |
01-015.txt |
AC |
275 ms |
76224 KiB |
01-016.txt |
AC |
217 ms |
73676 KiB |
01-017.txt |
AC |
267 ms |
74100 KiB |
01-018.txt |
AC |
273 ms |
76264 KiB |
01-019.txt |
AC |
268 ms |
76424 KiB |
01-020.txt |
AC |
208 ms |
73484 KiB |
01-021.txt |
AC |
258 ms |
74072 KiB |
01-022.txt |
AC |
271 ms |
76440 KiB |
01-023.txt |
AC |
256 ms |
80520 KiB |
01-024.txt |
AC |
254 ms |
71508 KiB |
01-025.txt |
AC |
224 ms |
78108 KiB |
01-026.txt |
AC |
253 ms |
72000 KiB |
01-027.txt |
AC |
254 ms |
76960 KiB |
01-028.txt |
AC |
141 ms |
74632 KiB |
01-029.txt |
AC |
140 ms |
74696 KiB |
01-030.txt |
AC |
153 ms |
77240 KiB |
01-031.txt |
AC |
179 ms |
85068 KiB |
01-032.txt |
AC |
245 ms |
86260 KiB |
01-033.txt |
AC |
124 ms |
73660 KiB |
01-034.txt |
AC |
166 ms |
73588 KiB |
01-035.txt |
AC |
130 ms |
73636 KiB |
01-036.txt |
AC |
201 ms |
77844 KiB |