QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#88955 | #2677. JOJO | RainAir | 100 ✓ | 83ms | 94748kb | C++23 | 5.9kb | 2023-03-18 02:57:10 | 2023-03-18 02:57:12 |
Judging History
answer
#include <bits/stdc++.h>
#define fi first
#define se second
#define DB double
#define U unsigned
#define P std::pair
#define LL long long
#define LD long double
#define pb emplace_back
#define MP std::make_pair
#define SZ(x) ((int)x.size())
#define all(x) x.begin(),x.end()
#define CLR(i,a) memset(i,a,sizeof(i))
#define FOR(i,a,b) for(int i = a;i <= b;++i)
#define ROF(i,a,b) for(int i = a;i >= b;--i)
#define DEBUG(x) std::cerr << #x << '=' << x << std::endl
const int MAXN = 1e5 + 5;
const int MAXM = 5e6 + 5;
const int ha = 998244353;
inline int mod(int x){
x -= ha;x += x>>31&ha;return x;
}
struct DS1{
int lc[MAXM],rc[MAXM],val[MAXM],n,tot;
inline void init(int _){
FOR(i,0,tot) lc[i] = rc[i] = val[i] = 0;
n = _;tot = 0;
}
inline void update(int &x,int l,int r,int p,int d){
++tot;std::tie(lc[tot],rc[tot],val[tot]) = {lc[x],rc[x],val[x]};x = tot;
if(l == r){
val[x] = d;
return;
}
int mid = (l + r) >> 1;
if(p <= mid) update(lc[x],l,mid,p,d);
else update(rc[x],mid+1,r,p,d);
}
inline int update(int x,int p,int d){
update(x,1,n,p,d);
return x;
}
inline int query(int x,int l,int r,int p){
if(!x) return -1;
if(l == r) return val[x];
int mid = (l + r) >> 1;
if(p <= mid) return query(lc[x],l,mid,p);
else return query(rc[x],mid+1,r,p);
}
inline int query(int x,int p){
return query(x,1,n,p);
}
}T1;
inline int S2(int x){
if(x&1) return 1ll*x*((x+1)/2)%ha;
else return 1ll*(x/2)*(x+1)%ha;
}
struct DS2{
int lc[MAXM],rc[MAXM],sm[MAXM],tag[MAXM],n,tot;
inline void init(int _){
FOR(i,0,tot) std::tie(lc[i],rc[i],sm[i],tag[i]) = std::tuple<int,int,int,int>{0,0,0,0};
n = _;tot = 0;
}
inline int New(int x){
++tot;std::tie(lc[tot],rc[tot],sm[tot],tag[tot]) = {lc[x],rc[x],sm[x],tag[x]};
return tot;
}
inline void cover(int &x,int l,int r,int d){
x = New(x);sm[x] = 1ll*(r-l+1)*d%ha;tag[x] = d;
}
inline void pushdown(int x,int l,int r){
if(tag[x]){
int mid = (l + r) >> 1;
cover(lc[x],l,mid,tag[x]);
cover(rc[x],mid+1,r,tag[x]);
tag[x] = 0;
}
}
inline void modify(int &x,int l,int r,int L,int R,int d){
x = New(x);
if(l == L && r == R){
sm[x] = 1ll*(r-l+1)*d%ha;
tag[x] = d;
return;
}
int mid = (l + r) >> 1;pushdown(x,l,r);
if(R <= mid) modify(lc[x],l,mid,L,R,d);
else if(L > mid) modify(rc[x],mid+1,r,L,R,d);
else modify(lc[x],l,mid,L,mid,d),modify(rc[x],mid+1,r,mid+1,R,d);
sm[x] = mod(sm[lc[x]]+sm[rc[x]]);
}
inline int modify(int x,int l,int r,int d){
modify(x,1,n,l,r,d);return x;
}
inline int query(int x,int l,int r,int L,int R){
if(!x) return 0;
if(l == L && r == R) return sm[x];
int mid = (l + r) >> 1;pushdown(x,l,r);
if(R <= mid) return query(lc[x],l,mid,L,R);
if(L > mid) return query(rc[x],mid+1,r,L,R);
return mod(query(lc[x],l,mid,L,mid)+query(rc[x],mid+1,r,mid+1,R));
}
inline int query(int x,int l,int r){
return query(x,1,n,l,r);
}
}T2;
std::vector<P<int,int> > G[MAXN];
int rt[MAXN],ch[MAXN],r2[MAXN][26],mxl[MAXN][26];
int fail[MAXN];
std::map<P<int,int>,int> S;
inline int getid(P<int,int> x){
if(S.find(x) == S.end()) S[x] = SZ(S)+1;
return S[x];
}
inline void dfs1(int v,int len=-1,int pos=-1){
// 注意: 选择根往下的第一个连续段的条件是长度 <=
// 版本不一样的点之间显然不能连 fail
// rt[v] = rt[fail[v]];
// for(auto x:G[v]) rt[v] = T1.update(rt[v],getid({ch[x.fi],x.se}),x.fi);
for(auto x:G[v]){
//rt[v] = T1.update(rt[fail[v]],getid({ch[x.fi],x.se}),x.fi); 这个在 v=0会锅
if(v){
rt[v] = T1.update(rt[fail[v]],getid({ch[x.fi],x.se}),x.fi);
fail[x.fi] = std::max(0,T1.query(rt[fail[v]],getid({ch[x.fi],x.se})));
if(!fail[x.fi] && x.se >= len && ch[x.fi] == ch[pos]) fail[x.fi] = pos;
}
if(len == -1) dfs1(x.fi,x.se,x.fi);
else dfs1(x.fi,len,pos);
}
}
int ans[MAXN];
inline void dfs2(int v,int len=0,int ll=-1,int pos=-1){
// 这里也是 不要算别的版本的贡献!
// 也是要特判开头的那一段...
memcpy(r2[v],r2[fail[v]],sizeof(r2[v]));
memcpy(mxl[v],mxl[fail[v]],sizeof(mxl[v]));
int *rt = r2[v],*mx = mxl[v];
for(auto x:G[v]){
if(len){
int lim = std::min(x.se,mx[ch[x.fi]]);
if(lim) ans[x.fi] = mod(T2.query(rt[ch[x.fi]],1,lim)+S2(lim-1));
if(x.se > mx[ch[x.fi]] && ch[pos] == ch[x.fi]){
ans[x.fi] = mod(ans[x.fi]+1ll*(x.se-mx[ch[x.fi]])*ll%ha);
}
}
else ans[x.fi] = S2(x.se-1);
}
for(auto x:G[v]){
int t1 = rt[ch[x.fi]],t2 = mx[ch[x.fi]];
rt[ch[x.fi]] = T2.modify(rt[ch[x.fi]],1,x.se,len+1);
mx[ch[x.fi]] = std::max(mx[ch[x.fi]],x.se);
ans[x.fi] = mod(ans[x.fi]+ans[v]);
if(ll == -1) dfs2(x.fi,len+x.se,x.se,x.fi);
else dfs2(x.fi,len+x.se,ll,pos);
rt[ch[x.fi]] = t1;mx[ch[x.fi]] = t2;
}
}
int ps[MAXN];
int main(){
// freopen("jojo3.in","r",stdin);
// freopen("jojo.out","w",stdout);
int n;scanf("%d",&n);
int now = 0;
FOR(i,1,n){
int opt,x;scanf("%d%d",&opt,&x);
if(opt == 1){
char c[23];scanf("%s",c);ch[i] = c[0]-'a';
G[now].pb(i,x);now = i;getid({ch[i],x});
}
else{
now = ps[x];
}
ps[i] = now;
}
T1.init(SZ(S));
dfs1(0);
T2.init(10000);
dfs2(0);
FOR(i,1,n) printf("%d\n",ans[ps[i]]);
return 0;
}
詳細信息
Test #1:
score: 10
Accepted
time: 1ms
memory: 6036kb
input:
300 1 281 t 1 196 p 1 96 g 1 196 w 2 1 1 281 g 1 14 n 1 14 x 1 173 y 1 96 z 1 96 u 1 96 h 2 6 1 281 t 2 7 1 196 p 2 16 1 96 g 1 196 w 2 6 1 281 x 1 14 n 1 14 x 1 173 y 1 96 z 1 96 u 1 96 h 1 16 j 1 281 t 1 196 p 1 96 g 1 196 w 1 281 g 2 14 1 14 n 1 14 x 1 173 y 1 96 z 1 96 u 1 96 h 1 281 t 1 196 p 1...
output:
39340 39340 39340 39340 39340 39340 39340 39340 39340 39340 39340 39340 39340 78961 39340 39340 39340 39340 39340 39340 39340 39340 39340 39340 39340 39340 39340 39340 78961 78961 78961 78961 78961 78961 78961 78961 78961 78961 78961 78961 118582 118582 118582 118582 118582 118582 118582 118582 1185...
result:
ok 300 numbers
Test #2:
score: 10
Accepted
time: 2ms
memory: 6104kb
input:
300 1 81 g 1 23 q 1 126 e 1 244 d 1 20 g 1 20 d 1 277 i 1 126 j 1 267 i 1 277 c 1 126 j 1 20 e 1 277 a 1 45 e 1 23 h 1 277 g 1 267 h 1 277 c 1 244 i 1 23 g 1 126 e 1 244 d 1 20 g 2 9 1 20 d 1 277 i 1 126 j 1 267 i 1 277 c 1 126 j 1 20 e 1 277 a 1 45 e 1 23 h 2 0 1 277 g 1 267 h 1 277 c 2 28 1 244 n ...
output:
3240 3240 3240 3240 3450 3450 3450 3450 3450 3450 3450 3450 3450 3450 3450 22647 22647 22647 22647 22923 22923 22923 23133 3450 3450 3450 3450 3450 3450 3450 3450 3450 3450 3450 0 38226 38226 38226 3450 3450 3726 3726 3726 3936 3936 3936 3450 3450 3450 3450 3450 3450 3450 3450 3450 22647 38226 38226...
result:
ok 300 numbers
Test #3:
score: 10
Accepted
time: 52ms
memory: 55020kb
input:
100000 1 1 c 1 1 v 1 1 u 1 1 f 1 1 g 1 1 l 1 1 c 1 1 a 1 1 j 1 1 c 1 1 y 1 1 l 1 1 n 1 1 u 1 1 o 1 1 u 2 0 1 1 b 1 1 c 1 1 a 1 1 b 1 1 c 1 1 a 1 1 b 1 1 c 1 1 a 1 1 b 1 1 c 1 1 a 1 1 b 1 1 c 1 1 a 1 1 b 1 1 c 1 1 a 1 1 b 1 1 c 1 1 a 1 1 b 1 1 c 1 1 a 1 1 b 1 1 c 1 1 a 1 1 b 1 1 c 1 1 a 1 1 b 1 1 c 1...
output:
0 0 0 0 0 0 1 1 1 2 2 2 2 2 2 2 0 0 0 0 1 3 6 10 15 21 28 36 45 55 66 78 91 105 120 136 153 171 190 210 231 253 276 300 325 351 378 406 435 465 496 528 561 595 630 666 703 741 780 820 861 903 946 990 1035 1081 1128 1176 1225 1275 1326 1378 1431 1485 1540 1596 1653 1711 1770 1830 1891 1953 2016 2080 ...
result:
ok 100000 numbers
Test #4:
score: 10
Accepted
time: 41ms
memory: 55500kb
input:
100000 1 1 q 1 1 w 1 1 e 2 1 1 1 s 1 1 n 1 1 i 1 1 l 1 1 d 1 1 x 1 1 f 1 1 s 1 1 p 1 1 y 1 1 d 1 1 b 1 1 v 1 1 i 1 1 q 1 1 t 1 1 i 1 1 r 1 1 e 1 1 r 1 1 e 1 1 t 2 18 1 1 p 1 1 f 1 1 p 1 1 t 1 1 c 1 1 q 1 1 v 1 1 z 1 1 v 1 1 x 1 1 u 1 1 x 1 1 h 1 1 b 1 1 v 1 1 c 1 1 a 1 1 x 1 1 c 1 1 a 1 1 g 1 1 a 1 ...
output:
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 3 6 ...
result:
ok 100000 numbers
Test #5:
score: 10
Accepted
time: 49ms
memory: 55052kb
input:
100000 1 1 c 1 1 t 1 1 f 1 1 t 1 1 y 1 1 j 1 1 w 1 1 k 1 1 r 1 1 w 1 1 c 1 1 z 1 1 s 1 1 l 1 1 y 1 1 o 1 1 l 1 1 k 1 1 b 1 1 f 1 1 o 1 1 b 1 1 e 1 1 z 1 1 n 1 1 z 1 1 a 1 1 l 1 1 z 1 1 y 1 1 j 1 1 a 1 1 w 1 1 a 1 1 o 2 18 1 1 p 1 1 m 1 1 t 1 1 i 1 1 v 1 1 c 1 1 m 1 1 l 1 1 f 1 1 s 1 1 r 1 1 q 1 1 f ...
output:
0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 7 7 7 7 7 7 7 7 7 7 7 7 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 ...
result:
ok 100000 numbers
Test #6:
score: 10
Accepted
time: 73ms
memory: 89996kb
input:
100000 1 7564 e 1 1730 a 1 6135 b 1 8268 c 1 1730 d 1 2067 a 1 2067 b 1 2067 e 1 2067 a 1 7246 b 1 7246 d 1 7564 a 1 8268 d 1 6135 e 1 8268 a 1 1730 c 1 7246 d 1 1730 c 1 8268 e 1 6135 b 1 6135 a 1 8268 c 1 8268 e 1 7246 a 1 7564 d 1 8268 e 1 6135 d 1 2067 b 1 4008 a 1 7564 c 1 1962 a 1 6135 c 1 196...
output:
28603266 28603266 28603266 28603266 28603266 28603266 28603266 30740544 30740544 30740544 30740544 30740544 30740544 49562724 49562724 49562724 49562724 49562724 83498610 83498610 83498610 83498610 117434496 132017531 132017531 165953417 165953417 165953417 165953417 165953417 165953417 165953417 16...
result:
ok 100000 numbers
Test #7:
score: 10
Accepted
time: 83ms
memory: 94748kb
input:
100000 1 6850 f 1 2649 g 1 3685 i 1 3685 x 1 7360 y 1 2752 q 1 6850 g 1 2649 k 1 6850 g 1 2649 i 1 8846 e 1 2649 d 1 6850 n 1 3685 h 1 2752 n 1 1911 m 1 2752 q 1 2752 c 1 3685 m 1 3685 z 1 8846 y 1 2649 f 1 8846 w 1 604 a 1 1911 g 1 2752 r 1 604 h 1 7360 p 1 8846 o 1 2649 m 1 3685 q 1 3685 d 1 2649 ...
output:
23457825 23457825 23457825 23457825 23457825 23457825 23457825 23457825 23457825 23457825 23457825 23457825 23457825 23457825 23457825 23457825 23457825 23457825 23457825 23457825 23457825 26967750 26967750 26967750 26967750 26967750 26967750 26967750 26967750 26967750 26967750 26967750 26967750 269...
result:
ok 100000 numbers
Test #8:
score: 10
Accepted
time: 74ms
memory: 91516kb
input:
100000 1 1420 w 1 7901 g 1 4938 t 1 7901 m 1 4092 k 1 3443 g 1 6147 o 1 1420 d 1 3443 p 1 2296 m 1 7901 n 1 3443 l 1 1420 b 1 3443 a 1 6147 j 1 6570 c 1 7901 n 1 4092 e 1 4092 h 1 1420 w 1 6570 t 1 4092 x 1 3443 w 1 6570 p 1 4938 i 1 6570 p 1 6570 m 1 2296 h 1 7901 e 1 2296 i 1 1420 s 1 1420 l 1 493...
output:
1007490 1007490 1007490 1007490 1007490 1007490 1007490 1007490 1007490 1007490 1007490 1007490 1007490 1007490 1007490 1007490 1007490 1007490 1007490 2016400 2016400 2016400 5897970 5897970 5897970 5897970 5897970 5897970 5897970 5897970 5897970 5897970 5897970 5897970 5897970 5897970 5897970 5897...
result:
ok 100000 numbers
Test #9:
score: 10
Accepted
time: 39ms
memory: 57936kb
input:
100000 1 1145 f 1 6117 p 1 6262 h 1 6136 o 1 1145 d 1 1668 r 1 4942 e 1 1145 a 1 6262 j 1 6262 t 1 1440 b 1 764 n 1 1145 v 1 764 k 1 3592 i 1 764 p 1 4915 k 1 1440 q 1 1440 g 1 4942 f 1 8963 a 1 9641 t 1 9392 o 2 0 1 1 b 1 1 c 1 1 a 1 1 b 1 1 c 1 1 a 1 1 b 1 1 c 1 1 a 1 1 b 1 1 c 1 1 a 1 1 b 1 1 c 1...
output:
654940 654940 654940 654940 654940 654940 654940 654940 654940 654940 654940 654940 654940 654940 654940 654940 654940 654940 654940 5658590 5658590 5658590 5658590 0 0 0 0 1 3 6 10 15 21 28 36 45 55 66 78 91 105 120 136 153 171 190 210 231 253 276 300 325 351 378 406 435 465 496 528 561 595 630 666...
result:
ok 100000 numbers
Test #10:
score: 10
Accepted
time: 55ms
memory: 57528kb
input:
100000 1 8697 e 1 3699 h 1 2576 x 1 1733 l 1 2576 p 1 3699 g 1 2330 j 1 8697 d 1 3699 e 1 8697 v 1 1733 b 1 2330 o 1 8697 e 1 2004 l 1 6142 t 1 4498 l 1 2843 c 1 2004 i 1 8697 w 1 1463 l 1 1733 a 1 7185 b 1 2576 r 1 6142 c 1 7185 w 1 6142 j 1 2330 i 1 7185 x 1 8697 t 1 2863 k 1 4498 c 1 1733 d 1 146...
output:
37814556 37814556 37814556 37814556 37814556 37814556 37814556 37814556 44657706 44657706 44657706 44657706 82480959 82480959 82480959 82480959 82480959 82480959 82480959 82480959 82480959 82480959 82480959 82480959 82480959 82480959 82480959 82480959 82480959 82480959 82480959 82480959 82480959 824...
result:
ok 100000 numbers