QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#141402#6533. Traveling in Cellscy1999TL 2124ms26488kbC++205.8kb2023-08-17 11:38:352023-08-17 11:38:38

Judging History

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

  • [2023-08-17 11:38:38]
  • 评测
  • 测评结果:TL
  • 用时:2124ms
  • 内存:26488kb
  • [2023-08-17 11:38:35]
  • 提交

answer

#include <bits/stdc++.h>

using namespace std ;

typedef long long ll ;
const int N = 100010 ;
int n , q , T  , k;
int c[N] , v[N] , a[N] ;
bool tag ;

struct SGTt {
    #define ls p*2
    #define rs p*2+1
    struct tree {
        map<int , int> cnt ;
        ll sum ;
    } t[N * 4] ;
    set<int> merge(set<int> x , set<int> y ) {
        if(x.size() > y.size()) {
            auto it = y.begin() ; for( ; it != y.end() ; it ++ ) {
                x.insert(*it) ;
            }
            return x ;
        } else {
            auto it = x.begin() ;
            for( ; it != x.end() ; it ++) {
                y.insert(*it) ;
            }
            return y ;
        }
    }
    void pushup(tree &p , tree x , tree y) {
        if(x.cnt.size() > y.cnt.size()) {
            p = x ;
            auto it = y.cnt.begin() ; for( ; it != y.cnt.end() ; it ++ ) {
                p.cnt[it->first] += it->second ;
            }
        } else {
            p = y ;
            auto it = x.cnt.begin() ;
            for( ; it != x.cnt.end() ; it ++) {
                p.cnt[it->first] += it->second ;
            }
        }
        p.sum = x.sum + y.sum ;
    }
    void build(int p , int l , int r) {
        t[p].cnt.clear() ;
        if(l == r) {
            t[p].cnt[c[l]] = 1 ;
            t[p].sum = v[l] ;
            return ; 
        }
        int mid = (l + r) >> 1 ;
        build(ls , l , mid) ; build(rs , mid + 1 , r) ;
        pushup(t[p] , t[ls] , t[rs]) ;
    }
    tree query(int p , int l , int r , int ql , int qr){
        tree res ;
        if(tag) return res ;
        if(ql <= l && r <= qr) {
            return t[p] ;
        }
        int mid = (l + r) >> 1 ;
        if(ql > mid) {
            tree res1 = query(rs , mid + 1 , r , ql , qr) ;
            if(res1.cnt.size() > k) return tag = 1 , res ;
            return res1 ;
        }
        if(qr <= mid) {
            tree res1 = query(ls , l , mid , ql , qr) ;
            if(res1.cnt.size() > k) return tag = 1 , res ;
            return res1 ;
        }
        tree res1 = query(ls , l , mid , ql , qr) , res2 = query(rs , mid + 1 , r , ql , qr) ;
        pushup(res , res1 , res2) ;
        if(res.cnt.size() > k) {
            tag = 1 ;
        }
        return res ;
    }
    void ERASE(tree &p , int cx) {
        p.cnt[cx] -- ;
        if(p.cnt[cx] <= 0) {
            p.cnt.erase(cx) ;
        }
    }
    void del(int p , int l , int r , int x) {
        ERASE(t[p] , c[x]) ;
        if(l == r) {
            return ;
        }
        int mid = (l + r) >> 1 ;
        if(x <= mid) {
            del(ls , l , mid , x) ;
        } else {
            del(rs , mid + 1 , r , x) ;
        }
    }
    void ADD(tree &p , int cx) {
        p.cnt[cx] ++ ;
    }
    void add(int p , int l , int r , int x) {
        ADD(t[p] , c[x]) ;
        if(l == r) return ;
        int mid = (l + r) >> 1 ;
        if(x <= mid) add(ls , l , mid , x) ;
        else add(rs , mid + 1 , r , x) ;
    }
    void change(int p , int l , int r , int x) {
        if(l == r) {
            t[p].sum = v[x] ;
            return ; 
        }
        int mid = (l + r) >> 1;
        if(x <= mid) change(ls , l , mid , x) ;
        else change(rs , mid + 1 , r , x ) ;
        t[p].sum = t[ls].sum + t[rs].sum ;
    }
    ll ask(int p , int l , int r , int ql , int qr) {
        if(ql <= l && r <= qr) {
            return t[p].sum ;
        }
        ll res = 0 ; int mid = (l + r) >> 1 ;
        if(ql <= mid) res += ask(ls , l , mid , ql , qr);
        if(qr > mid) res += ask(rs , mid + 1 , r , ql , qr) ;
        return res ;
    }
    tree res ;
} seg ;

bool check(map<int , int> x , map<int , int> y) {
    auto it = x.begin() ;
    for( ; it != x.end() ; it ++) {
        if(it->second <= 0) continue ;
        if(y.find(it->first) == y.end()) return 0 ;
    }
    return 1 ;
}

