QOJ.ac

QOJ

ID题目提交者结果用时内存语言文件大小提交时间测评时间
#155873#6533. Traveling in Cellshos_lyricAC ✓772ms131776kbC++144.7kb2023-09-02 11:32:562023-09-02 11:32:56

Judging History

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

  • [2023-09-02 11:32:56]
  • 评测
  • 测评结果:AC
  • 用时:772ms
  • 内存:131776kb
  • [2023-09-02 11:32:56]
  • 提交

answer

#include <cassert>
#include <cmath>
#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <functional>
#include <iostream>
#include <limits>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <vector>

using namespace std;

using Int = long long;

template <class T1, class T2> ostream &operator<<(ostream &os, const pair<T1, T2> &a) { return os << "(" << a.first << ", " << a.second << ")"; };
template <class T> ostream &operator<<(ostream &os, const vector<T> &as) { const int sz = as.size(); os << "["; for (int i = 0; i < sz; ++i) { if (i >= 256) { os << ", ..."; break; } if (i > 0) { os << ", "; } os << as[i]; } return os << "]"; }
template <class T> void pv(T a, T b) { for (T i = a; i != b; ++i) cerr << *i << " "; cerr << endl; }
template <class T> bool chmin(T &t, const T &f) { if (t > f) { t = f; return true; } return false; }
template <class T> bool chmax(T &t, const T &f) { if (t < f) { t = f; return true; } return false; }


template <class T> void bAdd(vector<T> &bit, int pos, const T &val) {
  const int bitN = bit.size();
  for (int x = pos; x < bitN; x |= x + 1) bit[x] += val;
}
template <class T> T bSum(const vector<T> &bit, int pos) {
  T ret = 0;
  for (int x = pos; x > 0; x &= x - 1) ret += bit[x - 1];
  return ret;
}
template <class T> T bSum(const vector<T> &bit, int pos0, int pos1) {
  return bSum(bit, pos1) - bSum(bit, pos0);
}


#include <ext/pb_ds/assoc_container.hpp>
using __gnu_pbds::gp_hash_table;


int N, Q;
vector<int> C;
vector<Int> V;

int O, P, K;
vector<int> A;

int n;
vector<int> sz;
vector<gp_hash_table<int, int>> seg;
bool check(int u) {
  int sum = 0;
  for (const int c : A) {
    auto it = seg[u].find(c);
    if (it != seg[u].end()) {
      sum += it->second;
    }
  }
// cerr<<"    check "<<u<<": "<<sum<<" "<<sz[u]<<"; ";pv(seg[u].begin(),seg[u].end());
  return (sum < sz[u]);
}

// int findRight(int a, F f, Args &&... args) {
int findRight(int a) {
  assert(0 <= a); assert(a <= n);
  // if ((T().*f)(args...)) return a;
  if (a == n) return n + 1;
  a += n;
  for (; ; a >>= 1) if (a & 1) {
    // if ((ts[a].*f)(args...)) {
    if (check(a)) {
      for (; a < n; ) {
        // if (!(ts[a <<= 1].*f)(args...)) ++a;
        if (!check(a <<= 1)) ++a;
      }
      return a - n + 1;
    }
    ++a;
    if (!(a & (a - 1))) return n + 1;
  }
}
// int findLeft(int b, F f, Args &&... args) {
int findLeft(int b) {
  assert(0 <= b); assert(b <= n);
  // if ((T().*f)(args...)) return b;
  if (b == 0) return -1;
  b += n;
  for (; ; b >>= 1) if ((b & 1) || b == 2) {
    // if ((ts[b - 1].*f)(args...)) {
    if (check(b - 1)) {
      for (; b <= n; ) {
        // if (!(ts[(b <<= 1) - 1].*f)(args...)) --b;
        if (!check((b <<= 1) - 1)) --b;
      }
      return b - n - 1;
    }
    --b;
    if (!(b & (b - 1))) return -1;
  }
}


