QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#79992#5402. 术树数DCH2333 786ms10568kbC++143.7kb2023-02-21 16:25:512023-02-21 16:25:54

Judging History

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

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-02-21 16:25:54]
  • 评测
  • 测评结果:3
  • 用时:786ms
  • 内存:10568kb
  • [2023-02-21 16:25:51]
  • 提交

answer

#include <cstdio>
#include <algorithm>

using namespace std;

namespace IO {
  #define isdigit(x) (x >= '0' && x <= '9')
  template<typename T>
  inline void read(T &x) {
    x = 0; char ch = getchar(); int f = 0;
    for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = 1;
    for(; isdigit(ch); ch = getchar()) x = x * 10 + ch - '0';
    if(f) x = -x;
  }
  template<typename T>
  inline void write(T x) {
    if(x < 0) putchar('-'), x = -x;
    if(x > 9) write(x / 10);
    putchar(x % 10 + '0');
  }
  #undef isdigit
}
using namespace IO;

const int N = 2e5 + 10;
const int M = 25;
int Q, k, m;

int bit[M];
inline int get(int x, int p) {
  return x / bit[p] % k;
}

inline int add(int x, int y) {
  int z = 0;
  for(int i = 0; i < m; ++i) {
    int u = get(x, i), v = get(y, i);
    if((u += v) >= k) u -= k;
    z += u * bit[i];
  }
  return z;
}

inline int red(int x, int y) {
  int z = 0;
  for(int i = 0; i < m; ++i) {
    int u = get(x, i), v = get(y, i);
    if((u -= v) < 0) u += k;
    z += u * bit[i];
  }
  return z;
}

inline int mul(int x, int y) {
  y %= k;
  if(y < 0) y += k;
  int z = 0;
  for(int i = 0; i < m; ++i) {
    int u = get(x, i);
    u = u * y % k;
    z += u * bit[i];
  }
  return z;
}

inline void out(int x) {
  for(int i = m - 1; ~i; --i)
    printf("%d",get(x,i));
  puts("");
}

void exgcd(int a, int b, int &x, int &y) {
  if(b == 0) x = 1, y = 0;
  else exgcd(b, a % b, y, x), y -= a / b * x;
}

inline int kgcd(int x, int y, int p) {
  int u = get(x, p), v = get(y, p);
  if(v == 0) return x;
  else return kgcd(y, red(x, mul(y, u / v)), p);
}

struct LinearBase {
  int a[M];
  inline void insert(int x) {
    // printf("insert %d\n",x);
    // out(x);
    for(int i = m - 1; ~i; --i) {
      int u = get(x, i);
      if(u) {
        if(!a[i]) {
          int t1 = 0, t2 = 0;
          exgcd(u, k, t1, t2);
          a[i] = mul(x, t1); 
          x = mul(x, k / __gcd(k, u));
        }
        else {
          if(u % get(a[i], i)) a[i] = kgcd(a[i], x, i);
          x = red(x, mul(a[i], u / get(a[i], i)));
        }
      }
      // printf("base %d %d\n",i,a[i]);
      // out(a[i]);
    }
  }
  inline int query(int x) {
    // printf("query %d\n",x);
    // out(x);
    for(int i = m - 1; ~i; --i) {
      int u = get(x, i);
      if(u && a[i]) {
        int v = get(a[i], i);
        x = red(x, mul(a[i], u / v));
      }
      // printf("base %d %d %d\n",i,a[i],x);
      // out(a[i]);
      // out(x);
    }
    return x;
  }
}base;

void init() {
  bit[0] = 1;
  for(int i = 1; i <= m - 1; ++i)
    bit[i] = bit[i - 1] * k;
}

int dep[N], w[N];
int fa[N][18];

inline int lca(int x, int y) {
  if(dep[x] < dep[y]) swap(x, y);
  for(int i = 17; ~i; --i)
    if(dep[fa[x][i]] >= dep[y])
      x = fa[x][i];
  if(x == y) return x;
  for(int i = 17; ~i; --i)
    if(fa[x][i] ^ fa[y][i])
      x = fa[x][i], y = fa[y][i];
  return fa[x][0];
}

