先上题目:

The Query on the Tree

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 54    Accepted Submission(s): 18

Problem Description
  度度熊最近沉迷在和树有关的游戏了,他一直认为树是最神奇的数据结构。一天他遇到这样一个问题:
  有一棵树,树的每个点有点权,每次有三种操作:
  1. Query x 表示查询以x为根的子树的权值和。
  2. Change x y 表示把x点的权值改为y(0<=y<=100)。
  3. Root x 表示把x变为根。
  现在度度熊想请更聪明的你帮助解决这个问题。
 
Input
  第一行为数据组数T(1 <= T <= 100)
  每组数据第一行为N(1<= N <= 10000),表示树的节点数。
  后面N-1行每行有两个数x,y ,表示x,y之间有一条边 1<=x,y<=N。初始时树是以1号节点为根节点。
  之后的一行为N个数表示这N个点的点权(点权的范围是0到100)。
  然后为整数Q(Q<=1000)为操作次数。
  之后的Q行为描述中的三种操作。
 
Output
  对于第k组输入数据,第一行输出Case #k 接下来对于每个”Query x”操作,输出以x为根的子数和。
 
Sample Input
2
5
1 2
1 3
3 4
3 5
1 2 3 4 5
5
Query 1
Change 3 10
Query 1
Root 4
Query 3
8
1 2
1 3
3 4
4 5
5 6
5 7
4 8
1 2 3 4 5 6 7 8
5
Query 1
Query 3
Root 5
Query 3
Query 1
 
Sample Output
Case #1:
15
22
18
Case #2:
36
33
6
3
 
Source
 

  中文题意不解释,思路记录每一个节点的当前父节点(根节点的父节点可记为0) ,然后对于三种操作,如果是修改某个结点的值,那就修改完这个值以及当前节点的子树的值以后,向父节点方向修改每一个节点的子树的值;如果是修改根节点,那就从新根节点开始向父节点方向移动,将遇到的节点的父节点都改成向新根节点方向,同时更新子树的最值;如果是查询的话,就直接输出。需要注意的是既的更新父节点以及子树的权值。

上代码:

 #include <cstdio>
#include <cstring>
#include <utility>
#define MAX 10002
using namespace std;
typedef pair<int,int> pii; int n,tot;
int p[MAX];
int fa[MAX];
int w[MAX];
int s[MAX];
pii e[MAX<<];
char q[];
bool f; void reset(){
memset(p,-,sizeof(int)*(n+));
tot=;
} void add(int u,int v){
e[tot].first=v; e[tot].second=p[u]; p[u]=tot++;
e[tot].first=u; e[tot].second=p[v]; p[v]=tot++;
} int deal(int u,int t){
int c=;
s[u]=;
fa[u]=t;
for(int v=p[u];v!=-;v=e[v].second){
if(e[v].first!=t){
c = deal(e[v].first,u);
s[u]+=c;
}
}
s[u]+=w[u];
return s[u];
} void C(int a,int v){
int c = w[a];
while(a!=){
s[a] = s[a] - c + v;
a = fa[a];
}
} void R(int r,int t){
s[r]=;
for(int i=p[r];i!=-;i=e[i].second){
if(e[i].first==t) continue;
if(e[i].first==fa[r]) R(fa[r],r);
s[r]+=s[e[i].first];
fa[e[i].first]=r;
}
s[r]+=w[r];
} int main()
{
int t,u,v,a,m;
//freopen("data.txt","r",stdin);
scanf("%d",&t);
for(int z=;z<=t;z++){
printf("Case #%d:\n",z);
scanf("%d",&n);
reset();
for(int i=;i<n;i++){
scanf("%d %d",&u,&v);
add(u,v);
}
for(int i=;i<=n;i++) scanf("%d",&w[i]);
deal(,);
scanf("%d",&a);
while(a--){
scanf("%s %d",q,&m);
if(q[]=='Q'){
printf("%d\n",s[m]);
}else if(q[]=='C'){
scanf("%d",&v);
C(m,v);
w[m]=v;
}else{
R(m,);
fa[m]=;
}
}
}
return ;
}

