HDU 5274(树链剖分)
树链剖分第一题QAQ,纪念下
#pragma comment(linker, "/STACK:102400000,102400000")
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
typedef long long ll;
const ll mod = 1e9 + 7;
const int maxn = 1e5 + 10;
#define to first
#define next second
#define foreach(it,v) for(__typeof(v.begin()) it = v.begin(); it != v.end(); ++it)
int pos[maxn],head[maxn],fa[maxn],son[maxn];
int a[maxn],siz[maxn],root[maxn],dep[maxn];
typedef pair<int,int> Edge;
Edge edges[maxn<<1];
int e,tot;
void AddEdge(int u,int v)
{
edges[++e] = make_pair(v,head[u]);head[u] = e;
edges[++e] = make_pair(u,head[v]);head[v] = e;
}
void pre(int u)
{
siz[u] = 1;son[u] = 0;
dep[u] = dep[fa[u]] + 1;
for(int i = head[u]; i ; i = edges[i].next) {
int v = edges[i].to;
if(v == fa[u])continue;
fa[v] = u;
pre(v);
siz[u] += siz[v];
if(siz[son[u]] < siz[v]) son[u] = v;
}
}
void built(int u,int t)
{
root[u] = t;
pos[u] = ++tot;
if(son[u] < 1) return;
built(son[u],t);
for(int i = head[u]; i ; i = edges[i].next) {
int v = edges[i].to;
if(v == fa[u] || v == son[u])continue;
built(v,v);
}
}
int seg[maxn<<2];
int ql,qr,x,v;
void Modify(int o,int L,int R)
{
if(L == R) {
seg[o] = v;
return ;
}
int mid = (L+R)>>1;
if(x<=mid) Modify(o<<1,L,mid);
else Modify(o<<1|1,mid+1,R);
seg[o] = seg[o<<1] ^ seg[o<<1|1];
}
int Queryseg(int o,int L,int R)
{
if(ql<=L&&qr>=R) return seg[o];
int mid = (L+R) >> 1;
int res = 0;
if(ql <= mid) res = Queryseg(o<<1,L,mid);
if(qr > mid) res ^= Queryseg(o<<1|1,mid+1,R);
return res;
}
int solve(int u,int v)
{
int res = 0;
while(root[u] != root[v]) {
if(dep[root[u]] < dep[root[v]]) swap(u,v);
ql = pos[root[u]],qr = pos[u];
res ^= Queryseg(1,1,tot);
u = fa[root[u]];
}
ql = pos[u],qr = pos[v];
if(ql > qr) swap(ql,qr);
res ^= Queryseg(1,1,tot);
return res;
}
int main(int argc, char const *argv[])
{
int T;scanf("%d",&T);
while(T--) {
int N,Q;scanf("%d%d",&N,&Q);
dep[0] = e = tot = 0;
memset(seg,0,sizeof seg);
memset(head,0,sizeof(head[0])*(N+1));
for(int i = 1; i < N; i++) {
int u,v;scanf("%d%d",&u,&v);
AddEdge(u,v);
}
fa[1] = siz[0] = 0;
pre(1);
built(1,1);
for(int i = 1; i <= N; i++) {
scanf("%d",&v); ++v; x = pos[i];
Modify(1,1,tot);
}
while(Q--) {
int op;scanf("%d",&op);
if(op==0) {
scanf("%d%d",&x,&v);x = pos[x]; ++v;
Modify(1,1,tot);
} else {
scanf("%d%d",&ql,&qr);
int ans = solve(ql,qr);
printf("%d\n", ans - 1);
}
}
}
return 0;
}
HDU 5274(树链剖分)的更多相关文章
- hdu 5274 树链剖分
Dylans loves tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Othe ...
- hdu 5893 (树链剖分+合并)
List wants to travel Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/O ...
- hdu 5052 树链剖分
Yaoge’s maximum profit Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/ ...
- hdu 4897 树链剖分(重轻链)
Little Devil I Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others ...
- HDU 3966 (树链剖分+线段树)
Problem Aragorn's Story (HDU 3966) 题目大意 给定一颗树,有点权. 要求支持两种操作,将一条路径上的所有点权值增加或减少ai,询问某点的权值. 解题分析 树链剖分模板 ...
- hdu 3966(树链剖分+线段树区间更新)
传送门:Problem 3966 https://www.cnblogs.com/violet-acmer/p/9711441.html 学习资料: [1]线段树区间更新:https://blog.c ...
- HDU 3966 /// 树链剖分+树状数组
题意: http://acm.hdu.edu.cn/showproblem.php?pid=3966 给一棵树,并给定各个点权的值,然后有3种操作: I x y z : 把x到y的路径上的所有点权值加 ...
- hdu 4729 树链剖分
思路:这个树链剖分其实还是比较明显的.将边按权值排序后插入线段树,然后用线段树查找区间中比某个数小的数和,以及这样的数的个数.当A<=B时,就全部建新的管子. 对于A>B的情况比较 建一条 ...
- hdu 3966 树链剖分
思路:树链剖分入门题,我这门入得好苦啊,程序很快写出来了,可是在LCA过程中把update函数里的左右边界位置写反了,一直RE到死. #pragma comment(linker, "/ST ...
随机推荐
- dsadm-dsconf数据导入导出
cd instance-path/ds6/bin #注意黄色参数修改为跟实际环境一致 -c,--accept-cert Does not ask for confirmation before a ...
- intent-filter data Uri 意图过滤器 详解
组件的intent-filter属性 如果一个 Intent 请求在一片数据(Uri)上执行一个动作(Action), Android 如何知道哪个应用程序的哪个组件能用来响应这个请求 ...
- QueryFilter与SpatialFilter - 浅谈
我们知道,GIS不仅仅有属性查询,还有空间查询.而 QueryFilter 对应于 属性查询,而 SpatialFilter 对应于 空间查询.
- UIButton上图片和文字的位置调整
UIButton 上默认是图片在左文字在右,而大多数情况这样默认的的显示形式都不能满足我们的需求,接下来我就这个问题分享一下我的心得. 默认情况下,不设置的效果,都是居中实现 UIButton *bu ...
- Codeforces Round #278 (Div. 1)
A A monster is attacking the Cyberland! Master Yang, a braver, is going to beat the monster. Yang an ...
- 扩展编写jquery插件的方法
比如要扩展验证功能(jquery.validate.js)中的 messages: { required: "This field is required.", remote: & ...
- HTML5屏幕适配标签设置
开发HTML5游戏中,我们常用的一些mata标签: <meta name="viewport" content="width=device-width, initi ...
- 分享QQ第三方登陆SDK
主要是考虑到QQ的PHP SDK写的真是太烂了,纯属是普及API知识,而不是到手就可以部署的类库..反正自己都写了一个了,就拿出来分享下.. 什么也不多说,直接上代码. Qq_sdk.php < ...
- IE下兼容Css+HTML5
/*! HTML5 Shiv vpre3.6 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed Uncompressed source: h ...
- NSNotificationCenter基础知识
NSNotificationCenter基础知识 Notification的工作机制 1.对应用程序中其他地方发生的事件(比如增加一条数据库记录)感兴趣的对象,会向通告中心(Notificatio ...