poj2763
//Accepted 11676 KB 2344 ms /* source:poj2763 time :2015.5.29 by :songt */ /*题解: 树链剖分 基于边权,路径查询 wind第一次在s节点,假如她走到了p节点,那么下次开始的时候他就在p节点 */ #include <cstdio> #include <cstring> ; struct Edge { int u,v; Edge(){} Edge(int u,int v):u(u),v(v){} }edge[*imax_n]; int head[imax_n]; *imax_n]; int tot; void addEdge(int u,int v) { edge[tot]=Edge(u,v); next[tot]=head[u]; head[u]=tot++; } int fa[imax_n],deep[imax_n],num[imax_n],son[imax_n]; int p[imax_n],fp[imax_n],top[imax_n]; int pos; void init() { memset(head,-,sizeof(head)); memset(next,-,sizeof(next)); tot=; memset(son,-,sizeof(son)); pos=; } int s[imax_n]; int cnt_s; int vis[imax_n]; void dfs1(int u) { fa[u]=; deep[u]=; cnt_s=; s[cnt_s++]=u; memset(vis,,sizeof(vis)); while (cnt_s) { ]; if (vis[x]) { cnt_s--; if (x!=u) { num[fa[x]]+=num[x]; || num[fa[x]]<num[x]) son[fa[x]]=x; } continue; } vis[x]=; num[x]=; ;i=next[i]) { int v=edge[i].v; if (v!=fa[x]) { fa[v]=x; deep[v]=deep[x]+; s[cnt_s++]=v; } } } } void dfs2(int u) { top[u]=u; memset(vis,,sizeof(vis)); cnt_s=; s[cnt_s++]=u; while (cnt_s) { ]; if (vis[x]) { cnt_s--; continue ; } vis[x]=; p[x]=pos++; fp[p[x]]=x; ) continue ; ;i=next[i]) { int v=edge[i].v; if (v!=fa[x] && v!=son[x]) { top[v]=v; s[cnt_s++]=v; } } top[son[x]]=top[x]; s[cnt_s++]=son[x]; } } struct Tree { int l,r; long long sum; }f[imax_n*]; void build(int t,int l,int r) { f[t].l=l; f[t].r=r; f[t].sum=; if (l==r) { return ; } ; build(*t,l,mid); build(*t+,mid+,r); } void update(int t,int k,int value) { if (f[t].l==k && f[t].r==k) { f[t].sum=value; return ; } ; *t,k,value); *t+,k,value); f[t].sum=f[*t].sum+f[*t+].sum; } long long query(int t,int l,int r) { if (f[t].l==l && f[t].r==r) { return f[t].sum; } ; *t,l,r); else { *t+,l,r); *t,l,mid)+query(*t+,mid+,r); } } void swap(int &a,int &b) { int t=a; a=b; b=t; } long long find(int u,int v) { int f1=top[u],f2=top[v]; ; while (f1!=f2) { if (deep[f1]<deep[f2]) { swap(f1,f2); swap(u,v); } sum+=query(,p[f1],p[u]); u=fa[f1]; f1=top[u]; } if (u==v) return sum; if (deep[u]>deep[v]) swap(u,v); sum+=query(,p[son[u]],p[v]); return sum; } ]; int n,m; int res; int main() { ) //scanf("%d%d%d",&n,&m,&res); { init(); ;i<n-;i++) { scanf(],&e[i][],&e[i][]); addEdge(e[i][],e[i][]); addEdge(e[i][],e[i][]); } dfs1(); dfs2(); build(,,pos-); ;i<n-;i++) { ]]<deep[e[i][]]) swap(e[i][],e[i][]); update(,p[e[i][]],e[i][]); } int kind; int u,v; ;i<m;i++) { scanf("%d",&kind); ) { scanf("%d",&u); printf("%lld\n",find(u,res)); res=u; } else { scanf("%d%d",&u,&v); update(,p[e[u-][]],v); } } } ; }
poj2763的更多相关文章
- 【lct】poj2763 Housewife Wind
题意:给你一棵树,边带权,支持两种操作:修改某条边的权值:查询两点之间的最短路. lct主要实现单点修改和路径和. 修改x结点的值只需将x Splay到其所在辅助树的根,然后修改其值,再maintai ...
- poj2763(树链剖分 - 边权)
poj2763 题意 给定一个树形图,某人原来在 s 点,每条边(路)有通过的时间花费,有两种操作:1. 查询某人到 u 点花费的时间 2. 更新某条路的时间花费. 分析 权值在边上,可以把它们 &q ...
- POJ2763 Housewife Wind 树链剖分 边权
POJ2763 Housewife Wind 树链剖分 边权 传送门:http://poj.org/problem?id=2763 题意: n个点的,n-1条边,有边权 修改单边边权 询问 输出 当前 ...
- POJ2763 Housewife Wind
Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 9701 Accepted: 2661 Description Aft ...
- poj2763 树链剖分(线段树)
注意这里都是把边放到线段树中,所以lca的时候,要注意如果top[x]==top[y] && x==y 的时候已经完成了. 仔细想想边和点的不同之处!!! #include<ma ...
- POJ2763 Housewife Wind(DFS序)
题目:单边修改,树链查询. 这题是边权,不是点权,不过也可以看作是点权. 然后其实就和BZOJ2819一样. #include<cstdio> #include<cstring> ...
- poj2763(树链剖分)
题目链接:http://poj.org/problem?id=2763 题意:定一棵带边权的树,要求支持两种操作:1)询问树中某两点间的距离. 2)修改某条边的权值. 分析:树链剖分,边权修改,路径求 ...
- 树链剖分——边权poj2763
边权操作起来也和点权一样,只要把边的权值映射到点上即可,要注意的地方是向上爬的过程中和点权不太一样,还有个特判(WA了几次..) 完整代码 #include<cstring> #inclu ...
- poj2763树链剖分边权+区间和
自己写的比原来的板子常数小了不少嘻嘻,边权处理起来比点权要复杂一下 由于根节点没有被映射的边,其被访问到的顺序是0,直接排除在线段树外 #include<iostream> #includ ...
随机推荐
- android APK更新
菜鸟的博客请多多指教 最近做了一个新功能,更新APK的功能 1.更新APK是一个耗时的任务,我采用了一个服务来做,上次在网上看到服务是在主线程里面,自己也测试了下,数据是真的 所以下载动作还必须在服务 ...
- C3P0的两种使用方法
方法一: package C3P0; import java.sql.Connection; import java.sql.SQLException; import java.bea ...
- Java数组扩容算法及Java对它的应用
1)Java数组对象的大小是固定不变的,数组对象是不可扩容的.利用数组复制方法可以变通的实现数组扩容.System.arraycopy()可以复制数组.Arrays.copyOf()可以简便的创建数组 ...
- 删除Kafka的topic
刚接触Kafka,开始认为删除一个topic只是运行一下Kafka-topic.sh的delete命令就行了,但是,事实却不是这样,会出现两种情况:(1) 如果topic没有使用过即没有传输过消息,可 ...
- 学习笔记找到多个具有相同 ID“_header”的控件,FindControl 要求控件具有唯一的 ID.
解决 找到多个具有相同 ID“_header”的控件,FindControl 要求控件具有唯一的 ID. private void DisplayHotBooks() { //获取 ...
- java 复制字串算法
public class Copy { public static void copy(char[] s, char[] t){ int i=0; for(i=0; i<s.length; i+ ...
- C#对.CSV格式的文件--逗号分隔值文件 的读写操作及上传ftp服务器操作方法总结
前言 公司最近开发需要将数据保存到.csv文件(逗号分隔值 文件)中然后上传到ftp服务器上,供我们系统还有客户系统调用,之前完全没有接触过这个,所以先来看看百度的解释:逗号分隔值(Comma-Sep ...
- spider_text
__author__ = 'sus'import urllibimport urllib2import re def getPage(url): #获取网页 request = urll ...
- sql基础语句(技巧)
1.压缩数据库 dbcc shrinkdatabase(dbname) 2.转移数据库给新用户已存在用户权限 exec sp_change_users_login'update_one','newga ...
- solution to E: failed to fetch .......
There are some issues today for me that my desktop can't boot as I expected, I installed windows 8.1 ...