zoukankan      html  css  js  c++  java
  • 动态树链剖分

      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 }
  • 相关阅读:
    分享一个文字转成语音的工具,视频配音神器
    生手linux服务器维护常用命令记录
    信不信?各种红包App最后都会整合游戏!App+游戏的变现模式分析
    一个玩游戏的失足青年,转行做游戏开发到教育的痛苦挣扎过程(4)
    免费送!CocosCreator 6.1超级大礼包!
    一个玩游戏的失足青年,转行做游戏开发到教育的痛苦挣扎过程(3)
    【激励视频组件】零编程,即拖即用,妈妈再也不用担心小游戏 SDK 接入了!
    惊天大案!80多款游戏源码被非法倒卖交换!波及数千余人涉案!
    小游戏开发运营挣钱模型之—游戏调优篇(1)
    有个事正在悄然发生,估计谁都无法逆转!只能积极拥抱
  • 原文地址:https://www.cnblogs.com/chxer/p/4445320.html
Copyright © 2011-2022 走看看