Housewife Wind
Housewife Wind
参考博客:POJ2763 Housewife Wind(树剖+线段树)
差不多是直接套线段树+树剖的板子,但是也有一些需要注意的地方
建树:
void build()
{
for( int i=1;i<n;++i)
{
if(dep[e[i][1]]<dep[e[i][0]]) swap(e[i][1],e[i][0]);
update(id[e[i][1]],1,n-1,e[i][2],1);
}
}
单点更新(令某个点为 k,而不是加 k):
void update(int x,int s,int t,int k,int p)
{
if(s==t)
{
d[p]=k;return ;
}
int m=(s+t)>>1;
if(x<=m) update(x,s,m,k,lson);
else update(x,m+1,t,k,rson);
d[p]=d[lson]+d[rson];
}
线段树区间求和:
int getsum(int l,int r,int s,int t,int p)
{
if(l>r) return 0; //记得加上这个,不然会re
if(l<=s&&t<=r) return d[p];
int m=(s+t)>>1;
ll sum=0;
if(l<=m) sum+=getsum(l,r,s,m,lson);
if(r>m) sum+=getsum(l,r,m+1,t,rson);
return sum;
}
树剖区间求和:
int query(int x,int y)
{
ll ans=0;
if(x==y) return 0;
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
ans+=getsum(id[top[x]],id[x],1,n-1,1);
x=f[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
ans+=getsum(id[son[x]],id[y],1,n-1,1); //要记住是son[x]的id到y的id
return ans;
}
代码:
// Created by CAD on 2019/8/13.
#include <algorithm>
#include <cstdio>
#define lson (p<<1)
#define rson ((p<<1)|1)
using namespace std;
#define ll long long
const int maxn=2e5+5;
int dep[maxn],top[maxn],son[maxn],f[maxn],siz[maxn],tot;
int id[maxn],cnt,head[maxn],nxt[maxn],to[maxn];
int d[maxn<<1],n,e[maxn][3];
inline int read() {
int x = 0, w = 1;
char ch = 0;
while (ch < '0' || ch > '9') {
if (ch == '-') w = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9') {
x = x * 10 + (ch - '0');
ch = getchar();
}
return x * w;
}
inline void write(int x) {
static int sta[35];
int top = 0;
do {
sta[top++] = x % 10, x /= 10;
} while (x);
while (top) putchar(sta[--top] + 48);
putchar('\n');
}
void add(int u,int v)
{
nxt[++cnt]=head[u];
head[u]=cnt;
to[cnt]=v;
}
void dfs1(int u,int fa)
{
f[u]=fa;dep[u]=dep[fa]+1;siz[u]=1;
int maxson=-1;
for( int i=head[u];i;i=nxt[i])
{
int v=to[i];if(v==fa) continue;
dfs1(v,u);siz[u]+=siz[v];
if(siz[v]>maxson) maxson=siz[v],son[u]=v;
}
}
void dfs2(int u,int Top)
{
top[u]=Top;id[u]=tot++;
if(!son[u]) return ;
dfs2(son[u],Top);
for( int i=head[u];i;i=nxt[i])
{
int v=to[i];
if(v==f[u]||v==son[u]) continue;
dfs2(v,v);
}
}
void update(int x,int s,int t,int k,int p)
{
if(s==t)
{
d[p]=k;return ;
}
int m=(s+t)>>1;
if(x<=m) update(x,s,m,k,lson);
else update(x,m+1,t,k,rson);
d[p]=d[lson]+d[rson];
}
int getsum(int l,int r,int s,int t,int p)
{
if(l>r) return 0;
if(l<=s&&t<=r) return d[p];
int m=(s+t)>>1;
ll sum=0;
if(l<=m) sum+=getsum(l,r,s,m,lson);
if(r>m) sum+=getsum(l,r,m+1,t,rson);
return sum;
}
void build()
{
for( int i=1;i<n;++i)
{
if(dep[e[i][1]]<dep[e[i][0]]) swap(e[i][1],e[i][0]);
update(id[e[i][1]],1,n-1,e[i][2],1);
}
}
int query(int x,int y)
{
ll ans=0;
if(x==y) return 0;
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
ans+=getsum(id[top[x]],id[x],1,n-1,1);
x=f[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
ans+=getsum(id[son[x]],id[y],1,n-1,1);
return ans;
}
int main()
{
int p,s;
n=read(),p=read(),s=read();
cnt=1,tot=0;
for( int i=1;i<n;++i)
{
e[i][0]=read(),e[i][1]=read(),e[i][2]=read();
add(e[i][0],e[i][1]),add(e[i][1],e[i][0]);
}
dfs1(1,0);dfs2(1,1);
build();
for( int i=1;i<=p;++i)
{
int op,x,y;
op=read();
if(op==0)
x=read(),write(query(x,s)),s=x;
else x=read(),y=read(),update(id[e[x][1]],1,n-1,y,1);
}
}
Housewife Wind的更多相关文章
- Housewife Wind(边权树链剖分)
Housewife Wind http://poj.org/problem?id=2763 Time Limit: 4000MS Memory Limit: 65536K Total Submis ...
- POJ.2763 Housewife Wind ( 边权树链剖分 线段树维护区间和 )
POJ.2763 Housewife Wind ( 边权树链剖分 线段树维护区间和 ) 题意分析 给出n个点,m个询问,和当前位置pos. 先给出n-1条边,u->v以及边权w. 然后有m个询问 ...
- POJ 2763 Housewife Wind LCA转RMQ+时间戳+线段树成段更新
题目来源:POJ 2763 Housewife Wind 题意:给你一棵树 2种操作0 x 求当前点到x的最短路 然后当前的位置为x; 1 i x 将第i条边的权值置为x 思路:树上两点u, v距离为 ...
- POJ 2763 Housewife Wind(树链剖分)(线段树单点修改)
Housewife Wind Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 10378 Accepted: 2886 D ...
- POJ 2763 Housewife Wind(DFS序+LCA+树状数组)
Housewife Wind Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 11419 Accepted: 3140 D ...
- AC日记——Housewife Wind poj 2763
Language: Default Housewife Wind Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 10525 ...
- poj 2763 Housewife Wind(树链拆分)
id=2763" target="_blank" style="">题目链接:poj 2763 Housewife Wind 题目大意:给定一棵 ...
- POJ2763 Housewife Wind 树链剖分 边权
POJ2763 Housewife Wind 树链剖分 边权 传送门:http://poj.org/problem?id=2763 题意: n个点的,n-1条边,有边权 修改单边边权 询问 输出 当前 ...
- B - Housewife Wind POJ - 2763 树剖+边权转化成点权
B - Housewife Wind POJ - 2763 因为树剖+线段树只能解决点权问题,所以这种题目给了边权的一般要转化成点权. 知道这个以后这个题目就很简单了. 怎么转化呢,就把这个边权转化为 ...
随机推荐
- oa_mvc_easyui_分页(4)
1.数据层的编写 NewListInfoDal.cs: GetPageEntityList方法,根据start,end取出数据 --row_number() over()函数查询 LoadEntity ...
- luogu P4365 [九省联考2018]秘密袭击coat
luogu 这里不妨考虑每个点的贡献,即求出每个点在多少个联通块中为第\(k\)大的(这里权值相同的可以按任意顺序排大小),然后答案为所有点权值\(*\)上面求的东西之和 把比这个点大的点看成\(1\ ...
- 企业QQ在线咨询接入
普通QQ在线咨询接入 http://wpa.qq.com/msgrd?v=3&uin=4009603616&site=qq&menu=yes; 企业QQ在线咨询接入 ...
- Swift(三)基本运算符
Swift支持大部分标准C语言的运算符,并且对许多特性进行改进来减少常规编码的错误.除了支持基本运算符外,Swift还提供了2个特殊的运算符,分别是:溢出运算符和区间运算符 首先看下基本运算符 imp ...
- 两种解决springboot 跨域问题的方法示例
两种解决springboot 跨域问题的方法示例,哪种方法看情况而定,自己选择.社会Boolean哥,人狠话不多,直接上代码. 第一种实现方式: 此种方式做全局配置,用起来更方便,但是无法 ...
- Linux课程学习 第二课
工欲善其事,必先利其器 虚拟机安装(链接中有详细的操作方法,这里就不再详细说明了,但有注意事项,会在下文中截图标注) https://www.linuxprobe.com/ 注:为了避免是权限问题导 ...
- oracle 数据库启动停止小结
---登录sqlplus sqlplus /nolog conn / as sysdba shutdown immediate --启动数据库有两种方式 startup 会自动完成重启数据库的所有步 ...
- Java 实现《编译原理》简单-语法分析功能-LL(1)文法 - 程序解析
Java 实现<编译原理>简单-语法分析功能-LL(1)文法 - 程序解析 编译原理学习,语法分析程序设计 (一)要求及功能 已知 LL(1) 文法为: G'[E]: E→TE' E'→+ ...
- 安装theano时候发现报错:cannot install ''numpy'.It is a distutils installed project and thus we cannot ...
发现我安装theano的时候需要numpy需要1.9以上版本,而我之前自带的numpy是1.8版本,所以版本有问题.根本原因是theano需要的numpy版本不符合要求,但是numpy已经安装过了,所 ...
- 三大方面,分析 to B和 to C产品的区别
作为互联网从业者,我们经常听到to B(或2B)和to C(或2C)两个概念.to B即面向企业客户,to C即面向普通用户.只要是互联网人基本都懂知道这两个概念,但如果别人再问“to B和to C产 ...