cf1076E Vasya and a Tree (线段树)
我的做法:
给询问按$deep[v]+d$排序,每次做到某一深度的时候,先给这个深度所有点的值清0,然后直接改v的子树
官方做法比较妙妙:
dfs,进入v的时候给$[deep[v],deep[v]+d]+=x$,出来的时候再减回来
日常忘开longlong,这回事变量开了输出没开
#pragma GCC optimize(3)
#include<bits/stdc++.h>
#define pa pair<ll,ll>
#define CLR(a,x) memset(a,x,sizeof(a))
using namespace std;
typedef long long ll;
const int maxn=3e5+; inline char gc(){
return getchar();
static const int maxs=<<;static char buf[maxs],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,,maxs,stdin),p1==p2)?EOF:*p1++;
}
inline ll rd(){
ll x=;char c=gc();bool neg=;
while(c<''||c>''){if(c=='-') neg=;c=gc();}
while(c>=''&&c<='') x=(x<<)+(x<<)+c-'',c=gc();
return neg?(~x+):x;
} struct Q{
int p,d,x;
};
int N,M,mdep,eg[maxn*][],egh[maxn],ect;
int dfn[maxn][],tot,dep[maxn];
vector<int> poi[maxn];
vector<Q> que[maxn];
ll v[maxn<<],laz[maxn<<]; inline void adeg(int a,int b){
eg[++ect][]=b,eg[ect][]=egh[a],egh[a]=ect;
} inline void dfs(int x,int f){
dfn[x][]=++tot;mdep=max(mdep,dep[x]);
poi[dep[x]].push_back(x);
for(int i=egh[x];i;i=eg[i][]){
int b=eg[i][];if(b==f) continue;
dep[b]=dep[x]+;dfs(b,x);
}
dfn[x][]=tot;
} inline void pushdown(int p){
if(!laz[p]) return;
int a=p<<,b=p<<|;
laz[a]+=laz[p],v[a]+=laz[p];
laz[b]+=laz[p],v[b]+=laz[p];
laz[p]=;
} inline void add(int p,int l,int r,int x,int y,int z){
if(x<=l&&r<=y){
v[p]+=z,laz[p]+=z;
}else{
int m=l+r>>;
pushdown(p);
if(x<=m) add(p<<,l,m,x,y,z);
if(y>=m+) add(p<<|,m+,r,x,y,z);
}
} inline void change(int p,int l,int r,int x,int y){
if(l==r) v[p]=y;
else{
int m=l+r>>;pushdown(p);
if(x<=m) change(p<<,l,m,x,y);
else change(p<<|,m+,r,x,y);
}
} ll ans[maxn];
inline void query(int p,int l,int r){
if(l==r) ans[l]=v[p];
else{
pushdown(p);
int m=l+r>>;
query(p<<,l,m);query(p<<|,m+,r);
}
} int main(){
//freopen("","r",stdin);
int i,j,k;
N=rd();
for(i=;i<N;i++){
int a=rd(),b=rd();
adeg(a,b);adeg(b,a);
}M=rd();
dep[]=;dfs(,);
for(i=;i<=M;i++){
Q q;
q.p=rd(),q.d=rd(),q.x=rd();
que[min(dep[q.p]+q.d,mdep)].push_back(q);
}
for(i=;i<=mdep;i++){
for(j=;j<poi[i].size();j++) change(,,N,dfn[poi[i][j]][],);
for(j=;j<que[i].size();j++){
int p=que[i][j].p;
add(,,N,dfn[p][],dfn[p][],que[i][j].x);
}
}
query(,,N);
for(i=;i<=N;i++)
printf("%I64d ",ans[dfn[i][]]);
return ;
}
cf1076E Vasya and a Tree (线段树)的更多相关文章
- CF 1076E Vasya and a Tree(线段树+树剖)
传送门 解题思路 首先按照每个修改时\(x\)的深度\(+d\)从大到小排序,然后按照深度分层,一层一层的修改,修改的时候就直接暴力修改子树,然后每做完一层把答案都取下来,因为以后的所有修改的深度都小 ...
- Codeforces 1107G Vasya and Maximum Profit 线段树最大子段和 + 单调栈
Codeforces 1107G 线段树最大子段和 + 单调栈 G. Vasya and Maximum Profit Description: Vasya got really tired of t ...
- BZOJ.3307.雨天的尾巴(dsu on tree/线段树合并)
BZOJ 洛谷 \(dsu\ on\ tree\).(线段树合并的做法也挺显然不写了) 如果没写过\(dsu\)可以看这里. 对修改操作做一下差分放到对应点上,就成了求每个点子树内出现次数最多的颜色, ...
- HDU 3333 Turing Tree (线段树)
Turing Tree Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- CodeForces 620E New Year Tree(线段树的骚操作第二弹)
The New Year holidays are over, but Resha doesn't want to throw away the New Year tree. He invited h ...
- HDU 3333 Turing Tree 线段树+离线处理
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3333 Turing Tree Time Limit: 6000/3000 MS (Java/Othe ...
- CF Edu54 E. Vasya and a Tree DFS+树状数组
Vasya and a Tree 题意: 给定一棵树,对树有3e5的操作,每次操作为,把树上某个节点的不超过d的子节点都加上值x; 思路: 多开一个vector记录每个点上的操作.dfs这颗树,同时以 ...
- 【UOJ388】配对树(dsu on tree+线段树)
传送门 题意: 给出一颗含有\(n\)个结点的无根树,之后给出一个长度为\(m\)的序列,每个元素在\([1,n]\)之间. 现在序列中每个长度为偶数的区间的完成时间定义为树上最小配对方法中每对匹配点 ...
- 【cf375】D. Tree and Queries(dsu on tree+线段树)
传送门 题意: 给出一颗以\(1\)为根的有根树,每个结点有个颜色\(c_i\). 之后要回答\(m\)组询问,每组询问包含\(v_i,k_i\),要回答以\(v_i\)为根的子树中,颜色出现次数不小 ...
随机推荐
- CodeForces Round #550 Div.3
http://codeforces.com/contest/1144 A. Diverse Strings A string is called diverse if it contains cons ...
- python文件封装成*.exe文件(单文件和多文件)
环境:win10 64位 python3.7 单*.py文件打包Python GUI:程序打包为exe 一.安装Pyinstaller,命令pip install Pyinstaller,(大写的P ...
- java程序员一些初中级面试题(数据库部分)
说出一些数据库优化方面的经验? 1.从JDBC编程的角度讲,用PreparedStatement一般来说比Statement性能高,因为在使用时,SQL语句被预编译并存储在PreparedStatem ...
- a标签中的onclick和href的使用
onclick和href 链接的 onclick 事件被先执行,其次是 href 属性下的动作(页面跳转,或 javascript 伪链接): 假设链接中同时存在 href 与 onclick,如果 ...
- [转帖]Windows 内核说明
来源:https://zhidao.baidu.com/question/398191459.html 自己的理解. windows 的内核文件 是在 c:\windows\system32 目录下面 ...
- vue页面传参和接参
https://blog.csdn.net/zhouzuoluo/article/details/81259298(copy) js** this.$router.push({ name: 'Flow ...
- java回调机制——基本理解
回调(diao):往回调用,反向调用. 英文 call back.call:调用,back:返回,往返. 回调的意思就是杀个回马枪...... 回调(callback),既然是往回调用,那自然有一个正 ...
- phpstorm显示页面不停的在indexing转圈中,并且文件名还一直在刷新
打开 File下的 Invalidate Caches / Restart...下的 Invalidate and Restart. 便可以了 ......
- 安装使用阿里云的yum源
CentOS 1.备份(备份本地Yum源) mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak 2.下 ...
- 从git中删除 .idea 目录
将.idea目录加入ignore清单: $ echo '.idea' >> .gitignore 从git中删除idea: $ git rm —cached -r .idea 3 将. ...