这道题要看出来这个做法还是比较容易说一下细节

1.因为要用hash的区间值域来建树,而hash为了不冲突要开的很大,所以值域就会比较的大,不过这道题好的一点是没有修改,所以直接离散一下就会小很多

2.hash的时候多mod (' '     )

3.mod 的值可以稍微取大一点

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. typedef long long ll;
  8.  
  9. const ll maxn = ;
  10. const ll mod = (ll)1e14 + ;
  11. const ll p = ;
  12.  
  13. ll a[maxn], b[maxn], pos[maxn], v[maxn], f[maxn], num = , n, m, k;
  14.  
  15. ll int_get() {
  16. ll x = ; char c = (char)getchar(); bool f = ;
  17. while(!isdigit(c) && c != '-') c = (char)getchar();
  18. if(c == '-') c = (char)getchar(), f = ;
  19. while(isdigit(c)) {
  20. x = x * + (int)(c - '');
  21. c = (char)getchar();
  22. }
  23. if(f) x = -x;
  24. return x;
  25. }
  26.  
  27. struct node {
  28. ll data;
  29. node *l, *r;
  30. }e[maxn * ]; ll ne = ;
  31. node* root[maxn];
  32.  
  33. void test(node* x, ll l, ll r) {
  34. if(!x) return;
  35. cout << l <<" "<< r << " "<< x-> data << endl;
  36. if(l ^ r) {
  37. ll mid = (l + r) >> ;
  38. test(x-> l, l, mid), test(x-> r, mid + , r);
  39. }
  40. }
  41.  
  42. void insert(node* &x, node* y, ll l, ll r, ll v) {
  43. if(!x) x = e + ne ++;
  44. if(l == r) x-> data = (y ? y-> data : ) + ;
  45. else {
  46. ll mid = (l + r) >> ;
  47. if(v <= mid) {
  48. if(y) x-> r = y-> r, y = y-> l;
  49. insert(x-> l, y, l, mid, v);
  50. }
  51. else {
  52. if(y) x-> l = y-> l, y = y-> r;
  53. insert(x-> r, y, mid + , r, v);
  54. }
  55. }
  56. }
  57.  
  58. ll ask(node* x, node* t, ll l, ll r, ll v) {
  59. if(!x) return ;
  60. if(l == r) return x-> data - (t ? t-> data : );
  61. else {
  62. ll mid = (l + r) >> ;
  63. if(v <= mid) {
  64. if(t) t = t-> l;
  65. return ask(x-> l, t, l, mid, v);
  66. }
  67. else {
  68. if(t) t = t-> r;
  69. return ask(x-> r, t, mid + , r, v);
  70. }
  71. }
  72. }
  73.  
  74. bool cmp(ll x, ll t) {
  75. return b[x] < b[t];
  76. }
  77.  
  78. void pre(ll n) {
  79. f[] = ;
  80. for(ll i = ; i <= n; ++ i) f[i] = f[i - ] * p % mod;
  81. }
  82.  
  83. ll find(ll x) {
  84. ll l = , r = num + ;
  85. while(r - l > ) {
  86. ll mid = (l + r) >> ;
  87. if(b[pos[mid]] <= x) l = mid;
  88. else r = mid;
  89. }
  90. return (x == b[pos[l]] ? v[pos[l]] : -);
  91. }
  92.  
  93. void read() {
  94. n = int_get(), m = int_get(), k = int_get();
  95. pre(n);
  96. for(ll i = ; i <= n; ++ i) a[i] = int_get();
  97. memset(b, , sizeof(b));
  98. for(ll i = ; i <= k; ++ i) b[] = (b[] * p % mod + a[i]) % mod;
  99. for(ll j = k + ; j <= n; ++ j)
  100. b[j - k + ] = (((b[j - k] - a[j - k] * f[k - ] % mod) % mod + mod) % mod * p % mod + a[j]) % mod;
  101. //for(ll i = 1; i <= n - k + 1; ++ i) cout << b[i] << endl;
  102. //cout << endl;
  103. for(int i = ; i <= n - k + ; ++ i) pos[i] = i;
  104. sort(pos + , pos + + n - k + , cmp);
  105. v[pos[]] = ++ num;
  106. for(ll i = ; i <= n - k + ; ++ i) {
  107. if(b[pos[i]] != b[pos[i - ]]) ++ num;
  108. v[pos[i]] = num;
  109. }
  110. for(ll i = ; i <= n - k + ; ++ i) insert(root[i], root[i - ], , num, v[i]);
  111. }
  112.  
  113. void sov() {
  114. while(m --) {
  115. ll ls, rs;
  116. ls = int_get(); rs = int_get(); rs -= k - ;
  117. ll x = ;
  118. for(ll i = ; i <= k; ++ i) {
  119. ll s = int_get();
  120. x = (x * p % mod + s ) % mod;
  121. }
  122. ll c = find(x);
  123. if(c == - || rs < ls) printf("Yes\n");
  124. else {
  125. if(ask(root[rs], root[ls - ], , num, c) > ) printf("No\n");
  126. else printf("Yes\n");
  127. }
  128. }
  129. }
  130.  
  131. int main() {
  132. //freopen("test.in", "r", stdin);
  133. //freopen("test.out", "w", stdout);
  134. read();
  135. //for(int i = 1; i <= n - k + 1; ++ i) test(root[i], 1, num), cout << endl;
  136. sov();
  137. }

