PSHTTR: Pishty 和城堡
题目描述 Pishty 是生活在胡斯特市的一个小男孩。胡斯特是胡克兰境内的一个古城,以其中世纪风格 的古堡和非常聪明的熊闻名全国。 胡斯特的镇城之宝是就是这么一座古堡,历史上胡斯特依靠这座古堡抵挡住了疯人国的大军。 对于 Pishty 来说,真正吸引他的是古堡悠长的走廊和高耸的钟楼,以及深藏于其中的秘密…… 古堡可以用一棵 N 个节点的树的描述,树中有 N −1 条无向边,每条边有一个魔法数字 C。 当一个旅游团参观古堡时,他们会选择树上 U 到 V 的路径游览。他们认为,如果一条边的魔 法数字不超过 K,那么这条边是有趣的。而一条路径的吸引力就是路径上所有有趣的边的魔法数 字的异或和。 胡克兰的国王希望大力发展旅游业,因此他下令求出所有旅游团的游览路径的吸引力。而 Pishty立志成为国王身边的骑士,便自告奋勇承担了这一任务。但旅游团实在太多了,他也算不过 来。所以,请你帮Pishty解决这一问题:给定 M 个旅游团的旅游路径,请你求出路径的吸引力。
输入格式
输入的第一行包含一个整数 T,代表测试数据的组数。接下来是 T 组数据。 每组数据的第一行包含一个整数 N,代表树的节点个数。 接下来 N −1 行,每行描述一条边。每行包含三个整数 U,V,C,代表节点 U 和 V 之间连有 一条魔法数字为 C 的边。 接下来一行包含一个整数 M,代表旅游团的数量。 接下来 M 行,每行包含三个整数 U,V,K,描述一个旅游团。
输出格式
对于每个旅游团,输出一行,包含一个整数,代表其路径的吸引力。
数据范围和子任务 • 1 ≤ T ≤ 5 • 1 ≤ N,M ≤ 105
• 1 ≤ U,V ≤ N • 1 ≤ C,K ≤ 109
子任务 1(10 分): • 1 ≤ N,M ≤ 10
子任务 2(20 分): • 1 ≤ N,M ≤ 103
子任务 3(70 分): • 无附加限制
样例数据
输入

1

5

1 2 1

2 3 2

2 4 5

3 5 10
6

5 4 5

5 4 10

5 4 1

1 2 1

4 1 10

1 5 8

输出

7

13

0

1

4

3

首先我们要了解异或的三个性质

1.a^b=b^a
2.(a^b)^c=a^(b^c)
3.a^a=0

这样之后我们可以发现 两个点之间路径的异或和可以转换 成两个点到根节点的异或和的值 异或起来就是答案

我们可以强制一为根 然后根据dfs序记录每个点包含的区间(也就是他在树上的子树范围) 方便做区间处理

然后我们可以离线处理答案 把答案按限制大小从小到达排一波 每次把符合的边插进去 找到这条边两个端点深度较深的那个点

注意一定是深度较深 也就是在树上位置较下边的点 这个画图很容易证明

然后把他包含的区间(也就是树上他的子树)进行一波区间异或也就是lazy 然后单点查询就可以啦

这道题调了很久 最后发现是sort的时候反向边的相对位置发生了改变 mdzz

