今早刷了两道树剖的题目,用时两小时十五分钟= =

树剖的题目代码量普遍120+

其实打熟练之后是很容易调的,不熟练的话代码量大可能会因为某些小细节调很久

3083:裸树剖+“换根”

所谓换根其实只要判断一下当前询问点的子树和当前根的位置关系就好了,不能真的换根

根不在当前点的子树中则不影响;根在当前子树中,那么根所在的那部分子树不询问就可以了,而其他点都要询问

3626:这个题目很巧妙

有两个地方是很神的,一是将询问l~r转化为询问z一个点,二是离线操作O(qlog2n)就解决了询问

 //bzoj3083
 #include<stdio.h>
 #include<string.h>
 #include<algorithm>
 #define INF 1000000010
 using namespace std;
 ;
 struct node{
     int l,r,lz,mn;
 }t[maxn*];
 struct edge{
     int to,next;
 }e[maxn*];
 ,v0[maxn],opt;

 void insert(int u, int v){
     e[++tot].to=v; e[tot].next=head[u]; head[u]=tot;
 }

 void dfs1(int u, int f, int d){
     size[u]=; fa[u]=f; dep[u]=d;
     ; i=e[i].next){
         int v=e[i].to; if (v==f) continue;
         dfs1(v,u,d+);
         size[u]+=size[v];
         if (!son[u] || size[v]>size[son[u]]) son[u]=v;
     }
 }

 void dfs2(int u, int num){
     top[u]=num; tree[u]=++cnt; pre[cnt]=u;
     if (!son[u]) return;
     dfs2(son[u],num);
     ; i=e[i].next)
         if (e[i].to!=fa[u] && e[i].to!=son[u]) dfs2(e[i].to,e[i].to);
 }

 void pushup(int x){
     t[x].mn=min(t[x<<].mn,t[x<<|].mn);
 }

 void pushdown(int x){
     if (t[x].lz){
         t[x<<].lz=t[x<<|].lz=t[x].lz;
         t[x<<].mn=t[x<<|].mn=t[x].mn;
         t[x].lz=;
     }
 }

 void update(int a, int b, int w, int x){
     int l=t[x].l, r=t[x].r;
     if (l==a && r==b){
         t[x].lz=;
         t[x].mn=w;
         return;
     }
     ;
     pushdown(x);
     |);
     );
     ),update(mid+,b,w,x<<|);
     pushup(x);
 }

 int get_min(int a, int b, int x){
     int l=t[x].l, r=t[x].r;
     if (l==a && b==r) return t[x].mn;
     ;
     pushdown(x);
     );
     |);
     ),get_min(mid+,b,x<<|));
 }

 void build(int l, int r, int x){
     t[x].l=l, t[x].r=r;
     if (l==r){
         t[x].mn=v0[pre[l]];
         t[x].lz=;
         return;
     }
     ;
     );
     ,r,x<<|);
     pushup(x);
 }

 void change(int x, int y, int c){
     while (top[x]!=top[y]){
         if (dep[x]<dep[y]) swap(x,y);
         update(tree[top[x]],tree[x],c,);
         x=fa[top[x]];
     }
     if (dep[x]>dep[y]) swap(x,y);
     update(tree[x],tree[y],c,);
 }

 int main(){
     scanf(; memset(head,-,;
     ; i<n; i++) scanf("%d%d", &u, &v),insert(u,v),insert(v,u);
     dfs1(,,);
     dfs2(,);
     ; i<=n; i++) scanf("%d", &v0[i]);
     build(,cnt,);
     scanf("%d", &cap);
     while (Q--){
         scanf("%d", &opt);
         ) scanf("%d", &cap);
         ){
             scanf("%d%d%d", &u, &v, &w);
             change(u,v,w);
         }
         ){
             scanf("%d", &u);
             ].mn);
             else{
                 ;
                 ; i=e[i].next){
                     int v=e[i].to;
                     if (v==fa[u]) continue;
                     ) child=v;
                 }
                 if (child){
                     ,tree[child]-,));
                     int right=INF;
                     ));
                     printf()));
                 }
                 ,));
             }
         }
     }
     ;
 }
 //bzoj3626
 #include<stdio.h>
 #include<string.h>
 #include<algorithm>
 #define MOD 201314
 using namespace std;
 ;
 struct node{
     int l,r,lz,sum,len;
 }t[maxn*];
 struct edge{
     int to,next;
 }e[maxn*];
 struct Ans{
     int z,R,L;
 }ans[maxn];
 struct cover{
     int p,id;
     bool flag;
 }a[maxn*];
 int fa[maxn],dep[maxn],size[maxn],top[maxn],son[maxn],head[maxn],tot,cnt;
 int tree[maxn],pre[maxn],n,q,u,v;

 bool cmp(cover a, cover b){
     return a.p<b.p;
 }

 void insert(int u, int v){
     e[++tot].to=v; e[tot].next=head[u]; head[u]=tot;
 }

 void dfs1(int u, int f, int d){
     fa[u]=f; dep[u]=d; size[u]=;
     ; i=e[i].next){
         int v=e[i].to; if (v==f) continue;
         dfs1(v,u,d+);
         size[u]+=size[v];
         if (!son[u] || size[v]>size[son[u]]) son[u]=v;
     }
 }

 void dfs2(int u, int num){
     top[u]=num; tree[u]=++cnt; pre[cnt]=u;
     if (!son[u]) return;
     dfs2(son[u],num);
     ; i=e[i].next)
         if (e[i].to!=son[u] && e[i].to!=fa[u]) dfs2(e[i].to,e[i].to);
 }

 void pushup(int x){
     t[x].sum=t[x<<].sum+t[x<<|].sum;
 }

 void pushdown(int x){
     if (t[x].lz){
         t[x<<].lz+=t[x].lz;
         t[x<<|].lz+=t[x].lz;
         t[x<<].sum+=t[x<<].len*t[x].lz;
         t[x<<|].sum+=t[x<<|].len*t[x].lz;
         t[x].lz=;
     }
 }

 int query(int a, int b, int x){
     int l=t[x].l, r=t[x].r;
     if (l==a && r==b) return t[x].sum;
     ;
     pushdown(x);
     );
     |);
     )+query(mid+,b,x<<|);
 }

 void update(int a, int b, int x){
     int l=t[x].l, r=t[x].r;
     if (l==a && r==b){
         t[x].sum+=t[x].len;
         t[x].lz++;
         return;
     }
     ;
     pushdown(x);
     );
     |);
     ),update(mid+,b,x<<|);
     pushup(x);
 }

 void build(int l, int r, int x){
     t[x].l=l, t[x].r=r; t[x].len=r-l+;
     if (l==r){
         t[x].sum=;
         t[x].lz=;
         return;
     }
     ;
     );
     ,r,x<<|);
     pushup(x);
 }

 void tree_update(int x, int y){
     while (top[x]!=top[y]){
         if (dep[x]<dep[y]) swap(x,y);
         update(tree[top[x]],tree[x],);
         x=fa[top[x]];
     }
     if (dep[x]>dep[y]) swap(x,y);
     update(tree[x],tree[y],);
 }

 int tree_query(int x, int y){
     ;
     while (top[x]!=top[y]){
         if (dep[x]<dep[y]) swap(x,y);
         ret+=query(tree[top[x]],tree[x],); ret%=MOD;
         x=fa[top[x]];
     }
     if (dep[x]>dep[y]) swap(x,y);
     ) % MOD +ret) % MOD;
 }

 int main(){
     scanf("%d%d", &n, &q);
     tot=; memset(head,-,sizeof(head));
     ; i<n; i++){
         scanf("%d", &u);
         insert(u,i);
     }
     cnt=;
     dfs1(,,);
     dfs2(,);
     build(,n,);
     cnt=;
     ; i<=q; i++){
         scanf("%d%d%d", &u, &v, &ans[i].z);
         a[++cnt].p=u-; a[cnt].id=i; a[cnt].flag=;
         a[++cnt].p=v; a[cnt].id=i; a[cnt].flag=;
     }
     sort(a+,a++cnt,cmp);
     ;
     ; i<=cnt; i++){
         while (now<a[i].p){
             now++;
             tree_update(now,);
         }
         int pos=a[i].id;
         );
         );
     }
     ; i<=q; i++) printf("%d\n", (ans[i].R-ans[i].L+MOD)%MOD);
     ;
 }

