魔法树

(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模拟赛(一)魔法树的更多相关文章

  1. NOI.AC NOIP模拟赛 第三场 补记

    NOI.AC NOIP模拟赛 第三场 补记 列队 题目大意: 给定一个\(n\times m(n,m\le1000)\)的矩阵,每个格子上有一个数\(w_{i,j}\).保证\(w_{i,j}\)互不 ...

  2. NOIP模拟赛20161022

    NOIP模拟赛2016-10-22 题目名 东风谷早苗 西行寺幽幽子 琪露诺 上白泽慧音 源文件 robot.cpp/c/pas spring.cpp/c/pas iceroad.cpp/c/pas ...

  3. contesthunter暑假NOIP模拟赛第一场题解

    contesthunter暑假NOIP模拟赛#1题解: 第一题:杯具大派送 水题.枚举A,B的公约数即可. #include <algorithm> #include <cmath& ...

  4. NOIP模拟赛 by hzwer

    2015年10月04日NOIP模拟赛 by hzwer    (这是小奇=> 小奇挖矿2(mining) [题目背景] 小奇飞船的钻头开启了无限耐久+精准采集模式!这次它要将原矿运到泛光之源的矿 ...

  5. 大家AK杯 灰天飞雁NOIP模拟赛题解/数据/标程

    数据 http://files.cnblogs.com/htfy/data.zip 简要题解 桌球碰撞 纯模拟,注意一开始就在袋口和v=0的情况.v和坐标可以是小数.为保险起见最好用extended/ ...

  6. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

  7. 队爷的Au Plan CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的Au%20Plan 题解:看了题之后觉得肯定是DP ...

  8. 队爷的新书 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的新书 题解:看到这题就想到了 poetize 的封 ...

  9. CH Round #58 - OrzCC杯noip模拟赛day2

    A:颜色问题 题目:http://ch.ezoj.tk/contest/CH%20Round%20%2358%20-%20OrzCC杯noip模拟赛day2/颜色问题 题解:算一下每个仆人到它的目的地 ...

  10. CH Round #52 - Thinking Bear #1 (NOIP模拟赛)

    A.拆地毯 题目:http://www.contesthunter.org/contest/CH%20Round%20%2352%20-%20Thinking%20Bear%20%231%20(NOI ...

随机推荐

  1. firefox中flash经常崩溃

    建议: 1.安装flashblck插件 2.添加配置文件 在C:\Windows\SysWOW64\Macromed\Flash添加mmc.cfg. mmc.cfg的内容: SlientAutoUpd ...

  2. 使用 SQL的 for xml path来进行字符串拼接 (group by)

    参考: http://www.cnblogs.com/repository/archive/2011/01/18/1938418.html select convert(varchar(10),c.[ ...

  3. 为Autodesk Viewer添加自定义工具条

    如果你参加过我们近期的活动,你就会频繁的听到我们现在正在做的Autodesk Viewer大模型浏览器,这是一个不需要下载任何插件,基于WebGL技术的浏览器,可以支持几十种数据格式.同时viewer ...

  4. 智者当借力而行, 借助Autodesk应用程序商店实现名利双收

    有没有注意到这个"精选应用"菜单?有没有想过这个菜单下的应用是从哪里来的?你的应用也可以出现在这里哦~ 如果你还不知道,Autodesk在几年前就发布了Autodesk应用程序商店 ...

  5. go语言和资料

    C/C++编程相关的复杂性,特别是大一点的工程的维护,如果人员较多,规范等都是较大的负担,最近正在关注go这么语言, 准备对于并发和系统级的开发引入. Go官网 http://golang.org h ...

  6. <转>iOS性能优化:Instruments使用实战

    最近采用Instruments 来分析整个应用程序的性能.发现很多有意思的点,以及性能优化和一些分析性能消耗的技巧,小结如下. Instruments使用技巧 关于Instruments官方有一个很有 ...

  7. Android studio 如何查看当前git 分支的4种方式

    1.第一种       2.第二种       3.第三种 4.第四种       前面3种都是通过android studio 操作的. 第四种是通过命令行操作.(可以在 git bash 中输入命 ...

  8. Java基础知识学习(六)

    多线程 先了解线程的概念 多线程需要注意的地方 优先级.线程同步.消息传递.数据共享.死锁等 Java线程类 Thread,实现接口 Runnable Thread常用方法 getName 获得线程名 ...

  9. SQL Server 2014新特性——事务持久性控制

    控制事务持久性 SQL Server 2014之后事务分为2种:完全持久, 默认或延迟的持久. 完全持久,当事务被提交之后,会把事务日志写入到磁盘,完成后返回给客户端. 延迟持久,事务提交是异步的,在 ...

  10. 抛弃NVelocity,来玩玩Razor

    对于内容型,不易变动的东西我们都希望给它来个静态化,还有种情况就是比如新浪云不支持.net,为了能跑起我们的网站, 只能放些静态页面上面,外加jsonp来实现交互,我们知道.net中有很多模板引擎,但 ...