好久没写题解了…… 再不写就AFO了,没机会写了

Pro

题目链接

Sol

暴力还是很好打的,直接树剖

我的暴力是非常非常的暴力,对于操作1都要重新建一次树

然而其实不需要这样,正解也不需要建很多次树

直接建一棵线段树,对于每一个查询只需要判断当前根和要查询的之间的关系即可

(貌似换根只对操作3的答案有影响)

操作1:直接root=x即可

操作2:线段树单点修改

操作3:3种情况,直接上代码很好理解(天冷懒得打字 )

操作4:线段树区间查询

(貌似BIT也可做,不过我个蒟蒻只会线段树)

Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<ctime>
#include<cstdlib>
#define INF 2147483647
#define mod 1000000007
using namespace std;const int L = 100005;
struct Node {int to , next;
};
Node e[2*L];
struct Seg {int l , r , sum;
};
Seg tree[4*L];
int n , q , head[L] , tot , root , deep[L] , son[L] , top[L] , id[L] , fa[L] , data[L] , size[L] , rank[L] , cnt;inline int read() {char c=getchar(); bool flag=1; int t=0;while((c>'9'||c<'0')&&c!='-') c=getchar();if(c=='-') flag=0 , c=getchar();while(c>='0'&&c<='9') t=t*10+c-'0' , c=getchar();return flag?t:(-t);
}void add(int x , int y) {tot++;e[tot].next = head[x];e[tot].to = y;head[x] = tot;
}void dfs1(int u , int f , int d) {size[u] = 1;fa[u] = f;deep[u] = d;for(int i=head[u]; i; i=e[i].next) {int v = e[i].to;if(v==f)continue;dfs1(v , u , d+1);size[u] += size[v];if(size[v]>size[son[u]])son[u] = v;}
}void dfs2(int u , int tf) {top[u] = tf;id[u] = ++cnt;rank[cnt] = u;if(!son[u])return ;dfs2(son[u] , tf);for(int i=head[u]; i; i=e[i].next) {int v = e[i].to;if(v==fa[u]||v==son[u])continue;dfs2(v , v);}
}void pushup(int num) {tree[num].sum = tree[num<<1].sum + tree[num<<1|1].sum;
}void build(int num , int l , int r) {tree[num].l = l;tree[num].r = r;if(l==r) {tree[num].sum = data[rank[l]];return ;}int mid = (l+r)>>1;build(num<<1 , l , mid);build(num<<1|1 , mid+1 , r);pushup(num);
}void update(int num , int aim , int val) {if(tree[num].l==tree[num].r&&tree[num].l==aim) {tree[num].sum = val;return ;}int mid = (tree[num].l+tree[num].r)>>1;if(aim<=mid)update(num<<1 , aim , val);if(aim>mid)update(num<<1|1 , aim , val);pushup(num);
}int query(int num , int l , int r) {if(l<=tree[num].l&&r>=tree[num].r)return tree[num].sum;int mid = (tree[num].l+tree[num].r)>>1 , ans = 0;if(l<=mid)ans = ans + query(num<<1 , l , r);if(r>mid)ans = ans + query(num<<1|1 , l , r);return ans;
}int sol(int x , int y) {int ans = 0;while(top[x]!=top[y]) {if(deep[top[x]]<deep[top[y]])swap(x , y);ans = ans + query(1 , id[top[x]] , id[x]);x = fa[top[x]];}if(deep[x]>deep[y])swap(x , y);ans = ans + query(1 , id[x] , id[y]);return ans;
}int main() {n=read() , q=read();root =  1;for(int i=1; i<n; i++) {int x , y;x=read() , y=read();add(x , y);add(y , x);}for(int i=1; i<=n; i++)data[i] = read();deep[root] = 1;dfs1(root , 0 , 1);dfs2(root , 0);build(1 , 1 , n);while(q--) {int opt , x , y;opt = read();if(opt==1) {x = read();root = x;}if(opt==2) {x = read() , y = read();update(1 , id[x] , y);data[x] = y;}if(opt==3) {x = read();int u = root , flag = 0;if(x==root) {printf("%d\n",tree[1].sum);   continue;           }while(u!=1) {if(deep[u]<=deep[x]) break;              if(top[u]==top[x]) { flag = son[x];  break; }u = top[u];if(fa[u]==x) { flag = u; break; }u = fa[u];}if(!flag)printf("%d\n",query(1 , id[x] , id[x]+size[x]-1));elseprintf("%d\n",tree[1].sum-query(1,id[flag],id[flag]+size[flag]-1));}if(opt==4) {x = read() , y = read();printf("%d\n",sol(x , y));}}return 0;
}

