可以很显而易见的看出,修改就是树链剖分,而询问就是在dfs出的线段树里查询最小值,但由于这道题会修改根节点,所以在查询的时候需判断x是否为root的祖先,如果不是就直接做,是的话应该查询从1-st[y]-1  ed[y]+1 -- n 的最小值,其中y是root的祖先,x的儿子

PS:好久没做题,线段树都查了好久QAQ,还是没查出错来,最后只能cheat一个程序了QAQ

CODE:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
#define maxn 100010
#define maxm 200020
typedef long long ll ;
struct edges{
 int to,next;
}edge[maxm];
int next[maxn],l,n,m;
int addedge(int x,int y){
 edge[++l]=(edges){y,next[x]};next[x]=l;
 edge[++l]=(edges){x,next[y]};next[y]=l;
 return 0;
}
ll _min(ll x,ll y){
 if (x==0) return y;
 if (y==0) return x;
 return min(x,y);
}
int dep[maxn],fa[maxn],sum[maxn],ch[maxn],pre[maxn],pos[maxn],add[maxn],lef[maxn],righ[maxn];
int cl;
bool b[maxn];
int dfs(int u){
 dep[u]=dep[fa[u]]+1;
 sum[u]=1;b[u]=1;
 for (int i=next[u];i;i=edge[i].next)
  if (!b[edge[i].to]){
   fa[edge[i].to]=u;
   dfs(edge[i].to);
   sum[u]+=sum[edge[i].to];
   ch[u]=sum[edge[i].to]>sum[ch[u]]?edge[i].to:ch[u];
  }
 return 0;
}
int heavy(int u,bool bo){
 cl++;
 pos[add[cl]=u]=cl;
 b[u]=1;lef[u]=cl;
 if (bo) pre[u]=u;
 else pre[u]=pre[fa[u]];
 if (ch[u]) heavy(ch[u],0);
 for (int i=next[u];i;i=edge[i].next)
  if (!b[edge[i].to])
   heavy(edge[i].to,1);
 righ[u]=cl;
 return 0;
}
struct TREE{
 int l,r;ll x;bool lazy;
}t[maxn*8];
ll s[maxn];
int buildtree(int x,int l,int r){
 t[x].l=l;t[x].r=r;
 if (l==r) {t[x].x=s[add[l]];return 0;}
 buildtree(x<<1,l,(l+r)>>1);
 buildtree((x<<1)+1,((l+r)>>1)+1,r);
 t[x].x=_min(t[x<<1].x,t[(x<<1)+1].x);
 return 0;
}
int pushdown(int x){
 if (t[x].lazy) {
  t[x<<1].x=t[(x<<1)+1].x=t[x].x;
  t[x<<1].lazy=t[(x<<1)+1].lazy=1;
  t[x].lazy=0;
 }
 return 0;
}
ll cha(int x,int x1,int y1){
 int l=t[x].l,r=t[x].r;
 if (l>y1||r<x1) return 0;
 if (l==r) return (t[x].x);
 if (l>=x1&&r<=y1) return t[x].x;
 pushdown(x);
 return _min(cha(x<<1,x1,y1),cha((x<<1)+1,x1,y1));
}
int gai(int x,ll y,int x1,int y1){
 int l=t[x].l,r=t[x].r;
 if (l>y1||r<x1) return 0;
 if (l==r) {t[x].x=y;return 0;}
 if (l>=x1&&r<=y1) {t[x].lazy=1;t[x].x=y;return 0;}
 pushdown(x);
 gai(x<<1,y,x1,y1);gai((x<<1)+1,y,x1,y1);
 t[x].x=_min(t[x<<1].x,t[(x<<1)+1].x);
 return 0;
}
int change(int l,int r,ll x){
 for (;;){
  if (pre[l]==pre[r]) {
   if (dep[l]>dep[r]) swap(l,r);
   gai(1,x,pos[l],pos[r]);
   return 0;
  }else{
   if (dep[pre[l]]<dep[pre[r]]) swap(l,r);
   gai(1,x,pos[pre[l]],pos[l]);
   l=fa[pre[l]];
  }
 }
 return 0;
}
int root,tem;
bool check(int x){
 int y=root;
 while (fa[y]!=0){
  if (fa[y]==x) {tem=y;return 1;}
  if (dep[fa[y]]<dep[x]) return 0;
  if (pre[fa[y]]==pre[x]) {tem=ch[x];return 1;}
  y=pre[fa[y]];
 }
 return 0;
}
ll query(int x){
 if (!check(x))return (cha(1,lef[x],righ[x]));
 else return (_min(cha(1,1,lef[tem]-1),cha(1,righ[tem]+1,n)));
}
int main(){
 scanf("%d%d",&n,&m);
 for (int i=1;i<n;i++) {
  int x,y;
  scanf("%d%d",&x,&y);
  addedge(x,y);
 }
 for (int i=1;i<=n;i++) scanf("%lld",s+i);
 memset(b,0,sizeof(b));
 dfs(1);
 memset(b,0,sizeof(b));
 heavy(1,1);
 buildtree(1,1,n);
 scanf("%d",&root);
 while (m--){
  int opt,l,r;ll x;
  scanf("%d",&opt);
  if (opt==1) scanf("%d",&root);
  if (opt==2) {
   scanf("%d%d%lld",&l,&r,&x);
   change(l,r,x);
  }
  if (opt==3){
   scanf("%d",&l);
   printf("%lld\n",query(l));
  }
 }
 return  0;
}

