zoukankan      html  css  js  c++  java
  • Qtree1

    树剖裸题?(复习练练手)

      1 // luogu-judger-enable-o2
      2 #include <bits/stdc++.h>
      3 using namespace std;
      4 
      5 int n,vis[100005],size[100005],dep[100005],fa[100005][20],val[100005],wson[100005],t1,t2,t3,t4,ind;
      6 int tid[100005],sid[100005],top[100005],eg1[100005],eg2[100005];
      7 vector <pair<int,int> > g[100005];
      8 char str[105];
      9 
     10 void dfs1(int p){
     11     vis[p]=1;
     12     size[p]=1;
     13     for(int i=0;i<g[p].size();i++) {
     14         if(vis[g[p][i].first]==0) {
     15             dep[g[p][i].first]=dep[p]+1;
     16             fa[g[p][i].first][0]=p;
     17             val[g[p][i].first]=g[p][i].second;
     18             dfs1(g[p][i].first);
     19             size[p]+=size[g[p][i].first];
     20             if(size[g[p][i].first]>size[wson[p]])
     21                 wson[p]=g[p][i].first;
     22         }
     23     }
     24 }
     25 
     26 void dfs2(int p){
     27     vis[p]=1;
     28     tid[++ind]=p;
     29     sid[p]=ind;
     30     if(wson[p]) {
     31         top[wson[p]]=top[p];
     32         dfs2(wson[p]);
     33     }
     34     for(int i=0;i<g[p].size();i++) {
     35         if(vis[g[p][i].first]==0) {
     36             top[g[p][i].first]=g[p][i].first;
     37             dfs2(g[p][i].first);
     38         }
     39     }
     40 }
     41 
     42 void lca_presolve() {
     43     for(int i=1;i<=17;i++) 
     44         for(register int j=1;j<=n;j++)
     45             fa[j][i]=fa[fa[j][i-1]][i-1];
     46 }
     47 
     48 inline int lca(int p,int q){
     49     if(dep[p]<dep[q]) swap(p,q);
     50     for(register int i=17;i>=0;i--)
     51         if(dep[fa[p][i]]>=dep[q]) p=fa[p][i];
     52     for(register int i=17;i>=0;i--)
     53         if(fa[p][i]-fa[q][i]) p=fa[p][i],q=fa[q][i];
     54     if(p-q) p=fa[p][0], q=fa[q][0];
     55     return max(p,q);
     56 }
     57 
     58 int a[500005],sq[500005];
     59 
     60 void pushup(int p) {
     61     a[p]=max(a[p*2],a[p*2+1]);
     62 }
     63 
     64 void build(int p,int l,int r) {
     65     if(l==r) a[p]=sq[l];
     66     else build(p*2,l,(l+r)/2), build(p*2+1,(l+r)/2+1,r), pushup(p);
     67 }
     68 
     69 void modify(int p,int l,int r,int pos,int k) {
     70     if(l==r) {
     71         a[p]=k;
     72         sq[pos]=k;
     73     }
     74     else {
     75         if(pos<=(l+r)/2) modify(p*2,l,(l+r)/2,pos,k);
     76         else modify(p*2+1,(l+r)/2+1,r,pos,k);
     77         pushup(p);
     78     }
     79 }
     80 
     81 int query(int p,int l,int r,int ql,int qr) {
     82     if(l>qr||r<ql) return 0;
     83     if(l>=ql&&r<=qr) return a[p];
     84     return max(query(p*2,l,(l+r)/2,ql,qr),query(p*2+1,(l+r)/2+1,r,ql,qr));
     85 }
     86 
     87 void readin() {
     88     scanf("%d",&n);
     89     for(int i=1;i<n;i++) {
     90         scanf("%d%d%d",&t1,&t2,&t3);
     91         eg1[i]=t1;
     92         eg2[i]=t2;
     93         g[t1].push_back(make_pair(t2,t3));
     94         g[t2].push_back(make_pair(t1,t3));
     95     }
     96 }
     97 
     98 void init() {
     99     dep[1]=1;
    100     dfs1(1);
    101     memset(vis,0x00,sizeof vis);
    102     dfs2(1);
    103     lca_presolve();
    104     for(int i=1;i<=n;i++) 
    105         sq[i]=val[tid[i]];
    106     build(1,1,n);
    107 }
    108 
    109 void tmodify(int pos,int key){
    110     modify(1,1,n,sid[pos],key);
    111 }
    112 
    113 int lquery(int anc,int son) {
    114     int ans=0;
    115     while(dep[top[son]]>dep[anc]) 
    116         ans=max(ans,query(1,1,n,sid[top[son]],sid[son])),
    117         son=fa[top[son]][0];
    118     ans=max(ans,query(1,1,n,sid[anc]+1,sid[son]));
    119     return ans;
    120 }
    121 
    122 int tquery(int p,int q) {
    123     int l=lca(p,q);
    124     return max(lquery(l,p),lquery(l,q));
    125 }
    126 
    127 int main(){
    128     readin();
    129     init();
    130     for(int i=1;1;i++) {
    131         scanf("%s",&str);
    132         if(str[0]=='D') return 0;
    133         scanf("%d%d",&t2,&t3);
    134         if(str[0]=='C') tmodify((dep[eg1[t2]]>dep[eg2[t2]])?eg1[t2]:eg2[t2],t3);
    135         else printf("%d
    ",tquery(t2,t3));
    136     }
    137 }
  • 相关阅读:
    搭建高可用K8S集群
    K8S部署apollo配置中心
    微服务二:微服务的拆分、设计模式、内部结构
    微服务一:微服务概念入门及发展历程
    k8s可视化管理dashboard
    Windows节点加入K8S集群(K8S搭建Linux和Window混合集群)
    K8S搭建单点集群+问题处理
    K8S核心概念
    毕业论文word排版设置
    Anaconda3+PyTorch安装教程
  • 原文地址:https://www.cnblogs.com/mollnn/p/8486000.html
Copyright © 2011-2022 走看看