[NOIp模拟题] test相关推荐

  1. 闵梓轩大佬のnoip模拟题D1 总结 2017/10/26

    背景 题目概括 T1 题面 分析 90分算法 满分算法 T2 题面 分析 部分分算法 满分算法 满分代码 T3 题面 分析 代码 总结 背景 这道题目是去年的金牌大佬闵梓轩在一年前出的一套noip模拟 ...

  2. NOIp模拟题 之 肮脏的牧师 (桶排序)

    闲话: 考场上看到了这一题,简直令我震惊!啊!居然还有真么简单的模拟题!良心啊! 而且,还是我 痴迷的 熟悉的游戏 --  欧气传说 炉石传说! (话说题面的那三张卡都贼 恶心 好用!都可以在前期打出 ...

  3. 一些noip模拟题一句话题解

    Problem A: 序列 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 12  Solved: 9 [Submit][Status][Web Bo ...

  4. 【noip模拟题】天神下凡(贪心)

    vijos某次模拟赛原题... 处理出每个圆的一级祖先就行了... 其实没有那么麻烦,贪心即可出解. 我们将每个圆转换成线段后按左端点小右端点大的方法排序 然后维护一个栈: 对于每一个圆i 如果栈顶右 ...

  5. NOIP模拟题——来自风平浪静的明天

    [题目描述] 冬眠了五年,光终于从梦中醒来. 千咲.要,大家都在. 隐约记得"昨天"的海船祭,爱花意外成为贡女,沉入海底. 海面冰封,却有丝丝暖流在冰面之下涌动. 此时,爱花沉睡在 ...

  6. Noip模拟题解题报告

    Pro 第一次AK. 题目链接 Sol 站军姿 算是数学题吧,求出两圆的位置关系,然后余弦定理和扇形面积什么的搞搞就行. #include<iostream> #include<cs ...

  7. noip模拟题11.5

    T1 大天使之剑 [问题描述] 小A在游戏⾥打怪.有⼀次,他⼀下⼦遇到了n个怪物. 每个怪物有一个生命值,第i个怪物的生命值是h_i.而小A除了生命值之外,还有一个属性是魔法值m. 小A和怪物们依次行 ...

  8. noip模拟题11.11 光棍节测试

    T1. tractor 题目描述 农场上有N(1 <= N <= 50,000)堆草,放在不同的地点上.FJ有一辆拖拉机,也在农场上.拖拉机和草堆都表示为二维平面上的整数坐标,坐标值在1. ...

  9. [Noip模拟题]寿司

    Description 小 c 是一名 oier.最近,他发现他的数据结构好像学傻了.因为他在刷题时碰到了一道傻逼数据结构题,强行使用了平衡树来解决,卡着时间 AC.为此,他被狠狠地嘲讽了一番.于是, ...

  10. [HZWER NOIP模拟题][杂题][防骗题]数列

    简要题意: 长度为n的数列,有m个询问,每组询问a,b,c,表示要求出最小的i满足a*(i+1)*xi^2+(b+1)*i*xi+c+i=0,为保证强制在线,实际的a=a+lastans(b,c同理) ...

最新文章

  1. Google News 中文上线
  2. sklearn自学指南(part13)--贝叶斯回归
  3. java中的集合框架_JAVA中的集合框架(上)List
  4. java的URLEncoder.encode() 疑问与解惑
  5. LR运行9415商品拒绝问题
  6. c#与api类型对照表
  7. lambda 两个list获取交集_《Java8 实战》笔记 - Lambda 表达式
  8. 解决Ajax请求时无法重定向的问题
  9. ct与x光的哪个辐射大_听说做一次CT所受到的辐射剂量和损害 = 拍400张X光片?
  10. 苹果cms V10模板/MXone Pro自适应影视电影网站模板
  11. 用友文件服务器设置,u8文件服务器如何设置
  12. 汽车自动驾驶产业链深度研究报告:自动驾驶驶向何方
  13. 华为员工年薪 200 万!真相让人心酸!
  14. 微信第三方登录有两种登录方式, 1. 微信开放平台登录 2. 微信公众平台授权登录?
  15. 多模模块接单模光纤跳线/单模模块接多模光纤跳线
  16. 微服务网关之Springcloud GateWay
  17. selenium网页截图总结
  18. 计算机函数countifs使用,countifs函数(countifs使用方法举例)
  19. 【无标题】 R语言下载keras最新方法
  20. 【原】移动web资源整理

热门文章

  1. nuget.org 无法加载源 https://api.nuget.org/v3/index.json 的服务索引
  2. 6. 分类图显示和保存
  3. 一步一步教你使用AgileEAS.NET基础类库进行应用开发-WinForm应用篇-在UI中应用DataUIMapper组件...
  4. 【书籍推荐】给大家分享和推荐前端相关书籍
  5. Nagios学习实践系列——配置研究[监控当前服务器]
  6. SQL Server调优系列基础篇(常用运算符总结)
  7. Linux 安装和卸载JDK
  8. RHEL6网络无人值守安装
  9. 禁用vsftpd欢迎语
  10. 想知道账号被封的感觉么?