BZOJ 3083: 遥远的国度(树链剖分+DFS序)的更多相关文章

  1. BZOJ 3083: 遥远的国度 [树链剖分 DFS序 LCA]

    3083: 遥远的国度 Time Limit: 10 Sec  Memory Limit: 1280 MBSubmit: 3127  Solved: 795[Submit][Status][Discu ...

  2. BZOJ 3083 遥远的国度 树链剖分

    3083: 遥远的国度 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 797  Solved: 181[Submit][Status] Descrip ...

  3. BZOJ 3083 遥远的国度(树链剖分+LCA)

    Description 描述zcwwzdjn在追杀十分sb的zhx,而zhx逃入了一个遥远的国度.当zcwwzdjn准备进入遥远的国度继续追杀时,守护神RapiD阻拦了zcwwzdjn的去路,他需要z ...

  4. BZOJ 3083 遥远的国度 树链剖分+线段树

    有换根的树链剖分的裸题. 在换根的时候注意讨论. 注意数据范围要开unsigned int或longlong #include<iostream> #include<cstdio&g ...

  5. bzoj 3083 遥远的国度 —— 树链剖分

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3083 换根后路径还是不变,子树分类讨论一下,树剖后线段树维护即可. 代码如下: #inclu ...

  6. bzoj 3083 遥远的国度——树链剖分+线段树维护子树信息

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3083 int 的范围是 2^31 - 1 ,所以权值是不是爆 int 了…… O( nlog ...

  7. BZOJ 3083 遥远的国度 树链剖分+脑子

    唉..又调了半天QWQ..为何读入挂了.....莫非读入是反着的????据ywy学长所言如是...OvO震惊 这啥骚题啊...还要换根...不过清明讲过...(然鹅我现在才做... 先随便选个点(比如 ...

  8. [BZOJ - 2819] Nim 【树链剖分 / DFS序】

    题目链接: BZOJ - 2819 题目分析 我们知道,单纯的 Nim 的必胜状态是,各堆石子的数量异或和不为 0 .那么这道题其实就是要求求出树上的两点之间的路径的异或和.要求支持单点修改. 方法一 ...

  9. 树链剖分&dfs序

    树上问题 很多处理区间的问题(像是RMQ,区间修改).可以用线段树,树状数组,ST表这些数据结构来维护.但是如果将这些问题挪到了树上,就不能直接用这些数据结构来处理了.这时就用到了dfs序和树链剖分. ...

随机推荐

  1. Delphi Math里的基本函数,以及浮点数比较函数(转)

    源:Delphi Math里的基本函数,以及浮点数比较函数 Delphi里的好东西太多,多到让人觉得烦.这种感觉就是当年打游戏<英雄无敌3>,改了钱以后,有钱了每天都要造建筑,明明是好事, ...

  2. 64脚和小于64脚的STM32进行AD时注意,参照电源处理方法(转)

    源:64脚和小于64脚的STM32进行AD时注意,参照电源处理方法 请注意,ADC_IN17上没有内部基准,将其说成基准电压概念不对. 所以横线以下的理解不对,如果将其做为参考,则其电压假定按1.2V ...

  3. PHP7新特性

    重写ZenVM,性能比PHP5.6提升300% 新特性: 1.变量类型(为PHP7.1的JIT特性做准备)function test(int $a, string $b, array $c) : in ...

  4. zip-auto.sh

    #!/bin/sh #auto zip package #Define Path #####test######### mkdir -p /root/shell/test1 /root/shell/t ...

  5. 10种处理PHP字符串的措施

    PHP有一个海量字符串操作库,提供了大约100个分割.连接.解析和搜索文本的功能.在这一点上,PHP的性能是如此地强大以至于在处理字符串相关问题时,判断哪一个是最好的方法会比较困难.本文中我讲了10个 ...

  6. linux下两台服务器文件实时同步方案设计和实现

    inux下两台服务器文件实时同步方案设计和实现 假设有如下需求: 假设两个服务器: 192.168.0.1 源服务器  有目录 /opt/test/ 192.168.0.2 目标服务器  有目录 /o ...

  7. bmp图片显示

    文件IO项目: 在开发板屏幕上循环显示目录里的图片 a.按照一定的间隔循环显示目录里的bmp图片 b.实现手指滑动来显示目录里的图片(bmp,jpg)上一张,下一张 d1: 1.能操控屏幕(查询开发板 ...

  8. swift 使用pod管理

    在oc 中使用pod 管理第三方库还是很方便的 今天来在swift中使用pod 来管理第三方库 其实还是很简单的 和oc 区别不大  下面来说说我遇到的一些问题及解决方法 当然使用pod 你要先安装p ...

  9. 负载均衡软件LVS分析二(安装)

    一.  安装LVS软件 1.安装前准备工作操作系统:统一采用Centos4.4版本.地址规划,如表1所示:表1 更详细的信息如图2所示: 图2  LVS DR模式安装部署结构图 图2中的VIP指的是虚 ...

  10. Bootstrap入门(十)组件4:按钮组与下拉菜单结合

    Bootstrap入门(十)组件4:按钮组与下拉菜单结合   先引入本地的CSS文件和JS文件(注:1.bootstrap是需要jQuery支持的.2.需要在<body>当中添加) < ...