【题目描述】

总而言之,月读现在有一棵大小为 $N$  ,树上每条边上有一个数字,月读有 $M$  次询问,每次询问一对 $(x,y)$  ,你需要回答从 $x$  到 $y$  的路径上的数字重新排列能否形成一个回文序列,若可行输出 $Yes$  ,否则输出 $No$  ,月读为了加快您的读入,每次询问的 $x,y$ 是通过某种方式生成的,为了加快您的输出,你只需要最后输出回答 $Yes$ 的个数和即可。

【输入格式】

第一行:两个整数 $N,M$

接下来 $N-1$ 行:三个整数 $u_i,v_i,w_i$,描述一条边 $(u_i,v_i)$ 与边上的数字 $w_i$ 。

接下来一行 $A_1,B_1$

$M$ 个询问以如下方式生成

$x_i=A_i \% n+1,y_i=B_i \% n+1$

$A_i=A_{i-1} \times 666073 \% (10^9+7)$

$B_i=B_{i-1} \times 233 \% 998244353$

【输出格式】

一行一个数字,代表回答 $Yes$ 的个数。

【样例】

样例输入

4 1
1 2 1
2 3 1
1 4 2
2 3

样例输出

1

【数据范围与提示】

对于此题有六个测试点:

A(10分) $N,M \le 2000$

B(23分) $N,M \le 10^5,u_i=v_i+1$

C(15分) $N,M \le 10^5$

D(15分) $N,M \le 10^6,w_i \le 30 $

E(17分) $N,M \le 10^6$

F(20分) $N \le 10^6,M \le 10^7$

对于所有的 $1 \le w_i \le n$

【题解】

回文序列一看就不是什么好东西。。。再认真读一遍题目,发现可以重新排列。那么这显然只需要统计每个数的出现次数是奇数还是偶数就可以了。显然这种判断奇偶性的可以用异或的方法。对于每个点存一下每种颜色的个数。询问时直接把两个节点的数组异或起来就可以了。这是最朴素的暴力。

考虑优化。维护数组,每个点只加入一次,树上主席树嘛!高兴地写着,一看数据范围:$M$ 有点小大。。。只能考虑 $O(1)$ 回答每次询问。

先从原来的思路想起。两个数组,维护的只有 $0$ 和 $1$,这显然可以用 $bitset$ 优化。

但还是过不去,让我们来考虑问题的本质:询问二进制位数。显然只有一位和 $0$ 的是合法的。我们考虑能不能只用一个数来代表一个 $bitset$。

幸运的是, $hash$ 显然可以解决这个问题。我们本来每一位的权值是 $2^{w_i}$,考虑改变底数为 $p^{w_i}$,其中 $p$ 是一个大质数。这样用自然溢出的 $hash$ 就可以把 $p$ 的 $1-n$ 次幂存下来,对于每个点求出树上前缀 $hash$ 异或和。这样对于每次询问的 $(x,y)$,只需判断 $x$ 与 $y$ 的 $hash$ 值的异或值是否为 $p^i$ 或 $0$ 即可。可以用 $hash$ 表维护。至此这题结束。

这个做法看起来真的很假。。。但我们要相信:数据是水的,出题人是懒的。。。于是信仰过了。

大质数可以采用神犇 $1124828077$ 推荐的 $13131313$,我试了试,果然没被卡 $hash$,还一遍过了。。。

【代码】

#include<bits/stdc++.h>
inline int read ( void )
{int x=0;char ch;bool f=false;while ( !isdigit(ch=getchar()) ) if ( ch=='-' ) f=true;for ( x=ch^48;isdigit(ch=getchar()); ) x=(x<<1)+(x<<3)+(ch^48);return f ? -x : x ;
}
int n,m,tot,cnt_e,h[1000010];
struct edge { int v,nxt,w; } e[2000010];
std::map<int,int> map;
inline void add ( int u,int v,int w )
{e[++cnt_e].nxt=h[u];e[h[u]=cnt_e].v=v;e[cnt_e].w=w;e[++cnt_e].nxt=h[v];e[h[v]=cnt_e].v=u;e[cnt_e].w=w;
}
typedef unsigned long long Hash;
const Hash HASH=13131313,hash_mod=10000019;
Hash Pow[1000010],hsh[1000010];
struct HASH_MAP
{int h[hash_mod+1],cnt;struct edge { Hash v;int nxt; } e[1000010];inline void insert ( Hash val ) { e[++cnt].nxt=h[val%hash_mod];e[h[val%hash_mod]=cnt].v=val; }inline bool find ( Hash val ){for ( int i=h[val%hash_mod];i;i=e[i].nxt ) if ( e[i].v==val ) return true;return false;}
}hash_map;
inline void dfs ( int u,int fr ) { for ( int i=h[u];i;i=e[i].nxt ) if ( e[i].v!=fr ) hsh[e[i].v]=hsh[u]^Pow[e[i].w],dfs(e[i].v,u); }
signed main()
{n=read();m=read();for ( int i=1,u,v,w;i<n;i++ ){u=read();v=read();w=read();if ( !map.count(w) ) map[w]=++tot;add(u,v,map[w]);}Pow[0]=1;for ( int i=1;i<=tot;i++ ) Pow[i]=Pow[i-1]*HASH,hash_map.insert(Pow[i]);dfs(1,0);int ans=0;for ( int A=read(),B=read();m--; ){int x=A%n+1,y=B%n+1;A=A*666073LL%1000000007;B=B*233LL%998244353;if ( !(hsh[x]^hsh[y]) or hash_map.find(hsh[x]^hsh[y]) ) ans++;}printf("%d\n",ans);return 0;
}

