bzoj 4765: 普通计算姬
来源:互联网 发布:递归算法理解 编辑:程序博客网 时间:2024/04/30 06:26
题意:
求树上一段连续编号的子树大小的和,带修改。
题解:
分块。
预处理一个东西
然后就可以暴力搞了。
对于零散的点,就用树状数组维护dfs序的区间和。
貌似是
还有以后打代码尽量注意,少递归,少递归,少递归!
最后要用
code:
#include<cmath>#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#define LL unsigned long longusing namespace std;struct node{ int y,next;}a[200010];int len=0,last[100010];int pre[100010],n,m,g[100010][350],d[100010],rt;int ys[100010],z=0,la[100010],ri[350];LL tr[100010],f[350];int read(){ int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f;}void ins(int x,int y){ a[++len].y=y; a[len].next=last[x];last[x]=len;}int lowbit(int x){return x&(-x);}void change(int x,int k){ for(int i=x;i<=n;i+=lowbit(i)) tr[i]+=(LL)k;}LL get(int x){ LL ans=0; for(int i=x;i>=1;i-=lowbit(i)) ans+=tr[i]; return ans;}void dfs(int x,int fa){ ys[x]=la[x]=++z; for(int i=1;i<=pre[n];i++) g[x][i]=g[fa][i]; g[x][pre[x]]++; for(int i=last[x];i;i=a[i].next) { int y=a[i].y; if(y==fa) continue; dfs(y,x); la[x]=la[y]; }}int main(){ n=read();m=read(); for(int i=1;i<=n;i++) d[i]=read(); for(int i=1;i<=n;i++) { int x,y;x=read();y=read(); if(x==0) rt=y; else ins(x,y),ins(y,x); } int len=sqrt(n); for(int i=1;i<=n;i++) { pre[i]=i/len+1; if(pre[i]!=pre[i-1]) ri[pre[i-1]]=i-1; } //for(int i=1;i<=pre[n];i++) dfs(rt,0,i,0); dfs(rt,0); for(int i=1;i<=n;i++) { change(ys[i],d[i]); for(int j=1;j<=pre[n];j++) f[j]+=(LL)d[i]*(LL)g[i][j]; } ri[pre[n]]=n; while(m--) { int op;op=read(); if(op==1) { int x,c;x=read();c=read(); change(ys[x],c-d[x]); for(int i=1;i<=pre[n];i++) f[i]+=(LL)(c-d[x])*(LL)g[x][i]; d[x]=c; } else { int l,r;l=read();r=read(); int k=l;LL ans=0; while(k<=r) { if((k==1||pre[k]!=pre[k-1])&&ri[pre[k]]<=r) ans+=f[pre[k]],k=ri[pre[k]]; else ans+=(get(la[k])-get(ys[k]-1)); k++; } printf("%llu\n",ans); } }}
阅读全文
1 0
- bzoj 4765: 普通计算姬
- [分块] BZOJ 4765 普通计算姬
- bzoj 4765: 普通计算姬 分块
- BZOJ 4765 普通计算姬(分块表+树状数组)
- BZOJ 4765: 普通计算姬 分块+树状数组
- bzoj 4765: 普通计算姬(分块+树状数组)
- bzoj 4765: 普通计算姬(分块 dfs序)
- 4765: 普通计算姬
- [BZOJ Contest-2017省队十连测推广赛1·T1][BZOJ4765][分块][dfs序]普通计算姬
- 【BZOJ】【P3224】【普通平衡树】
- bzoj 3224 普通平衡树
- bzoj 3224 普通平衡树
- BZOJ 3224, 普通平衡树
- BZOJ 3224 普通平衡树
- BZOJ 3224 普通平衡树
- 【BZOJ 3224】普通平衡树
- 【BZOJ 3224】普通平衡树
- BZOJ 3224 普通二叉树
- 操作系统实验一(进程管理)
- C++ 双向链表的实现
- 学习move _base包
- python安装后无法使用idle
- 阿婆家的ORACLE事务大全
- bzoj 4765: 普通计算姬
- 九度OJ——1113二叉树
- Android中颜色设置
- 迭代器使用图解和原理解析
- XListView
- 刷在线笔试题的网站
- Tomcat 内存溢出对应解决方式
- 定期删除elasticsearch集群10天以上的索引
- 减肥这事是个大事