百度之星2014复赛 - 1002 - The Query on the Tree
先上题目:
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
有一棵树,树的每个点有点权,每次有三种操作:
1. Query x 表示查询以x为根的子树的权值和。
2. Change x y 表示把x点的权值改为y(0<=y<=100)。
3. Root x 表示把x变为根。
现在度度熊想请更聪明的你帮助解决这个问题。
每组数据第一行为N(1<= N <= 10000),表示树的节点数。
后面N-1行每行有两个数x,y ,表示x,y之间有一条边 1<=x,y<=N。初始时树是以1号节点为根节点。
之后的一行为N个数表示这N个点的点权(点权的范围是0到100)。
然后为整数Q(Q<=1000)为操作次数。
之后的Q行为描述中的三种操作。
5
中文题意不解释,思路记录每一个节点的当前父节点(根节点的父节点可记为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的更多相关文章
- 【百度之星2014~复赛 解题报告~正解】The Query on the Tree
声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站 ...
- 【百度之星2014~复赛)解题报告】The Query on the Tree
声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站 ...
- 百度之星2014复赛 - 1001 - Find Numbers
先上题目: Find Numbers Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- 百度之星2014初赛 - 1002 - Grids
先上题目: Grids Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Tota ...
- 【百度之星2014~初赛(第二轮)解题报告】Chess
声明 笔者近期意外的发现 笔者的个人站点http://tiankonguse.com/ 的非常多文章被其他站点转载.可是转载时未声明文章来源或參考自 http://tiankonguse.com/ 站 ...
- 【百度之星2014~初赛(第二轮)解题报告】JZP Set
声明 笔者近期意外的发现 笔者的个人站点http://tiankonguse.com/ 的非常多文章被其他站点转载,可是转载时未声明文章来源或參考自 http://tiankonguse.com/ 站 ...
- 2019 年百度之星 初赛一 1002 Game
传送门 Problem Description 度度熊在玩一个好玩的游戏.游戏的主人公站在一根数轴上,他可以在数轴上任意移动,对于每次移动,他可以选择往左或往右走一格或两格.现在他要依次完成 n 个任 ...
- [百度之星2014资格赛] Disk Schedule 报告
Disk Schedule Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) To ...
- 百度之星2014资格赛 1003 - Xor Sum
先上代码: Xor Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others)T ...
随机推荐
- WINDOWS下配置SVN代码管理
服务器端使用 visualsvn server,客户端使用tortoiseSvn. 一.服务器端 1.首先,下载visualsvn server,安装到服务器.下载地址: http://www.vis ...
- Winform设计-小百货 涵盖基础插件学习(适合新手)
Winform设计-小百货 涵盖基础插件学习(适合新手) 第一次写winform,主要是为了加快对 事件的 理解. 代码如下: private void Form1_Load(object se ...
- poj--2031--Building a Space Station(prime)
Building a Space Station Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 6635 Accepte ...
- hdu1704——floyd
Problem Description there are N ACMers in HDU team.ZJPCPC Sunny Cup 2007 is coming, and lcy want to ...
- Nearest-Neighbor Methods(ESL读书笔记)
Nearest-neighbor methods use those observations in the training set T closest in input space to x f ...
- codeforces round #424 div2
A 暴力查询,分三段查就可以了 #include<bits/stdc++.h> using namespace std; ; int n, pos; int a[N]; int main( ...
- 269D
扫描线+dp 先对坐标排序,然后·用set维护端点,每次插入左端点,扫描到右端点时删除.每次考虑新插入时分割了哪两个木板,自己分别连边,再删除原来的边,最后dp(好像得维护used,有环) #incl ...
- MSSQL:删除系统作业计划
use [msdb]declare @job_name varchar(100)set @job_name = N'EveryDayBackup.Subplan_1'--注:jobName为维护计划对 ...
- 从XMLHttpRequest中获取请求的URL
在编写Ajax通用错误处理程序时,经常需要记录发生错误的XMLHttpRequest的请求URL.但查询文档,并未找到从XMLHttpRequest中获取请求URL的方法. 在javascript - ...
- dubbo之多注册中心
Dubbo 支持同一服务向多注册中心同时注册,或者不同服务分别注册到不同的注册中心上去,甚至可以同时引用注册在不同注册中心上的同名服务.另外,注册中心是支持自定义扩展的. 多注册中心注册 比如:中文站 ...