转载于:https://www.cnblogs.com/RenSheYu/p/11305838.html

DTOJ #3702. 月读(tsukuyomi)相关推荐

  1. DTOJ3702 月读(tsukuyomi)

    DTOJ3702 月读(tsukuyomi) 题目 题目描述 输入格式 输出格式 样例 样例输入 样例输出 数据范围与提示 题解 题目 题目描述 有些时候,出题人真的不想写背景(???) 总而言之,月 ...

  2. ZOJ 3702 Gibonacci number(数学推导题)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3702 Gibonacci number Time Limit:  ...

  3. The log scan number (620023:3702:1) passed to log scan in database 'xxxx' is not valid

    昨天一台SQL Server 2008R2的数据库在凌晨5点多抛出下面告警信息: The log scan number (620023:3702:1) passed to log scan in d ...

  4. 【DTOJ】2701:问候

    DTOJ 2701:问候  解题报告 2017.11.08 第一版 --由翱翔的逗比w原创,引用yzl_rex的CSDN博客 题目信息: 题目描述 问候人类! 输入 输入一行,一个名字,如human( ...

  5. DTOJ 1486:分数(score)

    DTOJ 1486:分数(score) [题目描述] [输入] 第一行包含两个正整数N和P,表示选手的个数以及精度要求. 接下来的N行,每行包含一个0到100(闭区间)内的整数. [输出] 输出一个实 ...

  6. DTOJ 1552:网络小说分组(novel)

    DTOJ 1552:网络小说分组(novel) [题目描述] YK酷爱阅读网络小说,读起来便是没日没夜废寝忘题的.YK在机房中,花了数个月阅读完了N本网络小说,并且对N本网络小说设定了一个喜爱值,可正 ...

  7. DTOJ 2313:定价(absurd)

    DTOJ 2313:定价(absurd) [题目描述] 在市场上有很多商品的定价类似于 999 元.4999 元.8999 元这样.它们和 1000 元.5000 元和 9000 元并没有什么本质区别 ...

  8. DTOJ 1587:Hamsters(hamsters)

    DTOJ 1587:Hamsters(hamsters) [题目描述] Tz养了一群仓鼠,他们都有英文小写的名字,现在Tz想用一个字母序列来表示他们的名字, 只要他们的名字是字母序列中的一个子串就算, ...

  9. 题解 DTOJ #1515.三塔合一

    欢迎访问 My Luogu Space. [题目描述] [输入输出格式] 输入格式: 输出格式: [输入输出样例] 输入样例: 5 1 1 2 2 输出样例: 643 [标签] 模拟,数学推演. [分 ...

最新文章

  1. FPGA之道(57)状态机的实现方式
  2. Android开发之ContentProvider结合LoaderManager加载数据(图文源代码分享)
  3. FastReport使用
  4. 9月7日学习内容整理:内置函数
  5. malloc原理和内存碎片
  6. 如何使用配置的方式修改SAP C4C UI的字段标签,以及背后的工作原理
  7. iOS Core ML与Vision初识
  8. Linux 进程状态 说明
  9. 逛知乎才知网站建设不只有wordpress建站系统,小白值得收藏
  10. 乌镇互联网大会 | 王恩东院士谈人工智能:计算力就是生产力
  11. EF 更新条目时出错。有关详细信息,请参见内部异常。
  12. Python爬虫实战(6)-爬取QQ空间好友说说并生成词云(超详细)
  13. python---面向对象1
  14. 让电视走向高端化,创维能否继续领跑显示行业?
  15. 切片器可以设置日期格式?_如何分秒必争--浅淡时间切片器
  16. 电信行业大数据(大数据平台系列)
  17. 双线性插值 java方式实现
  18. 【moeCTF题解-0x01】Reverse
  19. 快速获取iOS APP中的所有素材
  20. 平面设计最常用的6种英文字体

热门文章

  1. Powerbuilder历程
  2. 如何扫除“无孔不入,防不胜防”的发帖机
  3. V-REP 传送带教程
  4. SolidWorks添加焊件库的方法
  5. Android Studio plugins 无法在线加载插件
  6. 24个Web前端人员不能错过的在线检测网站汇总
  7. 谈谈JAVA程序的反编译
  8. 新版海螺影视主题模板M3.1全解密版本多功能苹果CMSv10后台自适应主题开源全解密版
  9. Cobalt Strike使用教程一
  10. 工作分析文献综述_毕业论文文献综述不会写?快来看看这篇文章(附含通用模板)...