博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
树链剖分【p3038】[USACO11DEC]牧草种植Grass Planting
阅读量:5103 次
发布时间:2019-06-13

本文共 2468 字,大约阅读时间需要 8 分钟。

img

表示看不太清.

概括题意

树上维护区间修改与区间和查询.

很明显树剖裸题,切掉,细节处错误T了好久 TAT

代码

#include
#include
#include
#include
#define int long long#define R register#define ls o<<1#define rs o<<1|1#define N 500008using namespace std;inline void in(int &x){ int f=1;x=0;char s=getchar(); while(!isdigit(s)){if(s=='-')f=-1;s=getchar();} while(isdigit(s)){x=x*10+s-'0';s=getchar();} x*=f;}int n,m,head[N],tot,f[N],son[N],size[N],depth[N];struct cod{int u,v;}edge[N<<2];inline void add(int x,int y){ edge[++tot].u=head[x]; edge[tot].v=y; head[x]=tot;}void dfs1(int u,int fa){ f[u]=fa;depth[u]=depth[fa]+1;size[u]=1; for(R int i=head[u];i;i=edge[i].u) { if(edge[i].v==fa)continue; dfs1(edge[i].v,u); size[u]+=size[edge[i].v]; if(son[u]==-1 or size[son[u]]
>1; tg[ls]+=tg[o];tg[rs]+=tg[o]; tr[ls]+=(mid-l+1)*tg[o]; tr[rs]+=(r-mid)*tg[o]; tg[o]=0; }}void change(int o,int l,int r,int x,int y,int z){ if(x<=l and y>=r) { tr[o]+=(r-l+1)*z; tg[o]+=z; return; } down(o,l,r); int mid=(l+r)>>1; if(x<=mid)change(ls,l,mid,x,y,z); if(y>mid)change(rs,mid+1,r,x,y,z); up(o);}int query(int o,int l,int r,int x,int y){ if(x<=l and y>=r)return tr[o]; down(o,l,r); int mid=(l+r)>>1,res=0; if(x<=mid)res+=query(ls,l,mid,x,y); if(y>mid)res+=query(rs,mid+1,r,x,y); return res;}inline void tchange(int x,int y,int z){ int fx=top[x],fy=top[y]; while(fx!=fy) { if(depth[fx]>depth[fy]) { change(1,1,idx,dfn[fx],dfn[x],z); x=f[fx]; } else { change(1,1,idx,dfn[fy],dfn[y],z); y=f[fy]; } fx=top[x],fy=top[y]; } if(x==y)return; if(dfn[x]>dfn[y])swap(x,y); change(1,1,idx,dfn[x]+1,dfn[y],z);}inline int tquery(int x,int y){ int fx=top[x],fy=top[y],res=0; while(fx!=fy) { if(depth[fx]>depth[fy]) { res+=query(1,1,idx,dfn[fx],dfn[x]); x=f[fx]; } else { res+=query(1,1,idx,dfn[fy],dfn[y]); y=f[fy]; } fx=top[x],fy=top[y]; } if(x==y)return res; if(dfn[x]>dfn[y])swap(x,y); res+=query(1,1,idx,dfn[x]+1,dfn[y]); return res;}char s[10];signed main(){ in(n),in(m);memset(son,-1,sizeof son); for(R int i=1,x,y;i

转载于:https://www.cnblogs.com/-guz/p/9806680.html

你可能感兴趣的文章
小记:xml画一个爱心。
查看>>
MySQL表的四种分区类型
查看>>
7.26
查看>>
dll--二进制层面的复用
查看>>
linux 压缩/解压缩/打包命令
查看>>
守护进程
查看>>
CLR 关于强命名程序集 .
查看>>
[BZOJ 3489] A simple rmq problem 【可持久化树套树】
查看>>
如何制作并更改项目icon文件
查看>>
设计模式:迭代器模式(Iterator)
查看>>
cmd批处理常用符号详解
查看>>
关于给构造函数传达参数方法
查看>>
mysql忘记密码时如何修改root用户密码
查看>>
STM32单片机使用注意事项
查看>>
在linux中出现there are stopped jobs 的解决方法
查看>>
获取浏览器版本信息
查看>>
SQLServer之删除视图
查看>>
js forEach跳出循环
查看>>
MyBatis---动态SQL
查看>>
快速创建一个 spring mvc 示例
查看>>