QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#88955#2677. JOJORainAir100 ✓83ms94748kbC++235.9kb2023-03-18 02:57:102023-03-18 02:57:12

Judging History

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

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-03-18 02:57:12]
  • 评测
  • 测评结果:100
  • 用时:83ms
  • 内存:94748kb
  • [2023-03-18 02:57:10]
  • 提交

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