답안 #103934

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
103934 2019-04-03T10:09:02 Z MrTEK Min-max tree (BOI18_minmaxtree) C++14
0 / 100
235 ms 17260 KB
#include <bits/stdc++.h>

using namespace std;

typedef long long int ll;
typedef pair<int,int> ii;

const int N = 1e5 + 5;
const int LOG = 18;
const int inf = 1e9;

vector <int> ed[N];
int q,x[N],y[N],n,dep[N],dad[N][LOG + 1],st[N],tree[N << 2],sub[N],head[N],tim;

int calc(int cur = 1,int back = 0) {
  dep[cur] = dep[back] + 1;
  dad[cur][0] = back;
  for (int i = 1 ; i <= LOG ; i++)
    dad[cur][i] = dad[dad[cur][i - 1]][i - 1];
  for (auto i : ed[cur])
    if (i != back)
      sub[cur] += calc(i,cur);
  return ++sub[cur];
}

void dfs(int cur = 1,int back = 0,int curhead = 1) {
  head[cur] = curhead;
  st[cur] = ++tim;
  int go = 0;
  for (auto i : ed[cur])
    if (i != back && sub[i] >= sub[go])
      go = i;
  if (go)
    dfs(go,cur,curhead);
  for (auto i : ed[cur])
    if (i != back && i != go)
      dfs(i,cur,i);
}

int get_lca(int x,int y) {
  if (dep[x] < dep[y])
    swap(x,y);
  for (int i = LOG - 1 ; i >= 0 ; i--)
    if (dep[dad[x][i]] >= dep[y])
      x = dad[x][i];
  if (x == y)
    return x;
  for (int i = LOG - 1 ; i >= 0 ; i--)
    if (dad[x][i] != dad[y][i])
      x = dad[x][i],
      y = dad[y][i];
  return dad[x][0];
}

void update(int ind,int l,int r,int lw,int rw,int val) {
  if (l > rw || r < lw)
    return;
  if (l >= lw && r <= rw) {
    tree[ind] = val;
    return;
  }
  int mid = (l + r) / 2;
  update(ind + ind,l,mid,lw,rw,val);
  update(ind + ind + 1,mid + 1,r,lw,rw,val);
}

int query(int ind,int l,int r,int w) {
  if (l > w || r < w)
    return -1;
  if (l == w && r == w)
    return tree[ind];
  int mid = (l + r) / 2;
  return max(tree[ind],max(query(ind + ind,l,mid,w),query(ind + ind + 1,mid + 1,r,w)));
}

void update(int u,int v,int val) {
  int lca = get_lca(u,v);
  while(u != lca) {
    if (dep[head[u]] <= dep[lca]) {
      update(1,1,n,st[lca] + 1,st[u],val);
      break;
    }
    update(1,1,n,st[head[u]],st[u],val);
    u = dad[head[u]][0];
  }
  while(v != lca) {
    if (dep[head[v]] <= dep[lca]) {
      update(1,1,n,st[lca] + 1,st[v],val);
      break;
    }
    update(1,1,n,st[head[v]],st[v],val);
    v = dad[head[v]][0];
  }
}

int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL); cout.tie(NULL);
  cin >> n;
  for (int i = 1 ; i < n ; i++) {
    cin >> x[i] >> y[i];
    ed[x[i]].push_back(y[i]);
    ed[y[i]].push_back(x[i]);
  }
  calc();
  dfs();
  cin >> q;
  memset(tree,-1,sizeof tree);
  while(q--) {
    char ch;
    int u,v,val;
    cin >> ch >> u >> v >> val;
    update(u,v,val);
  }
  for (int i = 1 ; i < n ; i++) {
    if (dep[x[i]] < dep[y[i]])
      swap(x[i],y[i]);
    cout << x[i] << " " << y[i] << " " << query(1,1,n,st[x[i]]) << "\n";
  }
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 7 ms 4224 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 235 ms 17260 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 191 ms 14736 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 7 ms 4224 KB Output isn't correct
2 Halted 0 ms 0 KB -