int main() {
    // freopen("data.in" , "r" , stdin) ;
    // freopen("mine.out" , "w" , stdout) ;
    cin >> T ;
    while(T --) {
        scanf("%d%d" , &n , &q) ;
        for(int i = 1 ; i <= n ; i ++) scanf("%d" , &c[i]) ;
        for(int i = 1 ; i <= n ; i ++) scanf("%d" , &v[i]) ;
        seg.build(1 , 1 , n) ; 
        while(q --) {
            int opt ; scanf("%d" , &opt) ;
            if(opt == 1) {
                int p , x ; scanf("%d%d" , &p , &x) ;
                seg.del(1 , 1 , n , p) ; 
                c[p] = x ; seg.add(1 , 1 , n , p) ;
            }  else if(opt == 2) {
                int p , x ; scanf("%d%d" , &p , &x) ;
                v[p] = x ; seg.change(1 , 1 , n , p) ; 
            } else {
                int x ;  scanf("%d%d" , &x , &k) ;
                map<int , int> sa ;
                for(int i = 1 ; i <= k ; i ++) {
                    scanf("%d" , &a[i]) ;
                    sa[a[i]] ++ ;
                }
                int posl , posr ;
                int l = x , r = n ;
                while(l < r) {
                    int mid = (l + r + 1) >> 1 ;
                    tag = 0 ; seg.res = seg.query(1 , 1 , n , x , mid) ;
                    if(tag == 0 && check(seg.res.cnt , sa)) l = mid ; 
                    else r = mid - 1 ;
                }
                posr = l ;
                r = x , l = 1 ;
                while(l < r) {
                    int mid = (l + r) >> 1;
                    tag = 0 ; seg.res = seg.query(1 , 1 , n , mid , x) ;
                    if(tag == 0 && check(seg.res.cnt , sa)) r = mid ; 
                    else l = mid + 1 ;
                }
                posl = l ;
                ll ans = seg.ask(1 , 1 , n , posl , posr) ;
                printf("%lld\n" , ans) ;
            }
        }
    }
}

/*
1
10 3
6 3 6 1 1 6 1 1 9 5 
13110 1530 2229 4123 2326 30416 20749 4039 1078 2630 
1 6 1
1 10 5
3 9 4 9 3 1 4 
*/

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 2ms
memory: 25604kb

input:

2
5 10
1 2 3 1 2
1 10 100 1000 10000
3 3 1 3
3 3 2 2 3
2 5 20000
2 3 200
3 3 2 1 3
3 3 3 1 2 3
1 3 4
2 1 100000
1 2 2
3 1 2 1 2
4 1
1 2 3 4
1000000 1000000 1000000 1000000
3 4 4 1 2 3 4

output:

100
110
1200
21211
100010
4000000

result:

ok 6 numbers

Test #2:

score: 0
Accepted
time: 764ms
memory: 26488kb

input:

20000
15 15
1 1 3 3 2 3 3 3 3 3 2 3 2 3 3
634593973 158136379 707704004 998369647 831633445 263092797 937841412 451774682 552617416 483763379 50360475 794662797 74247465 537217773 901809831
3 6 4 1 3 5 10
3 5 7 1 2 3 4 5 9 10
3 4 3 3 8 9
2 13 608033129
3 15 2 3 5
1 9 3
3 8 4 1 3 7 10
2 6 727472865
3...

output:

2689089686
8377825475
1706073651
1439027604
2689089686
792730352
8904867081
8904867081
8270273108
831633445
692051585
2782432626
697783016
883944422
184057757
287523250
184057757
696388752
184057757
1675459344
2667693025
2614711258
4006992373
1767091974
5348541057
5348541057
390631780
2290216252
942...

result:

ok 200062 numbers

Test #3:

score: 0
Accepted
time: 2124ms
memory: 25636kb

input:

2000
150 150
8 3 8 8 8 6 8 4 2 7 6 8 8 5 8 7 7 8 5 6 8 8 6 8 8 8 8 7 8 6 6 8 8 8 6 2 3 4 8 8 7 8 5 8 2 6 8 7 8 8 6 8 6 8 3 8 8 8 8 4 7 8 7 3 7 6 7 5 5 8 6 8 8 6 3 8 6 7 6 8 8 7 4 8 6 7 8 7 7 7 7 8 8 8 8 2 5 2 8 8 6 7 6 3 8 8 7 8 8 8 6 6 8 6 6 7 5 8 8 8 7 8 7 7 6 8 8 8 8 8 8 6 5 7 5 5 8 7 8 7 7 7 6 5...

output:

4449391171
3290849667
852793841
5178673994
995994209
11431868919
4327723427
5071541023
3032743466
962345334
2997656427
4534278452
3851900075
3611231417
5071541023
1477584218
1299005818
1299005818
2145605244
854143763
886347565
2081234124
2333808475
2455955801
4179722063
2328504333
1473735464
4107685...

result:

ok 199987 numbers

Test #4:

score: -100
Time Limit Exceeded

input:

10
30000 30000
3 4 2 4 4 4 4 3 4 3 4 3 4 3 4 4 2 4 4 4 4 4 3 3 3 4 3 4 3 4 3 3 4 2 4 3 3 3 3 4 3 4 4 4 4 2 3 3 4 2 3 4 4 4 4 1 4 4 4 4 4 4 4 4 3 3 3 4 4 4 4 4 2 3 4 4 4 4 3 4 4 3 3 3 4 4 3 4 4 2 3 4 4 4 4 3 2 4 3 4 3 2 4 4 3 4 2 2 4 4 4 4 2 4 3 2 4 4 3 4 4 4 2 4 4 3 2 3 2 3 3 3 4 2 4 3 4 1 4 3 4 4 4...

output:

6959437173
934970676
72461245502
8365928740
8384151048
984567228
12482909122
1904927816
15134139942
3759040688
92670874909
332468911
5936663371
3562978848
1300592004
10314009201
5581540905
131246926443
15087184135864
4077066271
1124704817
1520626740
4388174158
744377942
2770411457
6231852240
1508724...

result: