codechef T6 Pishty and tree dfs序+线段树
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序+线段树的更多相关文章
- POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)
POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和) 题意分析 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根 ...
- POJ3321 - Apple Tree DFS序 + 线段树或树状数组
Apple Tree:http://poj.org/problem?id=3321 题意: 告诉你一棵树,每棵树开始每个点上都有一个苹果,有两种操作,一种是计算以x为根的树上有几个苹果,一种是转换x这 ...
- poj 3321 Apple Tree dfs序+线段树
Apple Tree Time Limit: 2000MS Memory Limit: 65536K Description There is an apple tree outsid ...
- 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 ...
- CodeForces 620E:New Year Tree(dfs序+线段树)
E. New Year Treetime limit per test3 secondsmemory limit per test256 megabytesinputstandard inputout ...
- codeforces 620E. New Year Tree dfs序+线段树+bitset
题目链接 给一棵树, 每个节点有颜色, 两种操作, 一种是将一个节点的子树全都染色成c, 一种是查询一个节点的子树有多少个不同的颜色, c<=60. 每个节点一个bitset维护就可以. #in ...
- Codeforces 343D Water Tree(DFS序 + 线段树)
题目大概说给一棵树,进行以下3个操作:把某结点为根的子树中各个结点值设为1.把某结点以及其各个祖先值设为0.询问某结点的值. 对于第一个操作就是经典的DFS序+线段树了.而对于第二个操作,考虑再维护一 ...
- 【cf343】D. Water Tree(dfs序+线段树)
传送门 题意: 给出一个以\(1\)为根的有根树,起始每个结点都为\(0\),现在有三种操作: 1.将\(v\)及\(v\)的子树都置为\(1\): 2.将\(v\)及其所有的祖先都置为\(0\): ...
- Educational Codeforces Round 6 E dfs序+线段树
题意:给出一颗有根树的构造和一开始每个点的颜色 有两种操作 1 : 给定点的子树群体涂色 2 : 求给定点的子树中有多少种颜色 比较容易想到dfs序+线段树去做 dfs序是很久以前看的bilibili ...
随机推荐
- 在Linux上进行mySql安装部署及遇到的问题的解决方法
前提: Linux centOS虚拟机64位 1.首先确认是否已安装过MySQL 方法一:删除原有的MySQL目录: 使用查找语句: whereis mysql find / -name mysql ...
- Linux-Shell脚本编程-学习-2-Linux基本命令
接上篇,接着学习Linux下的部分命令,后面的这些命令用到的频率可能没有那么多,不过也是经常需要的. 第一部分:程序监测部分,ps和top top命令可能比较眼熟,所以我们先说ps ps命令最烦人了, ...
- 在Kotlin上怎样用Mockito2 mock final 类(KAD 23)
作者:Antonio Leiva 时间:Mar 2, 2017 原文链接:https://antonioleiva.com/mockito-2-kotlin/ 如我们在前面文章中谈到的,Kotlin最 ...
- 数据库学习(四)with as (补充 nvl 和 count 函数)
with as 的专业解释我这就不详细说明了,我这就梳理下我自己的实践应用,就是根据某个条件查询出结果集放在一个临时表里面,可以创建多个临时表,然后再从这些临时表中查询出要的数据. 参考资料:http ...
- 图的同构 (Graph Isomorphism)
整理摘自:https://www.jianshu.com/p/c33b5d1b4cd9 同构是在数学对象之间定义的一类映射,它能揭示出在这些对象的属性或者操作之间存在的关系.若这两个数学结构之间存在同 ...
- LeetCode 237 ——删除链表中的结点
1. 题目 2. 解答 因为给定的只有一个待删除的结点指针,我们并不知道其前面结点,所以需要将待删除结点后面的结点值复制到前面结点去,然后指向其后的第二个结点即可. /** * Definition ...
- mysql分布式技术
所有的分布式技术 dobble zokkiper ngix
- 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 ...
- STL应用——hdu1412(set)
set函数的应用 超级水题 #include <iostream> #include <cstdio> #include <algorithm> #include ...
- Week2 Teamework from Z.XML - 必应缤纷桌面助手 - 软件分析与用户需求调查
软件分析与用户需求调查(2013) from Z.XML 本次团队作业要求: 通过定性, 定量地分析, 总结和评定某软件是否满足了目标用户的需求,并把分析的过程和结果用博客表达出来. 选题:必应缤纷桌 ...