QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#655284#2550. Lion and ZebravaleriuTL 1ms3812kbC++204.2kb2024-10-19 02:25:362024-10-19 02:25:36

Judging History

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

  • [2024-10-19 02:25:36]
  • 评测
  • 测评结果:TL
  • 用时:1ms
  • 内存:3812kb
  • [2024-10-19 02:25:36]
  • 提交

answer

#include <bits/stdc++.h>
#define all(x) (x).begin(),(x).end()
using namespace std;

using ll = long long;
using ld = long double;

//#define int ll
#define sz(x) ((int)(x).size())

using pii = pair<int,int>;
using tii = tuple<int,int,int>;

struct Diam {
   int x, y, D, xdist;
   Diam operator + (const Diam& a) const {
      if(a.D > D) return a;
      return *this;
   }
};
const int nmax = 1e5 + 5;

vector<int> g[nmax];

Diam diam(int node, int f) {
   Diam curr = Diam{node, node, 0, 0};
   for(auto &x : g[node]) {
      if(x == f) continue;
      auto R = diam(x, node);
      R.xdist++;
      Diam U = Diam{R.x, curr.x, curr.xdist + R.xdist, R.xdist};
      Diam V = Diam{curr.x, R.x, curr.xdist + R.xdist, curr.xdist};
      if(R.xdist < curr.xdist) U = V;
      curr = R + curr + U;
   }
   return curr;
}

int occ[nmax];

void mkdist(int node, int f, int D, vector<int> &height, vector<int>& dist) {
   dist[node] = D;
   height[node] = 0;
   for(auto x : g[node]) {
      if(x == f || occ[x]) continue;
      mkdist(x, node, D + 1, height, dist);
      height[node] = max(height[node], height[x] + 1);
   }
   return;
}

int jump[nmax], p[nmax];
void initlca(int node, int f, const vector<int>& d) {
   jump[node] = p[node] = f;
   if(d[jump[jump[f]]] + d[f] == 2 * d[jump[f]]) jump[node] = jump[jump[f]];
   for(auto x : g[node]) {
      if(x == f) continue;
      initlca(x, node, d);
   }
   return;
}

int twoable[nmax];

signed main() {
   cin.tie(0) -> sync_with_stdio(0);
   int n, q;
   cin >> n >> q;
   
   for(int i = 1, x, y; i < n; i++) {
      cin >> x >> y;
      g[x].emplace_back(y);
      g[y].emplace_back(x);
   }
   
   for(int i = 1; i <= n; i++) {
      if(sz(g[i]) == 1) {
         twoable[g[i][0]] = 1;
      }
   }
   
   auto [L, R, a, b] = diam(1, 1);
   //cerr << L << ' ' << R << '\n';
   
   vector<int> Ldist(n + 2), Rdist(n + 2), height(n + 2), tmp(n + 2);
   mkdist(L, L, 0, tmp, Ldist);
   mkdist(R, R, 0, tmp, Rdist);
   initlca(L, L, Ldist);
   
   auto kth = [&](int node, int k) {
      int targ = Ldist[node] - k;
      while(Ldist[node] > targ) {
         if(Ldist[jump[node]] > targ) node = jump[node];
         else node = p[node];
      }
      return node;
   };
   
   
   for(int i = 1; i <= n; i++) {
      if(Ldist[i] + Rdist[i] == Ldist[R]) {
         occ[i] = 1;
      }
   }
   
   
   for(int i = 1; i <= n; i++) {
      if(Ldist[i] + Rdist[i] == Ldist[R]) {
         for(auto x : g[i]) {
            if(Ldist[x] + Rdist[x] != Ldist[x])
               mkdist(x, i, 0, height, tmp);
         }
      }
   }
   
   for(int i = 0, node, d; i < q; i++) {
      cin >> node >> d;
      
      if(d == 1) {
         cout << "1\n";
      }
      else if(d == 2) {
         if(twoable[node])
            cout << 3 << '\n';
         else
            cout << 2 << '\n';
      }
      else {
         if(Ldist[node] > Rdist[node]) swap(Ldist, Rdist), swap(L, R);
         int tchain = (Rdist[node] + Ldist[node] - Ldist[R]) / 2;
         
         //cerr << "pula\n";
         
         if(Ldist[node] < d)
            cout << d + Ldist[node] - 2 * tchain << '\n';
         else {
         //cerr << "pula2\n";
            if(d - tchain * 2 > 2)
               cout << d + Ldist[node] - 2 * tchain << '\n';
            else {
         //cerr << "pula3\n";
               if(d % 2 == 1) {
                  auto T = kth(node, (d - 3) / 2);
                  cout << 3 + (d - 3) / 2 + height[T] << '\n';
               } 
               else {
         //cerr << "pula4\n";
                  auto T = kth(node, (d - 3) / 2), P = kth(node, (d - 2) / 2);
                  if(height[T] + 1 >= height[P]) {
                     cout << 4 + (d - 4) / 2 + height[T] << '\n';
                  }
                  else if (height[P] + (d - 2) / 2 < d){
                     cout << 2 + (d - 2) / 2 + height[P] << '\n';
                  }
                  else {
                     cout << 4 + (d - 4) / 2 + height[T] << '\n';
                  }
               }
            }
         }
         
      }
   }
   
   
}

/**
      Ovaj podrum ima hladan sjaj\Iako je to bolje od gomile drugih
--
*/ 

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3668kb

input:

5 2
1 2
2 3
3 4
4 5
1 4
3 1

output:

4
1

result:

ok 2 number(s): "4 1"

Test #2:

score: 0
Accepted
time: 0ms
memory: 3488kb

input:

11 2
1 2
2 3
1 4
4 5
1 6
6 7
7 8
1 9
9 10
10 11
3 2
10 4

output:

2
5

result:

ok 2 number(s): "2 5"

Test #3:

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

input:

7 2
1 2
2 3
3 4
4 5
4 6
6 7
5 4
5 3

output:

5
3

result:

ok 2 number(s): "5 3"

Test #4:

score: 0
Accepted
time: 0ms
memory: 3548kb

input:

11 9
1 2
2 3
1 4
4 5
1 6
6 7
7 8
1 9
9 10
10 11
7 2
3 2
3 5
3 4
4 4
1 1
8 1
4 3
5 3

output:

3
2
5
4
5
1
1
4
3

result:

ok 9 numbers

Test #5:

score: -100
Time Limit Exceeded

input:

175 7862
70 167
102 128
3 76
46 42
104 112
53 46
52 99
172 116
48 158
40 138
11 103
26 8
59 147
163 88
71 133
130 134
98 73
115 104
28 166
5 173
148 61
38 45
173 73
96 10
36 58
124 59
94 73
137 136
79 164
21 11
27 161
9 152
37 101
123 131
145 68
111 156
153 51
61 73
4 93
54 157
33 69
47 12
144 115
1...

output:


result: