树链剖分X2
1.ZJOI树的统计
板子题 因为初始化没打改了几个小时 改到双腿软着出的机房(身体素质感人
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#define maxn 300000
#define ls x<<1
#define rs x<<1|1
using namespace std;
,v[maxn],top[maxn],son[maxn],fa[maxn],de[maxn],w[maxn],z,tree1[maxn],tree2[maxn],sz[maxn];
];
struct eg
{
int to;
int nxt;
}b[maxn];
void link(int x,int y)
{
b[++tot].nxt=head[x];
b[tot].to=y;
head[x]=tot;
}
void dfs1(int x,int f)
{
sz[x]=,fa[x]=f;
;i=b[i].nxt)
{
int t=b[i].to;
if (t==f) continue;
de[t]=de[x]+;
dfs1(t,x);
sz[x]+=sz[t];
||sz[son[x]]<sz[t]) son[x]=t;
}
}
void dfs2(int x,int tp)
{
top[x]=tp,w[x]=++z;
) dfs2(son[x],tp);
else return ;
;i=b[i].nxt)
{
int t=b[i].to;
if (t!=fa[x]&&t!=son[x]) dfs2(t,t);
}
}
void build(int x,int l,int r)
{
tree2[x]=,tree1[x]=-;
if (l==r) return ;
;
build (ls,l,mid);
build (rs,mid+,r);
}
void updata(int x,int l,int r,int d,int y)
{
if (l==r&&l==d)
{
tree1[x]=y;
tree2[x]=y;
return ;
}
;
if (d<=mid)updata(ls,l,mid,d,y);
,r,d,y);
tree1[x]=max(tree1[ls],tree1[rs]);
tree2[x]=tree2[ls]+tree2[rs];
}
int qsum(int x,int l,int r,int ll,int rr)
{
if (ll==l&&r==rr) return tree2[x];
;
,r,ll,rr);
else if (rr<=mid) return qsum(ls,l,mid,ll,rr);
,r,mid+,rr);
}
int qmax(int x,int l,int r,int ll,int rr)
{
if (ll==l&&r==rr) return tree1[x];
;
if (rr<=mid) return qmax(ls,l,mid,ll,rr);
,r,ll,rr);
,r,mid+,rr));
}
int find(int x,int y,int flag)
{
)
{
;
int f1=top[x],f2=top[y];
while(f1!=f2)
{
if(de[f1]<de[f2]) swap(f1,f2),swap(x,y);
ans=max(ans,qmax(,,z,w[f1],w[x]));
x=fa[f1],f1=top[x];
}
if (de[x]>de[y]) swap(x,y);
,,z,w[x],w[y]));
}
)
{
;
int f1=top[x],f2=top[y];
while (f1!=f2)
{
if(de[f1]<de[f2]) swap(f1,f2),swap(x,y);
ans+=qsum(,,z,w[f1],w[x]);
x=fa[f1],f1=top[x];
}
if (de[x]>de[y]) swap(x,y);
,,z,w[x],w[y]);
}
}
int main()
{
memset(head, -, sizeof(head));
memset(son, -, sizeof(son));
scanf ("%d",&n);
;i<n;++i)
{
int x,y;
scanf ("%d%d",&x,&y);
link(x,y);
link(y,x);
}
;i<=n;++i)
scanf ("%d",&v[i]);
de[]=;
dfs1(,);
dfs2(,);
build(,,z);
;i<=n;++i) updata(,,z,w[i],v[i]);
int q;
scanf("%d",&q);
;i<=q;++i)
{
scanf ("%s",s);
int x,y;
scanf ("%d%d",&x,&y);
]=='C')
updata(,,z,w[x],y);
]=='M')
printf());
]=='S')
printf());
}
;
}
2.HAOI树上操作
这一次是被数组大小给困住了 好不容易反应过来开大了tree的大小结果我没有开大lazy的??(黑人问号
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#define N 100002
#define LL long long
#define ls x<<1
#define rs x<<1|1
using namespace std;
,df=;
*N],to[*N],nxt[*N],dfn[N];
int sz[N],tp[N],son[N],de[N],fa[N],ed[N];
LL tree[*N],v[N],lazy[*N];
void link(int x,int y)
{
nxt[++tot]=head[x];
to[tot]=y;
head[x]=tot;
}
void dfs(int x)
{
sz[x]=;
for (int i=head[x];i;i=nxt[i])
{
int t=to[i];
if (t==fa[x]) continue;
de[t]=de[x]+;
fa[t]=x;
dfs(t);
sz[x]+=sz[t];
if (sz[t]>sz[son[x]]) son[x]=t;
}
}
void dfs1(int x,int top)
{
dfn[x]=++df,tp[x]=top;
if (son[x]) dfs1(son[x],top);
for (int i=head[x];i;i=nxt[i])
{
int t=to[i];
if (t==fa[x]||t==son[x]) continue;
dfs1(t,t);
}
ed[x]=df;
}
void down (int x,int l,int r)
{
;
tree[ls]+=lazy[x]*(mid-l+);
tree[rs]+=lazy[x]*(r-mid);
lazy[ls]+=lazy[x];
lazy[rs]+=lazy[x];
lazy[x]=;
}
void update(int x,int l,int r,int ll,int rr,LL w)
{
if (l!=r) down(x,l,r);
if (ll<=l&&r<=rr)
{
tree[x]+=w*(r-l+);
lazy[x]=w;
return ;
}
;
if (ll<=mid) update(ls,l,mid,ll,rr,w);
,r,ll,rr,w);
tree[x]=tree[ls]+tree[rs];
}
LL query(int x,int l,int r,int ll,int rr)
{
if (l!=r) down(x,l,r);
if (ll<=l&&r<=rr) return tree[x];
;
LL ans=;
if (ll<=mid) ans+=query(ls,l,mid,ll,rr);
,r,ll,rr);
return ans;
}
LL lca(int x)
{
LL ans=;
)
{
ans+=query(,,n,dfn[tp[x]],dfn[x]);
x=fa[tp[x]];
}
ans+=query(,,n,,dfn[x]);
return ans;
}
int main()
{
scanf ("%d%d",&n,&m);
;i<=n;++i) scanf ("%lld",&v[i]);
;i<n;++i)
{
int x,y;
scanf ("%d%d",&x,&y);
link(x,y);
link(y,x);
}
de[]=;
dfs(),dfs1(,);
;i<=n;++i) update(,,n,dfn[i],dfn[i],v[i]);
;i<=m;++i)
{
//cout<<query(1,1,n,dfn[2],dfn[2])<<"**"<<endl;
;
scanf ("%d",&fl);
)
{
int x,a;
scanf ("%d%d",&x,&a);
update(,,n,dfn[x],dfn[x],a);
}
)
{
int x,a;
scanf ("%d%d",&x,&a);
update(,,n,dfn[x],ed[x],a);
}
)
{
int x;
scanf ("%d",&x);
printf("%lld\n",lca(x));
}
}
;
}
最后再带上第一次在考试中(又是基本没学的状态下考的)遇到的树剖题
qtree系列中的一道
然而这个是强行lca做的 效果好像还可以啊
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#define maxn 50000
using namespace std;
,he[maxn],nxt[maxn],to[maxn],di[maxn],de[maxn],dis[maxn];
bool vis[maxn];
];
];
void link(int x,int y,int dis)
{
nxt[++tot]=he[x];
to[tot]=y;
di[tot]=dis;
he[x]=tot;
}
void dfs(int u)
{
vis[u]=;
for (int i=he[u];i;i=nxt[i])
{
int t=to[i];
if (vis[t]) continue;
f[t][]=u;
de[t]=de[u]+;
dis[t]=di[i];
dfs(t);
}
}
void ff()
{
;i<=));++i)
;j<=n;++j)
f[j][i]=f[f[j][i-]][i-];
}
int lca(int x,int y)
{
;
if (de[x]<de[y]) swap(x,y);
int q=de[x]-de[y];
,yy;
;(<<i)<=n;++i)
<<i)) x=f[x][i];
])
ans=max(ans,dis[i]);
//cout<<ans<<"&&"<<endl;
if (x==y) return ans;
xx=x,yy=y;
));i>=;i--)
{
if (f[x][i]!=f[y][i])
x=f[x][i],y=f[y][i];
}
//cout<<x<<" "<<y<<"**"<<endl;
];i=f[i][])
ans=max(ans,dis[i]);
];i=f[i][])
ans=max(ans,dis[i]);
return ans;
}
int main()
{
scanf ("%d",&n);
;i<n;++i)
{
int x,y,r;
scanf ("%d%d%d",&x,&y,&r);
link(x,y,r);
link(y,x,r);
}
de[]=;
dfs();
ff();
)
{
scanf ("%s",s);
]=='D') break;
]=='C')
{
int x,y;
scanf("%d%d",&x,&y);
*x],yy=to[*x-];
//cout<<xx<<" "<<yy<<"&&"<<endl;
]==yy) dis[xx]=y;
]==xx) dis[yy]=y;
}
]=='Q')
{
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",lca(x,y));
}
}
;
}
树链剖分X2的更多相关文章
- 【BZOJ-3553】三叉神经树 树链剖分
3553: [Shoi2014]三叉神经树 Time Limit: 160 Sec Memory Limit: 256 MBSubmit: 347 Solved: 112[Submit][Stat ...
- Codeforces Round #329 (Div. 2) D. Happy Tree Party LCA/树链剖分
D. Happy Tree Party Bogdan has a birthday today and mom gave him a tree consisting of n vertecie ...
- Codeforces Round #329 (Div. 2) D. Happy Tree Party 树链剖分
D. Happy Tree Party Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/593/p ...
- 3553: [Shoi2014]三叉神经树(树链剖分)
这道题特别恶心,首先我们可以发现更改的就是出现连续的一或二,那么就用线段树+树链剖分找到这个范围 想到是不难想,就是打起来恶心罢了= = CODE: #include<cstdio> #i ...
- D. Happy Tree Party CodeForces 593D【树链剖分,树边权转点权】
Codeforces Round #329 (Div. 2) D. Happy Tree Party time limit per test 3 seconds memory limit per te ...
- BZOJ 3626: [LNOI2014]LCA [树链剖分 离线|主席树]
3626: [LNOI2014]LCA Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2050 Solved: 817[Submit][Status ...
- BZOJ 1984: 月下“毛景树” [树链剖分 边权]
1984: 月下“毛景树” Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 1728 Solved: 531[Submit][Status][Discu ...
- codevs 1228 苹果树 树链剖分讲解
题目:codevs 1228 苹果树 链接:http://codevs.cn/problem/1228/ 看了这么多树链剖分的解释,几个小时后总算把树链剖分弄懂了. 树链剖分的功能:快速修改,查询树上 ...
- 并查集+树链剖分+线段树 HDOJ 5458 Stability(稳定性)
题目链接 题意: 有n个点m条边的无向图,有环还有重边,a到b的稳定性的定义是有多少条边,单独删去会使a和b不连通.有两种操作: 1. 删去a到b的一条边 2. 询问a到b的稳定性 思路: 首先删边考 ...
随机推荐
- LSF-SCNN:一种基于 CNN 的短文本表达模型及相似度计算的全新优化模型
欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 本篇文章是我在读期间,对自然语言处理中的文本相似度问题研究取得的一点小成果.如果你对自然语言处理 (natural language proc ...
- linux grep 从入门到精通
linux grep 从入门到精通 一.初级 搜索日志 grep "186" catalina.out 在新输出日志中监听固定字符串 tail -f catalina.out | ...
- NYOJ-2359: 巴什博弈?
2359: 巴什博弈? 时间限制: 1 Sec 内存限制: 30 MB 提交: 263 解决: 55 [提交][状态][讨论版] 题目描述 有n个石子,有两人轮流从中取石子,最少a个最多b个,谁没 ...
- 数据库服务器---Tps
事务处理系统:Transactionprocessingsystems(TPS) 提高事务处理效率与保证其正确性 在数据(信息)发生处将它们记录下来 通过OLTP产生新的信息 将信息保存到数据库中供其 ...
- 基于‘BOSS直聘的招聘信息’分析企业到底需要什么样的PHP程序员
原文地址:http://www.jtahstu.com/blog/scrapy_zhipin_php.html 基于'BOSS直聘的招聘信息'分析企业到底需要什么样的PHP程序员 标签(空格分隔): ...
- Codeforces 817F MEX Queries
题意:对一个维护三种操作:1.将[l..r]中的数全部加入集合中.2.将集合中[l..r]范围内的数删去.3.将集合中在[l..r]中的数删去,并将之前不在集合中的数加入集合 考虑到最近线段树总是写爆 ...
- HTMLCSS实现左侧固定宽度右侧内容可滚动
在做移动端页面的时候,经常会碰到一个div中分左右两个div,左侧div固定宽度或百分比,右侧div中内容左右溢出,需要左右滑动才可以浏览到全部内容,为此写了一个demo. 处理这个问题的核心关键点是 ...
- Linux 进程间通信(包含一个经典的生产者消费者实例代码)
前言:编写多进程程序时,有时不可避免的需要在多个进程之间传递数据,我们知道,进程的用户的地址空间是独立,父进程中对数据的修改并不会反映到子进程中,但内核是共享的,大多数进程间通信方式都是在内核中建立一 ...
- Python爬虫(十九)_动态HTML介绍
JavaScript JavaScript是网络上最常用也是支持者对多的客户端脚本语言.它可以收集用户的跟踪数据,不需要重载页面直接提交表单,在页面嵌入多媒体文件,甚至运行网页游戏. 我们可以在网页源 ...
- hibernate5(9)注解映射[1]多对一单向关联
在博客站点中,我们可能须要从某一篇文章找到其所关联的作者.这就须要从文章方建立起对用户的关联,即是多对一的映射关系. 如今先看一个配置实例:我们的文章实体类 package com.zeng.mode ...