bzoj 3207 可持久化线段树+hash的更多相关文章

  1. bzoj 3207 可持久化线段树

    首先因为固定询问长度,所以我们可以将整个长度为n的数列hash成长度为n-k+1的数列,每次询问的序列也hash成一个数,然后询问这个数是不是在某个区间中出现过,这样我们可以根据初始数列的权值建立可持 ...

  2. bzoj 3123 可持久化线段树启发式合并

    首先没有连边的操作的时候,我们可以用可持久化线段树来维护这棵树的信息,建立权值可持久化线段树,那么每个点继承父节点的线段树,当询问为x,y的时候我们可以询问rot[x]+rot[y]-rot[lca( ...

  3. bzoj 3524 可持久化线段树

    我们可以先离散化,然后建立权值的可持久化线段树,记录每个数出现的次数,对于区间询问直接判断左右儿子的cnt是不是大于(r-k+1)/2,然后递归到最后一层要是还是大于就有,否则不存在. 反思:挺简单一 ...

  4. BZOJ 2124等差子序列 线段树&&hash

    [题目描述 Description] 给一个 1 到 N 的排列{Ai},询问是否存在 1<=p1<p2<p3<p4<p5<…<pLen<=N(Len& ...

  5. BZOJ 2588: Spoj 10628. Count on a tree-可持久化线段树+LCA(点权)(树上的操作) 无语(为什么我的LCA的板子不对)

    2588: Spoj 10628. Count on a tree Time Limit: 12 Sec  Memory Limit: 128 MBSubmit: 9280  Solved: 2421 ...

  6. [BZOJ 3207] 花神的嘲讽计划Ⅰ【Hash + 可持久化线段树】

    题目链接:BZOJ - 3207 题目分析 先使用Hash,把每个长度为 k 的序列转为一个整数,然后题目就转化为了询问某个区间内有没有整数 x . 这一步可以使用可持久化线段树来做,虽然感觉可以有更 ...

  7. [BZOJ 3218] A + B Problem 【可持久化线段树 + 网络流】

    题目连接:BZOJ - 3218 题目分析 题目要求将 n 个点染成黑色或白色,那么我们可以转化为一个最小割模型. 我们规定一个点 i 最后属于 S 集表示染成黑色,属于 T 集表示染成白色,那么对于 ...

  8. BZOJ.4771.七彩树(可持久化线段树)

    BZOJ 考虑没有深度限制,对整棵子树询问怎么做. 对于同种颜色中DFS序相邻的两个点\(u,v\),在\(dfn[u],dfn[v]\)处分别\(+1\),\(dfn[LCA(u,v)]\)处\(- ...

  9. BZOJ.2653.[国家集训队]middle(可持久化线段树 二分)

    BZOJ 洛谷 求中位数除了\(sort\)还有什么方法?二分一个数\(x\),把\(<x\)的数全设成\(-1\),\(\geq x\)的数设成\(1\),判断序列和是否非负. 对于询问\(( ...

随机推荐

  1. JavaSE---多线程---线程的控制

    1.Java提供了一些工具方法,可以便捷控制线程的执行: 1.1 join Thread提供了让一个线程等待另一个线程执行完成的方法:join: 当某个程序的执行流中调用其他线程的join方法,该线程 ...

  2. youlexuan父类配置

    <!-- 集中定义依赖版本号 -->    <properties>        <junit.version>4.12</junit.version> ...

  3. 【Vue】vue的双向绑定原理及实现

    vue数据双向绑定是通过数据劫持结合发布者-订阅者模式的方式来实现的,那么vue是如果进行数据劫持的,我们可以先来看一下通过控制台输出一个定义在vue初始化数据上的对象是个什么东西. 代码: var ...

  4. 【Flutter学习】组件通信(父子、兄弟)

    一,概述 flutter一个重要的特性就是组件化.组件分为两种状态,一种是StatefulWidget有状态组件,一种是StatelessWidget无状态组件. 无状态组件不能更新状态,有状态组件具 ...

  5. vue 学习中遇到的一些问题

    Vue中data有return返回函数问题: 在简单的vue实例中会看到Vue实例中data属性展示方式如下: let app= newVue({ el:"#app", data: ...

  6. zabbix历史数据全部清楚

    #这种方法会出现 监控项不可用的情况 1.停掉zabbix_server 2.重重名表 RENAME TABLE history to history_20180117; RENAME TABLE h ...

  7. [Repost] 探寻C++最快的读取文件的方案

    作者:BYVoid(https://www.byvoid.com/zhs/blog/fast-readfile) 版权协议:CC BY-NC-SA 3.0 Unported 在竞赛中,遇到大数据时,往 ...

  8. MySQL教程和使用手册

    MySQL 教程 MySQL 教程.MySQL 安装.MySQL 管理.MySQL PHP 语法.MySQL 连接.MySQL 创建数据库.MySQL 删除数据库.MySQL 选择数据库.MySQL ...

  9. MySQL 5.7配置文件

    原文:http://www.voidcn.com/article/p-zrikccdi-hr.html # MySql5.7配置文件my.cnf设置[client]port = 3306socket ...

  10. JS-layui:百科

    ylbtech-JS-layui:百科 layui,是一款采用自身模块规范编写的前端 UI 框架,遵循原生 HTML/CSS/JS 的书写与组织形式,门槛极低,拿来即用.其外在极简,却又不失饱满的内在 ...