1002

百度之星2014复赛 - 1002 - The Query on the Tree的更多相关文章

  1. 【百度之星2014~复赛 解题报告~正解】The Query on the Tree

    声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站 ...

  2. 【百度之星2014~复赛)解题报告】The Query on the Tree

    声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站 ...

  3. 百度之星2014复赛 - 1001 - Find Numbers

    先上题目: Find Numbers Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  4. 百度之星2014初赛 - 1002 - Grids

    先上题目: Grids Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Tota ...

  5. 【百度之星2014~初赛(第二轮)解题报告】Chess

    声明 笔者近期意外的发现 笔者的个人站点http://tiankonguse.com/ 的非常多文章被其他站点转载.可是转载时未声明文章来源或參考自 http://tiankonguse.com/ 站 ...

  6. 【百度之星2014~初赛(第二轮)解题报告】JZP Set

    声明 笔者近期意外的发现 笔者的个人站点http://tiankonguse.com/ 的非常多文章被其他站点转载,可是转载时未声明文章来源或參考自 http://tiankonguse.com/ 站 ...

  7. 2019 年百度之星 初赛一 1002 Game

    传送门 Problem Description 度度熊在玩一个好玩的游戏.游戏的主人公站在一根数轴上,他可以在数轴上任意移动,对于每次移动,他可以选择往左或往右走一格或两格.现在他要依次完成 n 个任 ...

  8. [百度之星2014资格赛] Disk Schedule 报告

    Disk Schedule Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  9. 百度之星2014资格赛 1003 - Xor Sum

    先上代码: Xor Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 132768/132768 K (Java/Others)T ...

随机推荐

  1. HDU 5532 / 2015ACM/ICPC亚洲区长春站 F.Almost Sorted Array

    Almost Sorted Array Problem Description We are all familiar with sorting algorithms: quick sort, mer ...

  2. Codeforces--106C--Buns(背包)

    Buns Time Limit: 2000MS   Memory Limit: 262144KB   64bit IO Format: %I64d & %I64u Submit Status ...

  3. B1208 [HNOI2004]宠物收养所 平衡树||set (滑稽)

    这个题是一道splay裸题,但是我不太会写,所以用set直接水过去!!!哈哈哈哈,美滋滋. set总结: set是一个集合,然后里面没用重复的元素.里面有一些函数: begin()     ,返回se ...

  4. B1230 [Usaco2008 Nov]lites 开关灯 线段树

    就是线段树维护异或和.之前我线段树区间修改down都是修改当前区间,结果debug出不来,改成每次向下了. 题干: Description Farmer John尝试通过和奶牛们玩益智玩具来保持他的奶 ...

  5. 第14课 SourceTree程序操作介绍

    http://www.atlassian.com/software/sourcetree/overview https://www.microsoft.com/net/framework/versio ...

  6. C#中动态读取配置

    有些时候,文件修改需要及时的响应,这个时候就需要实时读取文件,预先想的是写一个计时器,每隔多久运行一次,但是不能实时响应,所以采用监听文件的方式实现读取数据 C#监听文件变化 /// <summ ...

  7. B - Cows and Poker Game

    Problem description There are n cows playing poker at a table. For the current betting phase, each p ...

  8. 使用maven搭建SSH框架实现登陆、列表查询分页

    SSH框架:struts2 + spring + hibernate web层:struts2+jsp service层:javaBean dao层:hibernate spring:管理Action ...

  9. Assembly之instruction之CMP

    CMP[.W]  Compare source and destinationCMP.B  Compare source and destination Syntax  CMP src,dst or ...

  10. 用JSP实现动态交互

    一.什么是JSP? 1.在HTML中嵌入Java脚本代码 2.由应用服务器中的JSP引擎来编译和执行嵌入的Java脚本代码 3.然后将生成的整个页面信息返回给客户端   二.为什么需要基于B/S技术的 ...