noip模拟赛(一)魔法树
魔法树
(mahou.pas/c/cpp)
【问题描述】
魔法使moreD在研究一棵魔法树。
魔法树顾名思义,这货是一棵树,奇葩的是魔法树上的每一条边都拥有一个魔法属性,如果不那么奇葩就不是moreD的魔法树了。
魔法使moreD在研究这棵魔法树的方法比较奇葩,每一次他会选择一条路径施法。
这个魔法是moreD的看家本领,叫元素剥离。施法过程是这样的:首先,moreD将把他的宠物通灵到魔法树上选定路径的一端,通灵不需要魔法值。初始时,宠物不拥有任何属性。
宠物会在moreD的指使下沿着路径走到另一个端点。在走过树上的边时。若该宠物已经拥有该边的属性,该宠物就会自己施法,使用当前边的属性,帮自身把相同的属性剥离,剥离完成后,宠物自身便不再带有该属性;否则,宠物会吸收该属性,即让自身拥有该属性。
宠物完成自己的旅途后,moreD要对宠物进行回收。回收时,若moreD的宠物不带有属性,则moreD需要使用1点魔法值。否则moreD使用的魔法值将是宠物剩下的属性所需剥离魔法值的积,以此来帮助自己的宠物剥离剩下的属性。
moreD想知道,对于每条选定的路径,moreD需要的魔法值数额对100,000,007取mod后的值是多少?
【输入格式】
输入第一行包含两个整数N,Q,K,表示魔法树的大小,询问数以及属性的数量。
接下来N-1行,每行表示一条魔法树上的边,ai,bi,ci。表示一条连接ai,bi两个点的边带有属性ci.
接下来一行,K个整数表示对于剥离每种属性所需的魔法值Cost i。
接下来Q行,每行一组询问,pi,qi表示moreD选定的施法路径。
【输出格式】
对于每组数据输出一行,表示该组询问的答案。
【输入样例】
5 4 3
1 2 2
1 5 3
2 3 2
2 4 1
1 2 3
3 5
1 3
4 5
4 4
【输出样例】
3
1
6
1
【数据范围】
对于前40%的数据 N,Q≤1,000
对于前80%的数据N≤100,000,Q≤40,000
对于100%的数据N,Q≤500,000 1≤ci≤K≤20 1≤ai,bi,pi,qi≤N Cost i≤100,000,000
对于所有奇数点的数据满足所有pi=1。
【题解】
- lca的处理:可以将节点1作为根节点,用bfs作预处理,用倍增法求lca。
- 魔法属性的处理:将属性编号转化成2的非负整数次幂(即,将第几编号转化为二进制的第几位),将lca最短路径上的所有属性压缩成一个int型整数,以异或计算将根到该节点的所有路径上的属性压缩到该节点的目标数组中。
- 属性操作:利用异或计算相同为0不同为1的性质,将要求lca的a、b两节点的数组值进行异或计算就可以得出a到b路径上的所有属性;需要累加时,取出异或计算的结果的每一位,若为1,则该位代表的位的属性就累乘。
- 注意:需要声明乘积变量为long long类型。
#include<stdio.h>
#include<stdlib.h>
using namespace std;
static int bin[21],root=1;
void make_bin()
{
bin[0]=0;
bin[1]=1;
for(int i=2;i<=20;i++)
bin[i]=bin[i-1]<<1;
}
inline int read()
{
int x=0,c=getchar(),f=1;
while(c<48||c>57){if(c=='-')f=-1;c=getchar();}
while(c>47&&c<58)x=x*10+c-48,c=getchar();
return x*f;
}
int n,q,k,m,cost[500001];
int v[1000001],first[1000001],nxt[1000001],magic[1000001];
bool vis[500001];
int qq[500101],f[1000001];
void Link(int x,int y,int z)
{
v[++m]=y;
nxt[m]=first[x];
first[x]=m;
magic[m]=z;
}
void bfs()
{
int head=0,tail=1;
qq[head]=root;
while(head^tail){
int now=qq[head++];
for(int i=first[now];i;i=nxt[i])
if(!vis[v[i]]){
vis[v[i]]=true;
f[v[i]]=f[now]^bin[magic[i]];
qq[tail++]=v[i];
}
}
}
int main()
{
make_bin();
freopen("mahou.in","r",stdin);
freopen("mahou.out","w",stdout);
n=read(),q=read(),k=read();
for(int i=1;i<=n-1;i++){
int x=read(),y=read(),z=read();
Link(x,y,z);
Link(y,x,z);
}
bfs();
for(int i=1;i<=k;i++)
cost[i]=read();
while(q--){
int pi=read(),qi=read();
int t=f[pi]^f[qi];
long long mul=1;
for(int i=1;i<=k;i++,t>>=1){
if(!t)break;
if(t&1)mul=((long long)mul*cost[i])%100000007;
}
printf("%I64d\n",mul);
}
fclose(stdin);
fclose(stdout);
return 0;
}
/*
5 4 3
1 2 2
1 5 3
2 3 2
2 4 1
1 2 3
3 5
1 3
4 5
4 4
*/
noip模拟赛(一)魔法树的更多相关文章
- NOI.AC NOIP模拟赛 第三场 补记
NOI.AC NOIP模拟赛 第三场 补记 列队 题目大意: 给定一个\(n\times m(n,m\le1000)\)的矩阵,每个格子上有一个数\(w_{i,j}\).保证\(w_{i,j}\)互不 ...
- NOIP模拟赛20161022
NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...
- contesthunter暑假NOIP模拟赛第一场题解
contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...
- NOIP模拟赛 by hzwer
2015年10月04日NOIP模拟赛 by hzwer (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...
- 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程
数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...
- 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...
- 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...
- 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...
- CH Round #58 - OrzCC杯noip模拟赛day2
A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...
- CH Round #52 - Thinking Bear #1 (NOIP模拟赛)
A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...
随机推荐
- WAF指纹识别和XSS过滤器绕过技巧
[译文] -- “Modern Web Application Firewalls Fingerprinting and Bypassing XSS Filters” 0x1 前言 之前在乌云drop ...
- SharePoint大容量文档库整体搬迁的解决方案(SharePoint document library migration)
今天客户提出了一个需求,有一个文档库,里面有500多个文档,有word,excel还有pdf文档,想要把文档搬迁到一个新的站点上面去,新的文档库和原文档库有这同样的列,客户要求文档在迁移过程中属性要带 ...
- Android 进程生命周期 Process Lifecycle
Android 进程生命周期 Process Lifecycle 进程的生命周期 Android系统会尽力保持应用的进程,但是有时为了给新的进程和更重要的进程回收一些内存空间,它会移除一些旧的进程. ...
- Android四大组件之Activity一(组件的概念、Intent、监听)
前言知识补充: 什么是组件? 1.它的类必须实现特定接口或继承特定类 2.需要在配置文件中配置其全类名 3.它的对象不是通过new来创建的, 而是系统自动创建的 4.它的对象具有一定 ...
- 【工具相关】iOS-Reveal的使用
一,首先下载Reveal工具. Reveal的下载地址:http://revealapp.com/download. 下载界面如下图所示,选择Download Trail蓝色按钮可以进行下载: 二,新 ...
- IOS开发之开发者账号遇到的bug
今天使用开发者账号过期的问题,文件显示 其实今天的问题和这个没有关系,即使上面显示此证书的签发者无效,有时候也是可以用的. 我这里情况比较奇葩,刚刚生成的开发者账号,显示还是"......无 ...
- DOM样式操作
CSS 到 DOM的抽象 通过操作 CSS 对应的 DOM对象来更新CSS样式 换肤操作 如何获取实际的样式(不仅有行内,更有页面和外联样式表中定义的样式) 样式表分为三类: 外联,页面,行内 内部样 ...
- 1.6 基础知识——GP2.5 培训(Training)
摘要: 实际上做任何项目总会缺失各种技能,培训特别是未雨绸缪的培训就显得很必要了! 正文: GP2.5 Traing the people performing or supporting XXX p ...
- 【AdaBoost算法】弱分类器训练过程
一.加载数据(正样本.负样本特征) def loadSimpData(): #样本特征 datMat = matrix([[ 1. , 2.1, 0.3], [ 2. , 1.1, 0.4], [ 1 ...
- SQLServer和Oracle创建视图用户
在数据集成的开发中,经常会需要给对方创建视图,让其可以查看一些必要的数据.既在数据库中创建用户,并赋给该用户查询视图的权限 一.SQLServer --创建登录用户账户USE [master] GO ...