Problem Code: PSHTTR Add problem to Todo list Submit Tweet

2024-04-10 03:58

本文主要是介绍Problem Code: PSHTTR Add problem to Todo list Submit Tweet,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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
1
July Challenge 2017
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

树剖裸题

//下次遇到这种小于等于k的题,可以考虑转离线然后一个指针暴扫加入。 
%:pragma GCC optimize(3)
using namespace std;
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define forw(i,x) for(int i=fir[x];i;i=ne[i])
#define lowbit(x) (x&(-x))
#define N 1000001
#define  getmid int mid=(L[no]+R[no])>>1;
#define lc no<<1
#define rc no<<1|1
#define pu(no) S[no]=S[lc]^S[rc]
int L[N],R[N],S[N];
//for segment tree
void build(int l,int r,int no)
{L[no]=l;R[no]=r;if(l==r){S[no]=0;return;}getmid;build(l,mid,lc);build(mid+1,r,rc);pu(no);
}
void chg(int no,int v,int x)
{if(L[no]==R[no]){S[no]=v;return;}getmid;if(x>mid) chg(rc,v,x);else chg(lc,v,x);pu(no);
}
int query(int no,int l,int r)
{if(L[no]==l&&R[no]==r) {return S[no];}getmid;if(l>r) return 0;if(l>mid) return query(rc,l,r);if(r<=mid) return query(lc,l,r);return query(lc,l,mid)^query(rc,mid+1,r);
}
struct edge{int id,C,from,to;
}xx[N];
bool cmp(edge a,edge b)
{return a.C<b.C;
}
int fir[N],ne[N],to[N];
int opt;
int n,m,tot,cnt;
int id[N],top[N];
int fa[N],gs[N];
int x,y,z;
int de[N],ans[N];
void add(int x,int y,int z)
{ne[++cnt]=fir[x];fir[x]=cnt;to[cnt]=y;
}
void ADD(int x,int y,int z)
{add(x,y,z);add(y,x,z);xx[++opt].C=z;xx[opt].from=x;xx[opt].to=y;
}
struct Query{int u,v,k,id;
}Q[N];
bool c(Query x,Query y)
{return x.k<y.k;
}
void dfs(int x,int f)
{de[x]=de[f]+1;fa[x]=f;S[x]=1;int tt=-1;gs[x]=0;forw(i,x){int V=to[i];if(V==f) continue;dfs(V,x);S[x]+=S[V];if(S[V]>tt){tt=S[V];gs[x]=V;}}return;
}
void getpos(int x,int sp)
{id[x]=++tot;top[x]=sp;if(gs[x]==0) return;getpos(gs[x],sp);forw(i,x){int V=to[i];if(V!=fa[x]&&V!=gs[x]){getpos(V,V);}}
}
int query_sum(int u,int v)
{int f1=top[u],f2=top[v];int ans=0;while(f1!=f2){if(de[f1]<de[f2]){swap(f1,f2);swap(u,v);}ans^=query(1,id[f1],id[u]);//坑点,下次要注意 u=fa[f1];f1=top[u];}if(de[u]<de[v]){swap(f1,f2);swap(u,v);}return ans^=query(1,id[v]+1,id[u]);
}
void init()
{memset(fir,0,sizeof(fir));cnt=0;tot=0;opt=0;scanf("%d",&n);for(int i=1;i<=n-1;i++){scanf("%d%d%d",&x,&y,&z);ADD(x,y,z);}sort(xx+1,xx+opt+1,cmp);    
}
void prework()
{dfs(1,0);getpos(1,1);build(1,tot,1); 
}
void doit()
{dfs(1,0);getpos(1,1);build(1,tot,1);scanf("%d",&m);for(int i=1;i<=m;i++){scanf("%d%d%d",&Q[i].u,&Q[i].v,&Q[i].k);Q[i].id=i;}sort(Q+1,Q+m+1,c);int p=1;for(int i=1;i<=m;i++){for(;xx[p].C<=Q[i].k&&p<=opt;p++){if(fa[xx[p].from]==xx[p].to)chg(1,xx[p].C,id[xx[p].from]);else chg(1,xx[p].C,id[xx[p].to]);}ans[Q[i].id]=query_sum(Q[i].u,Q[i].v);}for(int i=1;i<=m;i++) printf("%d\n",ans[i]);
}
int main()
{int t;scanf("%d",&t);while(t--) doit();
}

这篇关于Problem Code: PSHTTR Add problem to Todo list Submit Tweet的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/890014

相关文章

Java中List的contains()方法的使用小结

《Java中List的contains()方法的使用小结》List的contains()方法用于检查列表中是否包含指定的元素,借助equals()方法进行判断,下面就来介绍Java中List的c... 目录详细展开1. 方法签名2. 工作原理3. 使用示例4. 注意事项总结结论:List 的 contain

Nginx指令add_header和proxy_set_header的区别及说明

《Nginx指令add_header和proxy_set_header的区别及说明》:本文主要介绍Nginx指令add_header和proxy_set_header的区别及说明,具有很好的参考价... 目录Nginx指令add_header和proxy_set_header区别如何理解反向代理?proxy

java streamfilter list 过滤的实现

《javastreamfilterlist过滤的实现》JavaStreamAPI中的filter方法是过滤List集合中元素的一个强大工具,可以轻松地根据自定义条件筛选出符合要求的元素,本文就来... 目录1. 创建一个示例List2. 使用Stream的filter方法进行过滤3. 自定义过滤条件1. 定

如何通过Golang的container/list实现LRU缓存算法

《如何通过Golang的container/list实现LRU缓存算法》文章介绍了Go语言中container/list包实现的双向链表,并探讨了如何使用链表实现LRU缓存,LRU缓存通过维护一个双向... 目录力扣:146. LRU 缓存主要结构 List 和 Element常用方法1. 初始化链表2.

python中列表list切分的实现

《python中列表list切分的实现》列表是Python中最常用的数据结构之一,经常需要对列表进行切分操作,本文主要介绍了python中列表list切分的实现,文中通过示例代码介绍的非常详细,对大家... 目录一、列表切片的基本用法1.1 基本切片操作1.2 切片的负索引1.3 切片的省略二、列表切分的高

java两个List的交集,并集方式

《java两个List的交集,并集方式》文章主要介绍了Java中两个List的交集和并集的处理方法,推荐使用Apache的CollectionUtils工具类,因为它简单且不会改变原有集合,同时,文章... 目录Java两个List的交集,并集方法一方法二方法三总结java两个List的交集,并集方法一

在Dockerfile中copy和add的区别及说明

《在Dockerfile中copy和add的区别及说明》COPY和ADD都是Dockerfile中用于文件复制的命令,但COPY仅用于本地文件或目录的复制,不支持自动解压缩;而ADD除了复制本地文件或... 目录在dockerfile中,copy 和 add有什么区别?COPY 命令ADD 命令总结在Doc

Java集合中的List超详细讲解

《Java集合中的List超详细讲解》本文详细介绍了Java集合框架中的List接口,包括其在集合中的位置、继承体系、常用操作和代码示例,以及不同实现类(如ArrayList、LinkedList和V... 目录一,List的继承体系二,List的常用操作及代码示例1,创建List实例2,增加元素3,访问元

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.

Java中List转Map的几种具体实现方式和特点

《Java中List转Map的几种具体实现方式和特点》:本文主要介绍几种常用的List转Map的方式,包括使用for循环遍历、Java8StreamAPI、ApacheCommonsCollect... 目录前言1、使用for循环遍历:2、Java8 Stream API:3、Apache Commons