最后贴一波代码咯

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int M=<<;
int read(){
int ans=,f=,c=getchar();
while(c<''||c>''){if(c=='-') f=-; c=getchar();}
while(c>=''&&c<=''){ans=ans*+(c-''); c=getchar();}
return ans*f;
}
int T,n,m;
int L,R,W,top;
int cnt,cnt2,first[M],deep[M];
struct node{int to,from,next,w;}e[*M],e1[*M];
bool cmp1(node a,node b){return a.w>b.w;}
void ins(int a,int b,int w){cnt++; e[cnt].from=a; e[cnt].to=b; e[cnt].w=w; e[cnt].next=first[a]; first[a]=cnt;}
void insert(int a,int b,int w){ins(a,b,w); ins(b,a,w);}
struct note{int u,v,w,pos;}q[M];
bool cmp2(note a,note b){return a.w<b.w;}
int l[M],r[M],sum;
int v[*M],ans[M];
void prepare(){
cnt2=cnt=; memset(first,,sizeof(first));
L=; R=; W=;
sum=; memset(v,,sizeof(v));
memset(deep,,sizeof(deep)); deep[]=;
}
void dfs(int x){
l[x]=++sum;
for(int i=first[x];i;i=e[i].next){
int now=e[i].to;
if(!deep[now]) deep[now]=deep[x]+,dfs(now);
}
r[x]=sum;
}
void down(int x,int l,int r){
if(l==r) return ;
int k=v[x]; v[x]=;
v[x<<]^=k; v[x<<^]^=k;
}
void push_add(int x,int l,int r){
if(L<=l&&r<=R){
v[x]^=W;
return ;
}
if(l==r) return ;
if(v[x]) down(x,l,r);
int mid=(l+r)>>;;
if(L<=mid) push_add(x<<,l,mid);
if(R>mid) push_add(x<<^,mid+,r);
}
int find(int x,int l,int r,int k){
if(l==r) return v[x];
int mid=(l+r)>>;
if(v[x]) down(x,l,r);
if(k<=mid) return find(x<<,l,mid,k);
else return find(x<<^,mid+,r,k);
}
int main()
{
int x,y,w;
T=read();
while(T--){
prepare();
n=read();
for(int i=;i<n;i++){
x=read(),y=read(),w=read(),insert(x,y,w);
cnt2++; e1[cnt2].to=y; e1[cnt2].from=x; e1[cnt2].w=w;
}
dfs(); //for(int i=1;i<=n;i++) printf("[%d %d]\n",l[i],r[i]);
top=cnt2; sort(e1+,e1++cnt2,cmp1); //printf("[%d]\n",cnt);
m=read(); for(int i=;i<=m;i++) q[i].u=read(),q[i].v=read(),q[i].w=read(),q[i].pos=i;
sort(q+,q++m,cmp2); //for(int i=1;i<=m;i++) printf("[%d %d %d]\n",q[i].u,q[i].v,q[i].w);
//for(int i=1;i<=cnt;i++) printf("[%d %d %d]\n",e[i].from,e[i].to,e[i].w);
for(int i=;i<=m;i++){
int mx=q[i].w;
while(top&&e1[top].w<=mx){
x=e1[top].from; y=e1[top].to; w=e1[top].w; //printf("[%d %d %d] %d\n",x,y,w,top);
top--;//printf("%d\n",top);
if(deep[x]<deep[y]) swap(x,y);
L=l[x]; R=r[x]; W=w; //printf("%d %d %d\n",L,R,W);
push_add(,,n);
}//printf("~~~\n");
int sum1=find(,,n,l[q[i].u]),sum2=find(,,n,l[q[i].v]);
ans[q[i].pos]=sum1^sum2;
}
for(int i=;i<=m;i++) printf("%d\n",ans[i]);
}
return ;
}