bzoj3083 遥远的国度 && bzoj3626 LCA (树链剖分)的更多相关文章

  1. [BZOJ3626] [LNOI2014]LCA(树链剖分)

    [BZOJ3626] [LNOI2014]LCA(树链剖分) 题面 给出一棵N个点的树,要求支持Q次询问,每次询问一个点z与编号为区间[l,r]内的点分别求最近公共祖先得到的最近公共祖先深度和.N, ...

  2. Count on a tree SPOJ 10628 主席树+LCA(树链剖分实现)(两种存图方式)

    Count on a tree SPOJ 10628 主席树+LCA(树链剖分实现)(两种存图方式) 题外话,这是我第40篇随笔,纪念一下.<( ̄︶ ̄)↗[GO!] 题意 是说有棵树,每个节点上 ...

  3. BZOJ3626[LNOI2014]LCA——树链剖分+线段树

    题目描述 给出一个n个节点的有根树(编号为0到n-1,根节点为0).一个点的深度定义为这个节点到根的距离+1.设dep[i]表示点i的深度,LCA(i,j)表示i与j的最近公共祖先.有q次询问,每次询 ...

  4. 【bzoj3626】[LNOI2014]LCA 树链剖分+线段树

    题目描述 给出一个n个节点的有根树(编号为0到n-1,根节点为0).一个点的深度定义为这个节点到根的距离+1.设dep[i]表示点i的深度,LCA(i,j)表示i与j的最近公共祖先.有q次询问,每次询 ...

  5. BZOJ 3083: 遥远的国度 dfs序,树链剖分,倍增

    今天再做一天树的题目,明天要开始专攻图论了.做图论十几天之后再把字符串搞搞,区域赛前再把计几看看. 3083: 遥远的国度 Time Limit: 10 Sec  Memory Limit: 128 ...

  6. BZOJ 3626: [LNOI2014]LCA [树链剖分 离线|主席树]

    3626: [LNOI2014]LCA Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2050  Solved: 817[Submit][Status ...

  7. Codeforces Round #329 (Div. 2) D. Happy Tree Party LCA/树链剖分

    D. Happy Tree Party     Bogdan has a birthday today and mom gave him a tree consisting of n vertecie ...

  8. BZOJ 3626: [LNOI2014]LCA( 树链剖分 + 离线 )

    说多了都是泪啊...调了这么久.. 离线可以搞 , 树链剖分就OK了... -------------------------------------------------------------- ...

  9. [CodeVS2370] 小机房的树 (LCA, 树链剖分, LCT)

    Description 小机房有棵焕狗种的树,树上有N个节点,节点标号为0到N-1,有两只虫子名叫飘狗和大吉狗,分居在两个不同的节点上.有一天,他们想爬到一个节点上去搞基,但是作为两只虫子,他们不想花 ...

  10. bzoj 3626 : [LNOI2014]LCA (树链剖分+线段树)

    Description 给出一个n个节点的有根树(编号为0到n-1,根节点为0).一个点的深度定义为这个节点到根的距离+1.设dep[i]表示点i的深度,LCA(i,j)表示i与j的最近公共祖先.有q ...

随机推荐

  1. Coursera-Getting and Cleaning Data-Week2-课程笔记

    Coursera-Getting and Cleaning Data-Week2 Saturday, January 17, 2015 课程概述 week2主要是介绍从各个来源读取数据.包括MySql ...

  2. 号外!GNOME 3.22 正式发布喽!!!

    导读 经过半年的努力开发,别名为“卡尔斯鲁厄”的 GNOME 3.22 正式发布了!“GNOME Software 可以安装和更新 Flatpak 软件包,GNOME Builder 则可以创建它们, ...

  3. install alilang

    $sudo dpkg -i alilang.deb $ sudo alilang

  4. java12

    1:List的子类(掌握) (1)List的子类特点 ArrayList: 底层数据结构是数组,查询快,增删慢 线程不安全,效率高 Vector: 底层数据结构是数组,查询快,增删慢 线程安全,效率低 ...

  5. CFileDialog(文件夹对话框类)和CFontDialog(字体设置对话框类)的使用学习

    CFileDialog(文件夹对话框类) 主要用于文件的保存,另存,打开,关闭等功能 功能“另存为”的实现: void CTXTDlg::OnFileSaveas() { LPCTSTR szFilt ...

  6. POJ 2337 Catenyms(有向图的欧拉通路)

    题意:给n个字符串(3<=n<=1000),当字符串str[i]的尾字符与str[j]的首字符一样时,可用dot连接.判断用所有字符串一次且仅一次,连接成一串.若可以,输出答案的最小字典序 ...

  7. 根据字体计算CGRect

    UILabel *label = [[UILabel alloc]init]; label.numberOfLines = ;//多行显示 label.backgroundColor = [UICol ...

  8. springBoot专题3---->springBoot与多数据源的配置

    最近有点忙,更新有点慢.今天进来说说一说springBoot中如何配置多数据源. 第一,新建一个名为springBoot-mutidata的maven项目,完整的pom.xml配置如下: <?x ...

  9. LeetCode之412. Fizz Buzz

    -------------------------------------------- 虽然是从最简单的开始刷起,但木有想到LeetCode上也有这么水的题目啊... AC代码: public cl ...

  10. Sass中文乱码问题(手动编译和watch编译)

    一.sass手动编译出错 .scss文件中含有中文的时候编译报错(比如注释,比如字体栈),比如: foo.scss: 编译: 解决办法: 找到类似这个的路径的文件(仅供参考,不同环境可能不同): C: ...