bzoj 4372 烁烁的游戏——动态点分治+树状数组
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4372
和 bzoj 3070 震波 是一个套路。注意区间修改的话,树状数组不能表示 dis = 0 的位置,所以要手动改父亲的点权数组。
#include<cstdio> #include<cstring> #include<algorithm> #include<vector> #define ll long long using namespace std; const int N=1e5+5,K=20; int n,w[N],hd[N],xnt,to[N<<1],nxt[N<<1],siz[N],rt,mn; int pre[N][K],dep[N],dis[N][K],fs[N],gs[N]; vector<ll> f[N],g[N]; bool vis[N]; int rdn() {int ret=0;bool fx=1;char ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-')fx=0;ch=getchar();}while(ch>='0'&&ch<='9')ret=ret*10+ch-'0',ch=getchar();return fx?ret:-ret; } int Mx(int a,int b){return a>b?a:b;} int Mn(int a,int b){return a<b?a:b;} void add(int x,int y){to[++xnt]=y;nxt[xnt]=hd[x];hd[x]=xnt;} void add(int cr,int x,int k){for(x=Mn(x,fs[cr]);x;x-=(x&-x))f[cr][x]+=k;} ll qry(int cr,int x){ll ret=0;for(;x&&x<=fs[cr];x+=(x&-x))ret+=f[cr][x];return ret;} void addx(int cr,int x,int k){for(x=Mn(x,gs[cr]);x;x-=(x&-x))g[cr][x]+=k;} ll qryx(int cr,int x){ll ret=0;for(;x&&x<=gs[cr];x+=(x&-x))ret+=g[cr][x];return ret;} void getrt(int cr,int fa,int s) {siz[cr]=1;int mx=0;for(int i=hd[cr],v;i;i=nxt[i])if(!vis[v=to[i]]&&v!=fa){getrt(v,cr,s);siz[cr]+=siz[v];mx=Mx(mx,siz[v]);}mx=Mx(mx,s-siz[cr]); if(mx<mn)mn=mx,rt=cr; } void dfs(int cr,int fa,int ds) {pre[cr][++dep[cr]]=rt;dis[cr][dep[cr]]=ds;for(int i=hd[cr],v;i;i=nxt[i])if(!vis[v=to[i]]&&v!=fa)dfs(v,cr,ds+1); } void init(int cr,int s) {vis[cr]=1;fs[cr]=mn;gs[cr]=(mn<<1)+1;f[cr].resize(fs[cr]+1);g[cr].resize(gs[cr]+1);dfs(cr,0,0);for(int i=hd[cr],v;i;i=nxt[i])if(!vis[v=to[i]]){int ts=(siz[v]<siz[cr]?siz[v]:s-siz[cr]);mn=N;getrt(v,cr,ts);init(rt,ts);} } void mdfy(int cr,int d,int k) {add(cr,d,k); w[cr]+=k;for(int i=dep[cr]-1;i;i--){if(dis[cr][i]>d)continue;add(pre[cr][i],d-dis[cr][i],k); w[pre[cr][i]]+=k;/////addx(pre[cr][i+1],d-dis[cr][i],k);} } ll query(int cr) {ll ret=w[cr];for(int i=dep[cr]-1;i;i--){ret+=qry(pre[cr][i],dis[cr][i]);ret-=qryx(pre[cr][i+1],dis[cr][i]);}return ret; } int main() {n=rdn(); int Q=rdn();for(int i=1,u,v;i<n;i++)u=rdn(),v=rdn(),add(u,v),add(v,u);mn=N;getrt(1,0,n);init(rt,n);int x,d,k;char ch[5];while(Q--){scanf("%s",ch);x=rdn();if(ch[0]=='Q')printf("%lld\n",query(x));else{d=rdn(); k=rdn(); mdfy(x,d,k);}}return 0; }
转载于:https://www.cnblogs.com/Narh/p/10187308.html
bzoj 4372 烁烁的游戏——动态点分治+树状数组相关推荐
- bzoj 4372 烁烁的游戏 —— 动态点分治+树状数组
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4372 本以为和 bzoj3730 一样,可以直接双倍经验了: 但要注意一下,树状数组不能查询 ...
- bzoj 4372: 烁烁的游戏 动态点分治_树链剖分_线段树
[Submit][Status][Discuss] Description 背景:烁烁很喜欢爬树,这吓坏了树上的皮皮鼠. 题意: 给定一颗n个节点的树,边权均为1,初始树上没有皮皮鼠. 烁烁他每次会跳 ...
- 【BZOJ-3730】震波 动态点分治 + 树状数组
3730: 震波 Time Limit: 15 Sec Memory Limit: 256 MB Submit: 626 Solved: 149 [Submit][Status][Discuss] ...
- BZOJ - 2244 拦截导弹 (dp,CDQ分治+树状数组优化)
BZOJ - 2244 拦截导弹 (dp,CDQ分治+树状数组优化) 1 #include<algorithm> 2 #include<iostream> 3 #include ...
- P4093-[HEOI2016/TJOI2016]序列【CDQ分治,树状数组】
正题 题目链接:https://www.luogu.com.cn/problem/P4093 题目大意 nnn个数字,每次有一个数字可能和原序列不同,但最多只有一个不同. 求所有情况下都满足的最长不降 ...
- BZOJ.3648.寝室管理(点分治 树状数组)
BZOJ \(Description\) 求在一棵树上加一条边后,有多少条至少有\(k\)个点的路径. \(n\leq10^5\). \(Solution\) 对于一棵树的情况,可以点分治. 用树状数 ...
- BZOJ 1176: [Balkan2007]Mokia( CDQ分治 + 树状数组 )
考虑cdq分治, 对于[l, r)递归[l, m), [m, r); 然后计算[l, m)的操作对[m, r)中询问的影响就可以了. 具体就是差分答案+排序+离散化然后树状数组维护.操作数为M的话时间 ...
- CDQ分治 + 树状数组 ---- C. Goodbye Souvenir(三维偏序+思维)
题目链接 题目大意: 给定长度为nnn的数组, 定义数字XXX在[l,r][l,r][l,r]内的值为数字XXX在[l,r][l,r][l,r]内最后一次出现位置的下标减去第一次出现位置的下标 给定m ...
- 点分治 + 树状数组 ---- E. Close Vertices(点分治 + 二维数点)
题目链接 题目大意: 给出一棵树,问有多少条路径权值和不大于www,长度不大于lll 解题思路: 首先树上路径问题大概率就是点分治了 但是我们对于每个路径有两个性质就是(li,wi)(l_i,w_i) ...
最新文章
- exchange online share mailbox senditem
- vs 2017 建立 php,程序在VS 2017中输出的结果为什么是这样的?求助大神!谢谢!...
- 在HTML中嵌入PHP代码,有以下几种方法,其中错误的是( )
- C/C++函数名修饰约定
- 【LeetCode笔记】102. 二叉树的层序遍历(Java、队列、DFS)
- html标题前圆圈样式,漂亮的css3圆形鼠标悬停效果实例
- iOS 14不跳票 6月见!苹果WWDC 2020将在线上举办:33年来首次
- 深观察|区块链不是洪水猛兽,但要警惕以区块链之名圈钱
- java mongo 日期范围_获取指定日期和它之前几天,之间的所有日期?千万不要踩了这个大坑!...
- 对于Linux安装mysql5.7版本出现的问题
- 盘点前端HTML基础知识
- Go基础系列:接口类型断言和type-switch
- 常用实用网站整理大全
- 获取KVM虚拟机IP地址
- 有意思、值得思考的文章记录
- python处理FITS 3:处理头文件和数据单元
- jmeter如何进行一个简单的测试(超级详细,有图有文字,闭着眼都能成功)
- 想哭!我相信“官方”消息,炒币仍然被骗
- 网站被恶意刷流量解决方案
- m基于MATLAB的上行链路MIMO关键技术的研究与性能分析