由于智力的问题,百度之星完全lu不动。。开场看第一题根据题目给的条件我觉得一定是可以构造出来的,题目给的意思颇有鸽巢原理的感觉,于是觉得开场第一题应该就是智力构造题了,想了半个小时,发现完全想不动,于是只能放弃了去想后面的题。

然后看第二题的数据结构,树上的询问,支持点修改,询问子树和,还有换根,然后心里想,我擦,这不是LCT么,但是我没学呀,然后细心的翻出之前打印的论文研读了很久,发现普通的LCT只能解决询问树路径上的东西,然后看论文上写如果支持子树操作的话就需要Euler-tour-tree什么的,想了一个多小时都想不到怎么用LCT,最后只能作罢。

然后看了三四题觉得也没什么思路,就去看第五题了,我感觉第五题是有思路的,对两个串建自动机,然后dp[i]定义为状态i的胜率,那么每个状态有两个转移边,转移到xi以及xj状态,那么dp[i]=1/2(dp[xi]+dp[xj]),然后边界就是我方胜利的状态为1,敌方胜利的状态为0,然后我希望能够通过发现图里深层的关系以期避免高斯消元,但是怎么搞都觉得是要高斯消元的,但是因为题目输出的是最简分数,分数版本的高斯消元我感觉我是写不粗来的,然后就只能作罢了。赛后听英姐说用LCM去消,我就明白了其实就是消元的时候按照高中学的那种消去法就好了,不要搞什么小数出来,有空写写看下能不能过。。

最后只能回头去看最多人过的第二题了,在纸上画了一下发现规律了,将原来的树保持不变,修改的时候按照传统的树状数组的点更段询就可以了,关键是在询问的时候,如果当前 询问的点是当前根的父亲,那么答案应该是 所有权值的和-(询问点包含根的那棵子树的和),否则就直接询问就可以了。要写一个LCA来求出询问点到根的路径的下一个点,然后每次询问都是logn的。

好久没写代码了呢,回头搜下看下第一题是怎么作粗来的。。

#pragma warning(disable:4996)
#include <iostream>
#include <cstring>
#include <string>
#include <vector>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std; #define maxn 10050
#define maxlogv 16
int bit[maxn];
int n; void add(int x, int v)
{
while (x <= n){
bit[x] += v;
x += x&(-x);
}
} int query(int x)
{
int ret = 0;
while (x > 0){
ret += bit[x];
x -= x&(-x);
}
return ret;
} int first[maxn];
int nxt[2 * maxn];
int vv[2 * maxn];
int e;
void addEdge(int u, int v)
{
vv[e] = v; nxt[e] = first[u];
first[u] = e++;
} int pre[maxn];
int post[maxn];
vector<int> G[maxn];
int val[maxn];
int dfs_clock;
int p[maxn][maxlogv];
int dep[maxn]; void dfs(int u,int fa,int d)
{
p[u][0] = fa; dep[u] = d;
pre[u] = ++dfs_clock; int v;
for (int i = first[u]; i !=-1; i=nxt[i]){
v = vv[i];
if (!pre[v]) dfs(v,u,d+1);
}
post[u] = dfs_clock;
} void setRoot(int root)
{
memset(pre, 0, sizeof(pre));
memset(post, 0, sizeof(post));
memset(p, -1, sizeof(p));
memset(dep, 0, sizeof(dep));
dfs_clock = 0;
dfs(root,-1,0);
memset(bit, 0, sizeof(bit));
for (int i = 1; i <= n; i++){
add(pre[i], val[i]);
}
} void getp()
{
for (int j = 0; j + 1 <= maxlogv; j++){
for (int i = 1; i <= n; i++){
if (p[i][j] != -1){
p[i][j + 1] = p[p[i][j]][j];
}
}
}
} bool isFather(int u, int v)
{
return pre[u] <= pre[v] && pre[v] <= post[u];
} int findPostFather(int u, int v)
{
int gap = dep[v] - dep[u];
gap -= 1;
for (int i = maxlogv; i >= 0; i--){
if ((gap >> i) & 1){
v = p[v][i];
}
}
return v;
} int main()
{
int T; cin >> T; int ca = 0;
while (T--)
{
scanf("%d", &n);
int ui, vi;
memset(first, -1, sizeof(first)); e = 0;
for (int i = 0; i < n - 1; i++){
scanf("%d%d", &ui, &vi);
addEdge(ui, vi);
addEdge(vi, ui);
}
int tot = 0;
for (int i = 1; i <= n; i++){
scanf("%d", val + i);
tot += val[i];
}
setRoot(1);
int root = 1;
getp();
int m; scanf("%d", &m);
char s[12];
printf("Case #%d:\n", ++ca);
for (int i = 0; i < m; i++){
scanf("%s",s);
if (s[0] == 'Q'){
scanf("%d", &ui);
if (ui == root) {
printf("%d\n", tot); continue;
}
if (isFather(ui, root)){
vi = findPostFather(ui,root);
printf("%d\n", tot - (query(post[vi]) - query(pre[vi] - 1)));
}
else{
printf("%d\n", query(post[ui]) - query(pre[ui] - 1));
}
}
else if (s[0] == 'C'){
scanf("%d%d", &ui, &vi);
add(pre[ui], vi - val[ui]);
tot += vi - val[ui];
val[ui] = vi;
}
else{
scanf("%d", &ui);
root = ui;
}
}
}
return 0;
}