codechef T6 Pishty and tree dfs序+线段树的更多相关文章

  1. POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)

    POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和) 题意分析 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根 ...

  2. POJ3321 - Apple Tree DFS序 + 线段树或树状数组

    Apple Tree:http://poj.org/problem?id=3321 题意: 告诉你一棵树,每棵树开始每个点上都有一个苹果,有两种操作,一种是计算以x为根的树上有几个苹果,一种是转换x这 ...

  3. poj 3321 Apple Tree dfs序+线段树

    Apple Tree Time Limit: 2000MS   Memory Limit: 65536K       Description There is an apple tree outsid ...

  4. Codeforces Round #225 (Div. 2) E. Propagating tree dfs序+-线段树

    题目链接:点击传送 E. Propagating tree time limit per test 2 seconds memory limit per test 256 megabytes inpu ...

  5. CodeForces 620E:New Year Tree(dfs序+线段树)

    E. New Year Treetime limit per test3 secondsmemory limit per test256 megabytesinputstandard inputout ...

  6. codeforces 620E. New Year Tree dfs序+线段树+bitset

    题目链接 给一棵树, 每个节点有颜色, 两种操作, 一种是将一个节点的子树全都染色成c, 一种是查询一个节点的子树有多少个不同的颜色, c<=60. 每个节点一个bitset维护就可以. #in ...

  7. Codeforces 343D Water Tree(DFS序 + 线段树)

    题目大概说给一棵树,进行以下3个操作:把某结点为根的子树中各个结点值设为1.把某结点以及其各个祖先值设为0.询问某结点的值. 对于第一个操作就是经典的DFS序+线段树了.而对于第二个操作,考虑再维护一 ...

  8. 【cf343】D. Water Tree(dfs序+线段树)

    传送门 题意: 给出一个以\(1\)为根的有根树,起始每个结点都为\(0\),现在有三种操作: 1.将\(v\)及\(v\)的子树都置为\(1\): 2.将\(v\)及其所有的祖先都置为\(0\): ...

  9. Educational Codeforces Round 6 E dfs序+线段树

    题意:给出一颗有根树的构造和一开始每个点的颜色 有两种操作 1 : 给定点的子树群体涂色 2 : 求给定点的子树中有多少种颜色 比较容易想到dfs序+线段树去做 dfs序是很久以前看的bilibili ...

随机推荐

  1. 在Linux上进行mySql安装部署及遇到的问题的解决方法

    前提: Linux centOS虚拟机64位 1.首先确认是否已安装过MySQL 方法一:删除原有的MySQL目录: 使用查找语句: whereis mysql find / -name mysql ...

  2. Linux-Shell脚本编程-学习-2-Linux基本命令

    接上篇,接着学习Linux下的部分命令,后面的这些命令用到的频率可能没有那么多,不过也是经常需要的. 第一部分:程序监测部分,ps和top top命令可能比较眼熟,所以我们先说ps ps命令最烦人了, ...

  3. 在Kotlin上怎样用Mockito2 mock final 类(KAD 23)

    作者:Antonio Leiva 时间:Mar 2, 2017 原文链接:https://antonioleiva.com/mockito-2-kotlin/ 如我们在前面文章中谈到的,Kotlin最 ...

  4. 数据库学习(四)with as (补充 nvl 和 count 函数)

    with as 的专业解释我这就不详细说明了,我这就梳理下我自己的实践应用,就是根据某个条件查询出结果集放在一个临时表里面,可以创建多个临时表,然后再从这些临时表中查询出要的数据. 参考资料:http ...

  5. 图的同构 (Graph Isomorphism)

    整理摘自:https://www.jianshu.com/p/c33b5d1b4cd9 同构是在数学对象之间定义的一类映射,它能揭示出在这些对象的属性或者操作之间存在的关系.若这两个数学结构之间存在同 ...

  6. LeetCode 237 ——删除链表中的结点

    1. 题目 2. 解答 因为给定的只有一个待删除的结点指针,我们并不知道其前面结点,所以需要将待删除结点后面的结点值复制到前面结点去,然后指向其后的第二个结点即可. /** * Definition ...

  7. mysql分布式技术

    所有的分布式技术 dobble zokkiper ngix

  8. POJ 1703 Find them, Catch them(并查集拓展)

    Description The police office in Tadu City decides to say ends to the chaos, as launch actions to ro ...

  9. STL应用——hdu1412(set)

    set函数的应用 超级水题 #include <iostream> #include <cstdio> #include <algorithm> #include ...

  10. Week2 Teamework from Z.XML - 必应缤纷桌面助手 - 软件分析与用户需求调查

    软件分析与用户需求调查(2013) from Z.XML 本次团队作业要求: 通过定性, 定量地分析, 总结和评定某软件是否满足了目标用户的需求,并把分析的过程和结果用博客表达出来. 选题:必应缤纷桌 ...