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

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. js调用浏览器

    定义和用法 open() 方法用于打开一个新的浏览器窗口或查找一个已命名的窗口. 语法 window.open(URL,name,specs,replace) 参数 说明 URL 可选.打开指定的页面 ...

  2. 【架构】Linux的架构(architecture)

    最内层是硬件,最外层是用户常用的应用,比如说firefox浏览器,evolution查看邮件,一个计算流体模型等等.硬件是物质基础,而应用提供服务.但在两者之间,还要经过一番周折. 还记得Linux启 ...

  3. 使用node-static运行vue打包文件dist

    vue打包后的文件dist,如果想上线之前查看效果,方法如下: npm install -g node-static 进入到dist文件夹,运行static命令 打开上面地址

  4. Android动画效果 translate、scale、alpha、rotate 切换Activity动画 控件位置调整

    2011.10.28注:如果需要控件停在动画后的位置,需要设置android:fillAfter属性为true,在set节点中.默认在动画结束后回到动画前位置.设置android:fillAfter后 ...

  5. 【Tomcat】使用Tomcat部署Spring Boot项目生成的jar包

    介绍 简单来说,Tomcat是一个免费的,用于Java Web应用以及其它Web应用的一个Web服务器.(简单地概括一下,可能有误) 下载与安装 本文章目标是把Spring Boot Web项目生成的 ...

  6. thinkphp 连接postgresql

    PHP连接: php.ini中将extension=php_pgsql.dll前面的分号去掉extension=php_pdo_pgsql.dll前面的分号去掉,然后设置extension_dir指向 ...

  7. HTML5: HTML5 新元素

    ylbtech-HTML5: HTML5 新元素 1.返回顶部 1. HTML5 新元素 自1999年以后HTML 4.01 已经改变了很多,今天,在HTML 4.01中的几个已经被废弃,这些元素在H ...

  8. EmWin 如何显示汉字 不用在文件中使用编码

    1. Font Converter for emWin 生成C文件字库 1.1 新建文件 1.2 选择字体 1.3 为了减小C文件体积,这里只加入自己需要的汉字,先把所有字体取消选择. 1.4 新建一 ...

  9. java 并发——CountDownLatch

    java 并发--CountDownLatch 简介 public class CountDownLatch { private final Sync sync; private static fin ...

  10. Node.js、vue.js的使用

    Vue.js的使用 1.下载Node.js 2.打开cmd 3.执行命令 npm i 4.输入命令 npm run serve 5.浏览器打开  http://localhost:8080