• 洛谷P4114 Qtree1(树链剖分+线段树)


    传送门

    LCT秒天秒地用什么树剖

    这题可以算是树剖的比较裸的题目了

    把每一条边的权值下放到他两边的点中深度较深的那个

    然后直接用树剖+线段树带进去乱搞就可以了

      1 //minamoto
      2 #include<bits/stdc++.h>
      3 using namespace std;
      4 template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,1:0;}
      5 inline int read(){
      6     #define num ch-'0'
      7     char ch;bool flag=0;int res;
      8     while(!isdigit(ch=getchar()))
      9     (ch=='-')&&(flag=true);
     10     for(res=num;isdigit(ch=getchar());res=res*10+num);
     11     (flag)&&(res=-res);
     12     #undef num
     13     return res;
     14 }
     15 char sr[1<<21],z[20];int C=-1,Z;
     16 inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
     17 inline void print(int x){
     18     if(C>1<<20)Ot();if(x<0)sr[++C]=45,x=-x;
     19     while(z[++Z]=x%10+48,x/=10);
     20     while(sr[++C]=z[Z],--Z);sr[++C]='
    ';
     21 }
     22 const int N=1e5+5;
     23 int head[N],Next[N<<1],ver[N<<1],edge[N<<1],tot=1;
     24 inline void add(int u,int v,int e){
     25     ver[++tot]=v,Next[tot]=head[u],head[u]=tot,edge[tot]=e;
     26 }
     27 int val[N],num[N],son[N],sz[N],fa[N],dep[N],top[N],dfn[N],cnt;
     28 int n;
     29 void dfs1(int u){
     30     sz[u]=1,dep[u]=dep[fa[u]]+1;
     31     for(int i=head[u];i;i=Next[i]){
     32         int v=ver[i];
     33         if(v!=fa[u]){
     34             fa[v]=u,num[i>>1]=v,dfs1(v),sz[u]+=sz[v];
     35             if(sz[son[u]]<sz[v]) son[u]=v;
     36         }
     37     }
     38 }
     39 void dfs2(int u,int t){
     40     top[u]=t,dfn[u]=++cnt;
     41     if(son[u]){
     42         dfs2(son[u],t);
     43         for(int i=head[u];i;i=Next[i]){
     44             int v=ver[i];
     45             if(v!=fa[u]&&v!=son[u]) dfs2(v,v);
     46         }
     47     }
     48 }
     49 int mx[N<<2];
     50 #define ls (p<<1)
     51 #define rs (p<<1|1)
     52 inline void upd(int p){mx[p]=max(mx[ls],mx[rs]);}
     53 void build(int p,int l,int r){
     54     if(l==r) return (void)(mx[p]=val[l]);
     55     int mid=(l+r)>>1;
     56     build(ls,l,mid),build(rs,mid+1,r);
     57     upd(p);
     58 }
     59 int query(int p,int l,int r,int ql,int qr){
     60     if(ql<=l&&qr>=r) return mx[p];
     61     int mid=(l+r)>>1,res=0;
     62     if(ql<=mid) cmax(res,query(ls,l,mid,ql,qr));
     63     if(qr>mid) cmax(res,query(rs,mid+1,r,ql,qr));
     64     return res;
     65 }
     66 void update(int p,int l,int r,int x){
     67     if(l==r) return (void)(mx[p]=val[l]);
     68     int mid=(l+r)>>1;
     69     x<=mid?update(ls,l,mid,x):update(rs,mid+1,r,x);
     70     upd(p);
     71 }
     72 inline void change(int i,int t){
     73     val[dfn[num[i]]]=t,update(1,1,n,dfn[num[i]]);
     74 }
     75 int query_path(int u,int v){
     76     if(u==v) return 0;
     77     int res=0;
     78     while(top[u]!=top[v]){
     79         if(dep[top[u]]<dep[top[v]]) swap(u,v);
     80         cmax(res,query(1,1,n,dfn[top[u]],dfn[u]));
     81         u=fa[top[u]];
     82     }
     83     if(u==v) return res;
     84     if(dep[u]<dep[v]) swap(u,v);
     85     cmax(res,query(1,1,n,dfn[son[v]],dfn[u]));
     86     return res;
     87 }
     88 char s[15];int a,b;
     89 int main(){
     90 //    freopen("testdata.in","r",stdin);
     91     n=read();
     92     for(int i=1,u,v,e;i<n;++i)
     93     u=read(),v=read(),e=read(),add(u,v,e),add(v,u,e);
     94     dfs1(1),dfs2(1,1);
     95     for(int i=1;i<n;++i) val[dfn[num[i]]]=edge[i<<1];
     96     build(1,1,n);
     97     while(true){
     98         scanf("%s",s);if(s[0]=='D') break;
     99         if(s[0]=='C') a=read(),b=read(),change(a,b);
    100         else a=read(),b=read(),print(query_path(a,b));
    101     }
    102     Ot();
    103     return 0;
    104 }
  • 相关阅读:
    Confluence5.6.6安装和破解
    Redis 数据备份与恢复
    Linux Shell
    戴尔R720安装ESXI系统
    zbb20171223 vm12 Vmware虚拟机设置静态IP地址
    zbb20171221 bootstrap 模态窗口
    zbb20171221 thymeleaf 格式化工具 工具对象用法
    zbb20171221 thymeleaf 基本语法
    zbb20171221 thymeleaf th:each
    zbb20171215 maven pom 包命名搜索地址
  • 原文地址:https://www.cnblogs.com/bztMinamoto/p/9792785.html
Copyright © 2020-2023  润新知