HDU4836 The Query on the Tree(树状数组&&LCA)的更多相关文章

  1. HDU3333 Turing Tree 树状数组+离线处理

    Turing Tree Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  2. gym 100589A queries on the Tree 树状数组 + 分块

    题目传送门 题目大意: 给定一颗根节点为1的树,有两种操作,第一种操作是将与根节点距离为L的节点权值全部加上val,第二个操作是查询以x为根节点的子树的权重. 思路: 思考后发现,以dfs序建立树状数 ...

  3. POJ 3321 Apple Tree(树状数组)

                                                              Apple Tree Time Limit: 2000MS   Memory Lim ...

  4. HDU 3333 - Turing Tree (树状数组+离线处理+哈希+贪心)

    题意:给一个数组,每次查询输出区间内不重复数字的和. 这是3xian教主的题. 用前缀和的思想可以轻易求得区间的和,但是对于重复数字这点很难处理.在线很难下手,考虑离线处理. 将所有查询区间从右端点由 ...

  5. HDU 3333 Turing Tree (树状数组)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3333 题意就是询问区间不同数字的和. 比较经典的树状数组应用. //#pragma comment(l ...

  6. HDU 5869 Different GCD Subarray Query (GCD种类预处理+树状数组维护)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5869 问你l~r之间的连续序列的gcd种类. 首先固定右端点,预处理gcd不同尽量靠右的位置(此时gc ...

  7. POJ--3321 Apple Tree(树状数组+dfs(序列))

    Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 22613 Accepted: 6875 Descripti ...

  8. POJ 3321 Apple Tree 树状数组+DFS

    题意:一棵苹果树有n个结点,编号从1到n,根结点永远是1.该树有n-1条树枝,每条树枝连接两个结点.已知苹果只会结在树的结点处,而且每个结点最多只能结1个苹果.初始时每个结点处都有1个苹果.树的主人接 ...

  9. POJ 3321:Apple Tree 树状数组

    Apple Tree Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 22131   Accepted: 6715 Descr ...

随机推荐

  1. C# Sql 触发器

    触发器是一种特殊类型的存储过程,它不同于之前的我们介绍的存储过程.触发器主要是通过事件进行触发被自动调用执行的.而存储过程可以通过存储过程的名称被调用. Ø 什么是触发器 触发器对表进行插入.更新.删 ...

  2. C++类实现三维数组算法

    在学习北京大学教授的<程序设计实习 / Practice on Programming>中,遇到了一个习题,花了很长时间研究,现在分享出来: 课题地址:https://class.cour ...

  3. SQLserver中idendity的妙用

    假设:现在有产品信息需要入库,要给每个产品按找预定的规则进行编号,编号规则如下: 产品编码:6位产品类型码+1位仓库码+2位年份+5位顺序码(要求从00001开始自增) 6位产品类型码:P00001 ...

  4. 安装Mongodb3.0.6单实例

    [root@b28-17-51 ~]#mkdir -p /export/data [root@b28-17-51 ~]#mkdir -p /export/log [root@b28-17-51 exp ...

  5. 使用工厂bean和Utility Schema定义集合

    工厂bean是实现了beanFactory接口的bean,也可以继承AbstractFactoryBean,主要是用于在给定属性参数之后自动创建一个bean对象. 我们在使用基本集合标记定义集合时,不 ...

  6. iis7应用程序池自动关闭问题解决

    解决: 应用程序池启动32位应用程序 设置托管管道为集成 (仍然有问题) 图片:123.png 访问网站之前 应用程序池是开启的 访问后 网页报503 service unavailable应用程序池 ...

  7. SharePoint 2010 RBS 安装和配置的一些记录

    1.SharePoint 2010 RBS FILESTREAM Provider 的“垃圾收集”: 在SharePoint 中删除上传的文档RBS并不会在文件系统删除文档,理解只是在内容数据库删除了 ...

  8. iOS 进阶 第二十一天(0531)

    0531 - Autolayout 不仅可以做屏幕适配还可以做系统适配 uidynamic 做物理动画.能做的效果如下图: Autolayout Autolayout 是一种“自动布局”技术,专门用来 ...

  9. P1689: [Usaco2005 Open] Muddy roads 泥泞的路

    水题,模拟就行了,别忘了L>=r的时候直接更新下一个的L然后continue type node=record l,r:longint; end; var n,l,i,ans:longint; ...

  10. 微软职位内部推荐-Senior Software Development Engineer H/F

    微软近期Open的职位: Microsoft Engineering Center Paris (Xbox Music et Video) : Ingénieur en développement l ...