• 动态树链剖分


      1 #include<iostream>
      2 #include<cstdio>
      3 #include<cmath>
      4 #include<algorithm>
      5 #define inf -1u>>1
      6 using namespace std;
      7 const int maxn=50000+10;
      8 struct Tedge{int x,y,dist,next;}adj[maxn*2];int ms=0,fch[maxn];
      9 struct Edge{int from,to,dist;}ed[maxn];
     10 void AddEdge(int u,int v,int w){adj[++ms]=(Tedge){u,v,w,fch[u]};fch[u]=ms;return;}
     11 int dep[maxn],s[maxn],fa[maxn],son[maxn],p[maxn],top[maxn],minv[maxn*3],maxv[maxn*3],sumv[maxn*3],n,Q;
     12 void DFS(int u){//ms赋0!!!! 
     13     s[u]=1;dep[u]=dep[fa[u]]+1;
     14     for(int i=fch[u];i;i=adj[i].next){
     15         int v=adj[i].y;
     16         if(v==fa[u]) continue;
     17         fa[v]=u;
     18         DFS(v);
     19         if(s[son[u]]<s[v]) son[u]=v;
     20         s[u]+=s[v];
     21     } return;
     22 }
     23 void build(int u,int tp){
     24     top[u]=tp;p[u]=++ms;
     25     if(son[u]) build(son[u],tp);
     26     for(int i=fch[u];i;i=adj[i].next){
     27         int v=adj[i].y;
     28         if(v!=fa[u]&&v!=son[u]) build(v,v);
     29     } return;
     30 }
     31 int x,v,ql,qr;
     32 void update(int o,int L,int R){
     33     //printf("%d %d %d
    ",o,L,R);
     34     //getchar();
     35     if(L==R) minv[o]=maxv[o]=sumv[o]=v;
     36     else{
     37         int lc=o<<1,rc=lc|1,M=L+R>>1;
     38         if(x<=M) update(lc,L,M);
     39         else update(rc,M+1,R);
     40         minv[o]=min(minv[lc],minv[rc]);
     41         maxv[o]=max(maxv[lc],maxv[rc]);
     42         sumv[o]=sumv[lc]+sumv[rc];
     43     } return;
     44 }
     45 int _min,_max,_sum;
     46 void query(int o,int L,int R){
     47     //printf("%d %d %d
    ",o,L,R);
     48     if(ql<=L&&R<=qr){
     49         _min=min(_min,minv[o]);
     50         _max=max(_max,maxv[o]);
     51         _sum+=sumv[o];
     52     }
     53     else{
     54         int lc=o<<1,rc=lc|1,M=L+R>>1;
     55         if(ql<=M) query(lc,L,M);
     56         if(qr>M) query(rc,M+1,R);;
     57     } return;
     58 }
     59 void ask(int a,int b){
     60     _min=inf,_max=0,_sum=0;
     61     int f1=top[a],f2=top[b];
     62     while(f1!=f2){
     63         if(dep[f1]<dep[f2]) swap(f1,f2),swap(a,b);
     64         ql=p[f1];qr=p[a];
     65         query(1,1,n);
     66         a=fa[f1];f1=top[a];
     67     }
     68     if(a==b) return;
     69     if(dep[a]>dep[b]) swap(a,b);
     70     ql=p[son[a]];qr=p[b];//不懂 
     71     query(1,1,n);return;
     72 }
     73 inline int read(){
     74     int x=0,sig=1;char ch=getchar();
     75     while(!isdigit(ch)){if(ch=='-') sig=-1;ch=getchar();}
     76     while(isdigit(ch)) x=10*x+ch-'0',ch=getchar();
     77     return x*=sig;
     78 }
     79 inline void write(int x){
     80     if(x==0){putchar('0');return;}if(x<0) putchar('-'),x=-x;
     81     int len=0,buf[15];while(x) buf[len++]=x%10,x/=10;
     82     for(int i=len-1;i>=0;i--) putchar(buf[i]+'0');return;
     83 }
     84 void init(){
     85     n=read();
     86     for(int i=1;i<n;i++){
     87         int a=read(),b=read(),c=read();
     88         ed[i]=(Edge){a,b,c};
     89         AddEdge(a,b,c);
     90         AddEdge(b,a,c);
     91     }
     92     ms=0;DFS(1);build(1,1);
     93     for(int i=1;i<n;i++){
     94         if(dep[ed[i].to]<dep[ed[i].from]) swap(ed[i].from,ed[i].to);
     95         x=p[ed[i].to]; v=ed[i].dist;
     96         update(1,1,n);
     97     }
     98     Q=read();
     99     return;
    100 }
    101 void work(){
    102     while(Q--){
    103         int tp=read(),a=read(),b=read();
    104         if(tp){
    105             ask(a,b);
    106             if(a!=b) printf("%d %d %d
    ",_max,_min,_sum);
    107             else puts("error");
    108         }
    109         else x=p[ed[a].to],v=b,update(1,1,n);
    110     }
    111     return;
    112 }
    113 void print(){
    114     return;
    115 }
    116 int main(){
    117     init();work();print();return 0;
    118 }
  • 相关阅读:
    为图片指定区域添加链接
    数值取值范围问题
    【leetcode】柱状图中最大的矩形(第二遍)
    【leetcode 33】搜索旋转排序数组(第二遍)
    【Educational Codeforces Round 81 (Rated for Div. 2) C】Obtain The String
    【Educational Codeforces Round 81 (Rated for Div. 2) B】Infinite Prefixes
    【Educational Codeforces Round 81 (Rated for Div. 2) A】Display The Number
    【Codeforces 716B】Complete the Word
    一个简陋的留言板
    HTML,CSS,JavaScript,AJAX,JSP,Servlet,JDBC,Structs,Spring,Hibernate,Xml等概念
  • 原文地址:https://www.cnblogs.com/chxer/p/4445320.html
Copyright © 2020-2023  润新知