int main() {
  read(Q), read(k), read(m);
  init();
  int tot = 1;
  for(int i = 1, op, x, y, v; i <= Q; ++i) {
    read(op);
    if(op == 1) {
      read(x), read(v);
      fa[++tot][0] = x;
      for(int i = 1; i <= 17; ++i)
        fa[tot][i] = fa[fa[tot][i - 1]][i - 1];
      dep[tot] = dep[x] + 1;
      w[tot] = add(w[x], v);
      base.insert(mul(v, 2));
    } 
    else if(op == 2) {
      read(x), read(y), read(v);
      int z = lca(x, y);
      int len = red(add(w[x], w[y]), mul(w[z], 2));
      len = add(len, v);
      base.insert(len);
    } 
    else {
      read(x), read(y);
      int z = lca(x, y);
      int len = red(add(w[x], w[y]), w[z]);
      printf("%d\n",base.query(len));
    }
  }
  return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Subtask #1:

score: 0
Wrong Answer

Test #1:

score: 2
Accepted
time: 1ms
memory: 1692kb

input:

30 7 3
1 1 301
1 1 236
1 2 278
3 2 4
3 2 4
2 1 4 265
1 1 242
1 4 278
1 6 337
3 2 3
2 5 7 304
2 5 6 34
1 4 178
3 6 7
3 5 7
3 1 4
1 1 178
3 3 4
3 1 6
3 3 4
2 6 7 131
1 1 213
3 1 3
2 3 10 11
3 4 6
2 5 9 169
1 6 9
2 5 10 29
1 9 111
3 9 11

output:

0
0
0
0
0
0
0
0
0
0
0
0

result:

ok 12 lines

Test #2:

score: 0
Accepted
time: 1ms
memory: 1728kb

input:

30 9 3
1 1 694
1 2 251
1 2 623
2 2 4 109
3 3 4
3 1 2
2 2 4 611
1 4 595
2 2 5 477
2 2 5 363
3 1 3
2 1 5 121
1 2 225
2 1 5 214
2 3 6 706
3 3 4
2 2 3 122
2 2 3 621
3 2 3
3 2 4
2 1 5 630
1 5 598
3 4 5
3 1 3
1 2 665
2 1 2 331
2 1 6 449
1 2 387
3 3 6
3 4 6

output:

0
0
0
0
0
0
0
0
0
0

result:

ok 10 lines

Test #3:

score: -2
Wrong Answer
time: 0ms
memory: 1736kb

input:

30 4 5
1 1 854
1 1 467
1 2 708
2 2 4 529
1 4 115
1 4 444
2 3 4 108
2 2 5 724
2 1 3 375
1 5 827
2 5 6 974
1 3 73
3 2 3
2 2 3 140
3 5 6
2 6 8 787
3 1 5
1 5 971
3 4 6
2 4 5 816
3 7 8
3 2 4
1 6 855
2 5 10 39
2 6 9 280
2 6 10 662
3 7 10
1 6 412
3 4 7
1 6 276

output:

0
0
256
0
0
0
0
0

result:

wrong answer 2nd lines differ - expected: '256', found: '0'

Subtask #2:

score: 0
Skipped

Dependency #1:

0%

Subtask #3:

score: 0
Wrong Answer

Test #21:

score: 11
Accepted
time: 786ms
memory: 9812kb

input:

198517 3 16
1 1 40710744
1 2 21885097
1 1 23592366
1 4 7387074
1 5 16074177
1 1 41027400
1 4 18082971
1 2 12822448
1 1 2286557
1 1 27896295
1 11 14532760
1 8 2357296
1 11 9190559
1 6 40503152
3 4 11
3 1 7
3 3 7
3 8 14
3 12 15
3 2 3
1 10 34606866
1 13 42718465
1 16 30353561
3 5 11
3 2 6
3 16 18
1 3 2...

output:

0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
...

result:

ok 99662 lines

Test #22:

score: -11
Wrong Answer
time: 334ms
memory: 10568kb

input:

198073 8 8
1 1 4007183
1 1 411647
1 1 3301064
1 1 2747675
1 3 11141272
1 3 4308435
1 4 15582931
1 5 11340890
1 2 9172283
1 9 542280
1 10 12209796
1 3 2829956
3 1 3
1 3 724504
3 2 14
3 3 14
3 9 12
3 7 10
1 1 3594204
1 14 13600647
1 15 4589767
3 10 14
1 4 10564184
1 13 1781174
1 19 6067505
1 9 6735060...

output:

262729
2097224
262209
4673
2097672
2134081
2101769
2134080
0
2130432
584
2129992
2097737
2134024
2101824
2363904
295424
2359880
4608
2359369
295489
299593
1
2134017
2359305
262664
2130497
2101256
4161
294976
37440
2359361
299080
2363977
299592
33344
2392576
2359816
2359873
8
2359880
262657
0
2363464...

result:

wrong answer 3rd lines differ - expected: '520', found: '262209'

Subtask #4:

score: 0
Wrong Answer

Test #26:

score: 0
Wrong Answer
time: 73ms
memory: 8364kb

input:

198891 26426880 1
1 1 0
2 1 2 0
3 1 2
1 1 0
3 2 3
3 1 2
1 2 0
1 2 0
1 3 0
1 6 0
2 1 6 0
2 3 6 0
3 2 3
1 2 13213440
1 2 13213440
1 4 13213440
3 4 10
1 1 13213440
2 3 4 0
2 3 8 13213440
1 1 0
1 12 0
1 13 0
1 3 0
3 2 11
3 2 12
2 11 14 13213440
1 6 0
2 12 14 0
2 1 2 0
1 10 0
1 12 0
2 3 13 0
3 12 14
3 1 ...

output:

0
0
0
0
13213440
13213440
0
0
0
13213440
0
0
13213440
0
13213440
0
13213440
0
13213440
13213440
13213440
13213440
13213440
0
13213440
13213440
0
13213440
13213440
0
0
0
13213440
0
13213440
0
13213440
0
0
0
13213440
13213440
0
13213440
13213440
13213440
13213440
0
13213440
13213440
13213440
13213440
...

result:

wrong answer 124th lines differ - expected: '13213440', found: '0'

Subtask #5:

score: 0
Wrong Answer

Test #30:

score: 0
Wrong Answer
time: 660ms
memory: 8136kb

input:

199458 2 25
1 1 31252443
2 1 2 22827339
1 2 13517756
1 2 5635412
1 3 33397078
1 3 33542998
2 3 5 1484991
3 5 6
2 1 3 7938846
2 1 2 3665458
1 3 29150948
3 4 5
1 3 733545
1 7 4698781
1 7 21699192
1 6 10854390
3 3 8
3 4 8
1 2 6889338
2 1 12 27646676
2 6 8 24407215
1 11 20847453
3 4 13
1 6 16891344
3 4 ...

output:

8087838
3831541
7475831
2617123
4753847
2617123
880278
7310241
2365789
576472
2510049
996799
2265091
520599
82781
2578748
704237
1019189
974743
974743
1039056
87144
2782450
2782450
124168
971451
200352
319195
2200580
3052451
695111
646007
2258220
2344690
2098167
98904
2873648
605003
173897
2739062
2...

result:

wrong answer 1st lines differ - expected: '150016', found: '8087838'

Subtask #6:

score: 3
Accepted

Test #33:

score: 3
Accepted
time: 22ms
memory: 2764kb

input:

49958 1023 2
1 1 122428
1 1 917186
2 2 3 53148
1 3 876461
2 1 3 968146
2 2 4 569341
2 3 4 199413
2 1 4 238371
1 3 127427
1 2 887225
2 1 4 776059
2 4 6 155479
2 1 6 795533
1 5 159578
3 5 6
2 2 5 758778
2 5 6 601115
3 4 7
1 4 202224
2 5 6 902346
3 1 6
3 5 7
3 3 5
1 2 791251
1 5 502214
2 6 7 929048
1 6...

output:

0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
...

result:

ok 16607 lines

Test #34:

score: 0
Accepted
time: 408ms
memory: 8628kb

input:

198392 7 9
1 1 23598910
3 1 2
1 1 25616681
2 1 2 22101090
2 2 3 25455751
3 1 2
3 1 2
1 3 25668120
3 1 3
1 3 23878180
1 4 10885281
1 1 5873751
2 2 7 31608236
3 2 3
3 3 5
2 2 6 37313936
2 1 6 36853293
2 4 7 6773989
2 1 7 19143946
3 2 7
3 3 7
3 1 2
1 1 31756932
3 3 6
2 5 8 39585364
1 2 27162269
3 4 5
2...

output:

0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
...

result:

ok 65758 lines

Subtask #7:

score: 0
Skipped

Dependency #1:

0%