int main() {
  for (int numCases; ~scanf("%d", &numCases); ) { for (int caseId = 1; caseId <= numCases; ++caseId) {
    scanf("%d%d", &N, &Q);
    C.resize(N); for (int i = 0; i < N; ++i) scanf("%d", &C[i]);
    V.resize(N); for (int i = 0; i < N; ++i) scanf("%lld", &V[i]);
    
    auto bit = V;
    for (int i = 0; i < N; ++i) if ((i | (i + 1)) < N) {
      bit[i | (i + 1)] += bit[i];
    }
    
    for (n = 1; n < N; n <<= 1) {}
    sz.assign(n << 1, 0);
    for (int i = 0; i < N; ++i) {
      sz[n + i] = 1;
    }
    for (int u = n; --u; ) {
      sz[u] = sz[u << 1] + sz[u << 1 | 1];
    }
    seg.assign(n << 1, {});
    for (int i = 0; i < N; ++i) {
      for (int u = n + i; u; u >>= 1) {
        ++seg[u][C[i]];
      }
    }
    
    for (; Q--; ) {
      scanf("%d%d%d", &O, &P, &K);
      --P;
      if (O == 1) {
        for (int u = n + P; u; u >>= 1) {
          --seg[u][C[P]];
          ++seg[u][K];
        }
        C[P] = K;
      } else if (O == 2) {
        bAdd(bit, P, K - V[P]);
        V[P] = K;
      } else if (O == 3) {
        A.resize(K);
        for (int k = 0; k < K; ++k) {
          scanf("%d", &A[k]);
        }
// cerr<<"C = "<<C<<", V = "<<V<<", P = "<<P<<", A = "<<A<<endl;
        int l = findLeft(P) + 1;
        int r = findRight(P + 1) - 1;
        chmax(l, 0);
        chmin(r, N);
// cerr<<"  l = "<<l<<", r = "<<r<<endl;
        const Int ans = bSum(bit, l, r);
        printf("%lld\n", ans);
      } else {
        assert(false);
      }
    }
  }
#ifndef LOCAL
  break;
#endif
  }
  return 0;
}

詳細信息

Test #1:

score: 100
Accepted
time: 1ms
memory: 3776kb

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: 214ms
memory: 4132kb

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: 252ms
memory: 4012kb

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: 0
Accepted
time: 349ms
memory: 19852kb

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:

ok 200135 numbers

Test #5:

score: 0
Accepted
time: 446ms
memory: 64988kb

input:

3
100000 100000
6 6 2 6 5 3 6 5 4 6 4 6 6 6 6 5 2 5 2 6 6 6 1 6 5 6 4 5 6 6 5 4 5 4 3 4 5 5 6 6 5 6 6 5 2 5 6 5 4 2 5 6 6 6 5 2 5 6 6 4 5 6 3 3 6 5 6 5 5 5 5 4 4 4 4 3 6 5 4 5 6 5 6 6 6 6 3 6 5 6 5 4 3 5 6 4 5 3 6 5 3 5 6 4 6 5 4 5 5 5 2 5 4 6 6 3 5 5 5 5 5 4 5 5 6 5 5 6 6 6 5 5 4 6 5 4 4 2 6 6 6 5 ...

output:

753014823
938372065
5655899645
168297301
14372254310
1066586326
3520855082
2591792266
2321844837
64378192092
250581310
1845085639
1402247975
198007248
2157074263
2743531397
3433471688
10332600792
1085086491
4845484125
50019185900042
4036199358
154762798
50019185900042
1221387905
11240790307
10537215...

result:

ok 199749 numbers

Test #6:

score: 0
Accepted
time: 523ms
memory: 94892kb

input:

