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

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

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

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

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; typedef long long ll; const ll maxn = ;
const ll mod = (ll)1e14 + ;
const ll p = ; ll a[maxn], b[maxn], pos[maxn], v[maxn], f[maxn], num = , n, m, k; ll int_get() {
ll x = ; char c = (char)getchar(); bool f = ;
while(!isdigit(c) && c != '-') c = (char)getchar();
if(c == '-') c = (char)getchar(), f = ;
while(isdigit(c)) {
x = x * + (int)(c - '');
c = (char)getchar();
}
if(f) x = -x;
return x;
} struct node {
ll data;
node *l, *r;
}e[maxn * ]; ll ne = ;
node* root[maxn]; void test(node* x, ll l, ll r) {
if(!x) return;
cout << l <<" "<< r << " "<< x-> data << endl;
if(l ^ r) {
ll mid = (l + r) >> ;
test(x-> l, l, mid), test(x-> r, mid + , r);
}
} void insert(node* &x, node* y, ll l, ll r, ll v) {
if(!x) x = e + ne ++;
if(l == r) x-> data = (y ? y-> data : ) + ;
else {
ll mid = (l + r) >> ;
if(v <= mid) {
if(y) x-> r = y-> r, y = y-> l;
insert(x-> l, y, l, mid, v);
}
else {
if(y) x-> l = y-> l, y = y-> r;
insert(x-> r, y, mid + , r, v);
}
}
} ll ask(node* x, node* t, ll l, ll r, ll v) {
if(!x) return ;
if(l == r) return x-> data - (t ? t-> data : );
else {
ll mid = (l + r) >> ;
if(v <= mid) {
if(t) t = t-> l;
return ask(x-> l, t, l, mid, v);
}
else {
if(t) t = t-> r;
return ask(x-> r, t, mid + , r, v);
}
}
} bool cmp(ll x, ll t) {
return b[x] < b[t];
} void pre(ll n) {
f[] = ;
for(ll i = ; i <= n; ++ i) f[i] = f[i - ] * p % mod;
} ll find(ll x) {
ll l = , r = num + ;
while(r - l > ) {
ll mid = (l + r) >> ;
if(b[pos[mid]] <= x) l = mid;
else r = mid;
}
return (x == b[pos[l]] ? v[pos[l]] : -);
} void read() {
n = int_get(), m = int_get(), k = int_get();
pre(n);
for(ll i = ; i <= n; ++ i) a[i] = int_get();
memset(b, , sizeof(b));
for(ll i = ; i <= k; ++ i) b[] = (b[] * p % mod + a[i]) % mod;
for(ll j = k + ; j <= n; ++ j)
b[j - k + ] = (((b[j - k] - a[j - k] * f[k - ] % mod) % mod + mod) % mod * p % mod + a[j]) % mod;
//for(ll i = 1; i <= n - k + 1; ++ i) cout << b[i] << endl;
//cout << endl;
for(int i = ; i <= n - k + ; ++ i) pos[i] = i;
sort(pos + , pos + + n - k + , cmp);
v[pos[]] = ++ num;
for(ll i = ; i <= n - k + ; ++ i) {
if(b[pos[i]] != b[pos[i - ]]) ++ num;
v[pos[i]] = num;
}
for(ll i = ; i <= n - k + ; ++ i) insert(root[i], root[i - ], , num, v[i]);
} void sov() {
while(m --) {
ll ls, rs;
ls = int_get(); rs = int_get(); rs -= k - ;
ll x = ;
for(ll i = ; i <= k; ++ i) {
ll s = int_get();
x = (x * p % mod + s ) % mod;
}
ll c = find(x);
if(c == - || rs < ls) printf("Yes\n");
else {
if(ask(root[rs], root[ls - ], , num, c) > ) printf("No\n");
else printf("Yes\n");
}
}
} int main() {
//freopen("test.in", "r", stdin);
//freopen("test.out", "w", stdout);
read();
//for(int i = 1; i <= n - k + 1; ++ i) test(root[i], 1, num), cout << endl;
sov();
}

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. Vim默认开启语法标识功能

    把syntax on加到$HOME/.vimrc文件中.

  2. ThreadLocal内存泄漏

    原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11421437.html 内存泄漏 内存泄漏是指不再使⽤的对象⽆法得到及时的回收,持续占⽤内存空间,从⽽ ...

  3. c++ vector push_back对象的时候存起来的是拷贝[转]

    比如 class C1; vector<C1> vec; C1* p=new C1; vec v1; v1.push_back(&(*p)); delete p; 这里,传进函数的 ...

  4. Linux安装系统

    服务器与PC 服务器本质上也是以太计算机,相比较家用电脑而言区别如下: 1.服务器更加稳定 2.通常性能比家用机更高 运维工程师的核心职责 保证服务器不间断运行 提升访问效率 保证数据安全 要完成上面 ...

  5. react教程 — 开发 总结

    本文章是在熟练使用 VUE 的基础上,对比VUE 功能进行的一个技术总结. 1.react项目快速搭建  https://blog.csdn.net/mapbar_front/article/deta ...

  6. videojs 播放无法通过URI确定格式的视频源(flv/mp4)

    前言 前人坑我千百遍我待前人如初恋.最近公司开源节流搬机房,需要把原来的服务迁移,然后屁颠屁颠的把一个跑了几年没人管的视频网站(知道这个网站的人都走了)迁移到新的机房去. 结果跑起来发现原来里面同时存 ...

  7. 如何编写高性能的 javascript

    一.Javascript代码执行效率1. DOM1.1 使用 DocumentFragment 优化多次 append说明:添加多个 dom 元素时,先将元素 append 到 DocumentFra ...

  8. 浅析DirectX11技术带给图形业界的改变(一) 浅析DirectX11技术带给图形业界的改变【转】

    浅析DirectX11技术带给图形业界的改变(一) 浅析DirectX11技术带给图形业界的改变 前言:2009年10月23日,微软高调发布了其最新一代操作系统——Windows7,这款操作系统相对于 ...

  9. Linux环境下Eclipse对C++新特性的支持设置

    Linux环境下Eclipse对C++新特性的支持设置     今天写一个简单的关于C11中的array容器的测试程序如下, #include <iostream> #include &l ...

  10. crontab定时执行datax

    记录下使用crontab,datax定时同步数据遇到的问题. 1.开始使用如下配置,死活不执行.网上说crontab环境便利的问题,设置了也没反应. [root@hxjk_test_mysql_red ...