zzuli 1916
来源:互联网 发布:同花顺扩展数据管理器 编辑:程序博客网 时间:2024/04/30 14:39
1916: F
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 214 Solved: 15
SubmitStatusWeb Board
Description
给一颗树,有n个结点,编号为1到n,1为根节点,有两种操作,1 x y把x结点权值加y,2 x查询x到根节点所有结点的权值和.
每个结点权值初始化为0。
Input
第一行输入一个整数t,代表有t组测试数据。
每组数据第一行为两个整数n,m代表结点个数和操作次数。
接下来n-1行,每行两个整数a,b,表示a结点和b结点有一条边。
接下来m行每行一个操作格式如上。
0<=n<=50000 ,0<=m<=50000,0<=y<=50000
Output
对于每组查询输出一个整数表示结果
Sample Input
1
5 5
1 2
1 3
3 4
3 5
2 5
1 1 2
1 3 1
2 4
2 1
5 5
1 2
1 3
3 4
3 5
2 5
1 1 2
1 3 1
2 4
2 1
Sample Output
0
3
2
HINT
这题用线段树,内部操作太复杂易超时,用树状数组循环简化了复杂度;
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <bits/stdc++.h>
using namespace std;
const int N = 500100;
vector<int>G[N];
void init(int n);
void add(int x,int y);
long long query(int x);
void dfs(int u);
long long s[N], e[N], sum[N];
int cnt;
int lowbit(int k)
{
return k&-k;
}
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
int n, m, num, x, y;
scanf("%d %d", &n, &m);
init(n);
for(int i=1;i<n;i++)
{
scanf("%d %d",&x, &y);
if(x<y)
{
G[x].push_back(y);
}
else
{
G[y].push_back(x);
}
}
cnt=1;
dfs(1);
memset(sum,0,sizeof(sum));
for(int i=0;i<m;i++)
{
scanf("%d", &num);
if(num==1)
{
scanf("%d %d",&x, &y);
add(s[x],y);
add(e[x],-y);
}
else
{
scanf("%d", &x);
printf("%lld\n",query(s[x]));
}
}
}
return 0;
}
void dfs(int u)
{
int len=G[u].size();
s[u]=cnt++;
for(int i=0;i<len;i++)
{
int v=G[u][i];
dfs(v);
}
e[u]=cnt++;
}
void add(int x,int y)
{
while(x<=cnt)
{
sum[x]+=y;
x+=lowbit(x);
}
return ;
}
void init(int n)
{
for(int i=0;i<=n;i++)
{
G[i].clear();
}
return ;
}
long long query(int x)
{
long long ans=0;
while(x)
{
ans+=sum[x];
x-=lowbit(x);
}
return ans;
}
#include <cstring>
#include <cstdio>
#include <vector>
#include <bits/stdc++.h>
using namespace std;
const int N = 500100;
vector<int>G[N];
void init(int n);
void add(int x,int y);
long long query(int x);
void dfs(int u);
long long s[N], e[N], sum[N];
int cnt;
int lowbit(int k)
{
return k&-k;
}
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
int n, m, num, x, y;
scanf("%d %d", &n, &m);
init(n);
for(int i=1;i<n;i++)
{
scanf("%d %d",&x, &y);
if(x<y)
{
G[x].push_back(y);
}
else
{
G[y].push_back(x);
}
}
cnt=1;
dfs(1);
memset(sum,0,sizeof(sum));
for(int i=0;i<m;i++)
{
scanf("%d", &num);
if(num==1)
{
scanf("%d %d",&x, &y);
add(s[x],y);
add(e[x],-y);
}
else
{
scanf("%d", &x);
printf("%lld\n",query(s[x]));
}
}
}
return 0;
}
void dfs(int u)
{
int len=G[u].size();
s[u]=cnt++;
for(int i=0;i<len;i++)
{
int v=G[u][i];
dfs(v);
}
e[u]=cnt++;
}
void add(int x,int y)
{
while(x<=cnt)
{
sum[x]+=y;
x+=lowbit(x);
}
return ;
}
void init(int n)
{
for(int i=0;i<=n;i++)
{
G[i].clear();
}
return ;
}
long long query(int x)
{
long long ans=0;
while(x)
{
ans+=sum[x];
x-=lowbit(x);
}
return ans;
}
0 0
- zzuli 1916
- zzuli 1916 (晴天 树 )
- zzuli 1530
- zzuli 1731
- zzuli 1895
- zzuli 1904
- zzuli D
- zzuli-1919
- zzuli 1921
- zzuli 1922
- zzuli 1919
- zzuli 1895
- 一棵树呀一棵树~~~zzuli
- zzuli 2133
- ZZULI-OJ1001
- zzuli-oj1002
- zzuli 2132
- zzuli 2177
- 二叉树的镜像 (剑指offer)!!!(两个有序链表的合并,链表的逆置)
- 招聘面试程序员的一些心得
- 循环队列操作代码
- JDBC:JDBC的事务支持
- QQ使用了什么通讯协议?为什么要这样做?为什么采用 UDP 协议,而不采用 TCP 协议实现?
- zzuli 1916
- 存储映射I/O
- sed 语法深入
- git使用
- poj 2546 Circular Area
- SQL UNION 和 UNION ALL 操作符的区别
- 两村共饮一井水
- 关于String、StringBuffer、StringBuilder的区别
- FFmpeg参数说明