3
100000 100000
173 276 418 362 183 321 401 316 193 426 212 126 206 409 382 443 405 412 259 233 356 355 340 41 354 447 421 464 436 436 329 239 427 415 452 424 174 294 220 413 293 456 140 304 438 462 418 345 160 296 443 234 455 452 396 347 438 413 235 416 363 186 340 285 340 457 392 359 451 310 431 1...

output:

832547880
1825993219
676042867
310750190
650714631
657481975
1279322
838513014
453432678
940357183
846050641
631145680
278723792
689448062
154699248
45678908
56518237
839298643
611124630
499104412
324172054
742064269
626600147
728123335
602272914
45485542
868574266
876207167
342300121
917221167
7055...

result:

ok 200119 numbers

Test #7:

score: 0
Accepted
time: 673ms
memory: 131776kb

input:

3
100000 100000
66046 49249 42478 61684 59308 38366 66208 38769 50465 63701 50193 47811 50312 56793 58616 63383 58390 17546 23446 57532 59030 63009 62771 46338 52747 54677 68893 58360 56617 42330 65075 51193 65417 67035 54247 54323 39404 61892 42821 30094 67958 46206 53273 28507 65864 42364 64063 46...

output:

787181803
340358691
794440759
970166774
501256821
822531703
505349238
299646179
317091968
718901636
589846615
490283989
1183290
98835675
715091970
941598117
81757251
249078591
559980949
587721512
408541247
542135558
217103011
916103998
422219165
786665928
215595722
309683697
275650079
660176857
9707...

result:

ok 199750 numbers

Test #8:

score: 0
Accepted
time: 604ms
memory: 129328kb

input:

3
100000 100000
2 2 3 1 1 3 1 3 1 1 1 1 1 3 3 2 3 1 1 3 3 3 2 1 2 3 2 3 1 1 2 2 2 3 1 1 3 3 3 3 1 3 1 1 3 2 3 1 1 2 3 3 2 1 3 1 1 1 2 3 3 2 3 3 1 1 2 2 2 1 1 3 1 1 2 2 1 3 3 3 2 1 1 2 1 2 3 3 3 2 2 3 3 2 3 2 1 3 3 3 2 2 3 1 3 2 3 2 3 1 2 2 1 2 1 3 3 3 2 2 3 1 3 2 1 1 1 2 1 2 2 1 3 1 2 1 1 3 3 2 3 3 ...

output:

50035938417434
50036115992265
50036315519498
3975347985
50036470174447
50036191297549
7222739016
50036248757817
1886106914
50037215621946
50037215621946
50037215621946
50037789462602
50037789462602
50038171558883
50038171558883
50038171558883
50037356071541
50037356071541
840665598
50037454922987
19...

result:

ok 144306 numbers

Test #9:

score: 0
Accepted
time: 772ms
memory: 115272kb

input:

3
100000 100000
60522 14575 36426 79445 48772 90081 33447 90629 3497 47202 7775 94325 63982 4784 68417 2156 31932 35902 95728 78537 23857 30739 86918 29211 39679 38506 63340 86568 61868 60016 87940 96263 24593 1449 36991 90310 23355 77068 11431 8580 91757 49218 74934 94328 63676 29355 96221 99080 95...

output:

49028798194951
49028798194951
49028798194951
445374817
49028798194951
49028798194951
49028798194951
49028798194951
49029113499144
49029113499144
49029113499144
568084096
49029252709603
49029252709603
49029252709603
49029252709603
49029252709603
49029252709603
49029252709603
142834402
644706458
49029...

result:

ok 151536 numbers

Test #10:

score: 0
Accepted
time: 243ms
memory: 61584kb

input:

3
100000 100000
2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 3 1 2 ...

output:

50042766706436
50042766706436
50042766706436
50042766706436
50042766706436
50042766706436
50042766706436
50042766706436
50042766706436
50042766706436
50042766706436
50042766706436
50042766706436
50042766706436
50042766706436
50042766706436
50042766706436
50042766706436
50042766706436
50042766706436
...

result:

ok 300000 numbers