五月月赛 寻宝 exkmp + 主席树
: 寻宝
时间限制: Sec 内存限制: MB
提交: 解决:
[提交] [状态] [讨论版] [命题人:admin]
题目描述
采蘑菇的小西佬找到了一张上古年间的藏宝图,上面画着m座连绵不断的山,他决定去地图上记载的地点探险,可当他到达时,他发现当地其实有n座山,并且由于年代久远有些山也改变了形状,他不能准确的找到地图上藏宝的地点,于是他决定从一些连续的山中随意选择一座山作为地图上的第一个点,当他选定了起点以后,若当前的山与地图上记载山的高度相同他就会继续前往下一座山,否则就停下来,直到他到达地图上的最后一座山位置。我们假设如果他经过了大于k座山他就能找到宝藏(如果第一座山高度就不相同,视为经过0座山),现在的问题就是他有多大的可能性找到宝藏。
题目共有q次询问,每次询问有两个整数l,r代表采蘑菇的小西佬选择的区间,并且会给出第一次询问的k,之后的每个询问的k按照下面的式子算出
k=(ans*10086+666)%x; ans代表上一次询问的答案,x=min(m,r-l+1); 输入
第一行输入三个数n,m,k(<=n,m,k<=1e5); 第二行输入n个数代表n座山的高度(<=a[i]<=1e9) 第二行输入m个数代表m座山的高度(<=b[i]<=1e9) 第四行输入一个数q;(<=q<=1e5) 接下来每行输入两个整数l,r;(<=l<=r<=n) 输出
对于每个询问请输出对应的概率,以逆元的形式输出(mod=1e9+7);
题面
用exkmp预处理出每个点可以向后面跑的长度,由于k是变化的,所以需要主席树来回答。
#include <bits/stdc++.h> using namespace std;
#define pb push_back
#define fi first
#define se second
#define debug(x) cerr<<#x << " := " << x << endl;
#define bug cerr<<"-----------------------"<<endl;
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
//const int inf = 0x3f3f3f3f;
const int mod = 1e9+;
/**********showtime************/ const int N = 1e5 + ;
int nxt[N], ex[N];
int S[N], P[N];
int a[N];
int n,m,k;
void GETNEXT() {
int i = , j, po, len=m;
nxt[] = len;
while(P[i] == P[i+] && i+ < len) i++;
nxt[] = i;
po = ;
for(i = ; i < len; i++) {
if(nxt[i-po] + i < nxt[po] + po)
nxt[i] = nxt[i-po];
else {
j=nxt[po] + po - i;
if(j < ) j = ;
while(i + j < len && P[j] == P[j+i])
j++;
nxt[i] = j;
po = i;
}
}
}
void EXKMP()
{
int i = , j, po, len = n, l2 = m;
while(S[i] == P[i] && i < l2 && i < len) i++;
ex[] = i;
po = ;
for(i = ; i < len; i++)
{
if(nxt[i-po] + i < ex[po] + po) ex[i]=nxt[i-po];
else {
j = ex[po] + po - i;
if(j < ) j = ;
while(i + j < len && j < l2 && S[j+i] == P[j]) j++;
ex[i] = j;
po = i;
}
}
} struct node{
int le, ri;
int cnt;
} tree[N * ];
int tot = ;
int root[N];
int build(int le, int ri) {
int p = ++tot;
if(le == ri) {
tree[p].cnt = ;
return p;
}
int mid = (le + ri) >> ;
tree[p].le = build(le, mid);
tree[p].ri = build(mid+, ri);
tree[p].cnt = tree[tree[p].le].cnt + tree[tree[p].ri].cnt;
return p;
}
int ins(int now, int le, int ri, int x, int val) {
int p = ++tot;
tree[p] = tree[now];
if(le == ri) {
tree[p].cnt += val;
return p;
}
int mid = (le + ri) >> ;
if(x <= mid) {
tree[p].le = ins(tree[now].le, le, mid, x, val);
}
else {
tree[p].ri = ins(tree[now].ri, mid+, ri, x, val);
}
tree[p].cnt = tree[tree[p].le].cnt + tree[tree[p].ri].cnt;
return p;
}
int query(int L, int R, int le, int ri, int rt1, int rt2) {
if(L > R) return ;
if(le >= L && ri <= R) {
return tree[rt2].cnt - tree[rt1].cnt;
} int res = ;
int mid = (le + ri) >> ;
if(mid >= L) res += query(L, R, le, mid, tree[rt1].le, tree[rt2].le);
if(mid < R) res += query(L, R, mid+, ri, tree[rt1].ri, tree[rt2].ri);
return res;
}
ll ksm(ll a, ll n) {
ll res = ;
while(n > ) {
if(n & ) res = res * a % mod;
a = a * a % mod;
n = n>>;
}
return res;
}
int main(){
scanf("%d%d%d", &n, &m, &k);
for(int i=; i<n; i++) scanf("%d", &S[i]);
for(int i=; i<m; i++) scanf("%d", &P[i]); GETNEXT();
EXKMP();
root[] = build(, n); for(int i=; i < n; i++){
root[i+] = ins(root[i], , n, ex[i]+, );
} int q; scanf("%d", &q);
int ans = ;
for(int i=; i<=q; i++) { int l, r;
scanf("%d%d", &l, &r);
if(i > ) {
int x = min(m, r - l + );
k = (1ll*ans * + ) % x;
}
int c = query(k+, n, , n, root[l-], root[r]);
// cout<<c << " " << k << endl;
ans = 1ll*c * ksm(r - l + , mod-) % mod;
printf("%d\n", ans);
} return ;
}
五月月赛 寻宝 exkmp + 主席树的更多相关文章
- BZOJ5361[Lydsy1805月赛]对称数——主席树+随机化
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=5361 好神的一道题啊! 容易看出来是要用维护权值的数据结构,因此树链剖分首先pass掉. ...
- bzoj3207--Hash+主席树
题目大意: 给定一个n个数的序列和m个询问(n,m<=100000)和k,每个询问包含k+2个数字:l,r,b[1],b[2]...b[k],要求输出b[1]~b[k]在[l,r]中是否出现. ...
- bzoj1901--树状数组套主席树
树状数组套主席树模板题... 题目大意: 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[ ...
- BZOJ 3626: [LNOI2014]LCA [树链剖分 离线|主席树]
3626: [LNOI2014]LCA Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2050 Solved: 817[Submit][Status ...
- BZOJ 1146: [CTSC2008]网络管理Network [树上带修改主席树]
1146: [CTSC2008]网络管理Network Time Limit: 50 Sec Memory Limit: 162 MBSubmit: 3522 Solved: 1041[Submi ...
- BZOJ 2588: Spoj 10628. Count on a tree [树上主席树]
2588: Spoj 10628. Count on a tree Time Limit: 12 Sec Memory Limit: 128 MBSubmit: 5217 Solved: 1233 ...
- BZOJ 1901: Zju2112 Dynamic Rankings[带修改的主席树]【学习笔记】
1901: Zju2112 Dynamic Rankings Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 7143 Solved: 2968[Su ...
- [bzoj3932][CQOI2015][任务查询系统] (主席树)
Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si ...
- [bzoj2588][count on a tree] (主席树+lca)
Description 给定一棵N个节点的树,每个点有一个权值,对于M个询问(u,v,k),你需要回答u xor lastans和v这两个节点间第K小的点权.其中lastans是上一个询问的答案,初始 ...
随机推荐
- 19个心得,明明白白说Linux下的负载均衡
一.目前网站架构一般分成负载均衡层.web层和数据库层,我其实一般还会多加一层,即文件服务器层,因为现在随着网站的PV越来越多,文件服务器的压力也越来越大;不过随着moosefs.DRDB+Heart ...
- 【POJ - 3104 】Drying(二分)
Drying 直接上中文 Descriptions 每件衣服都有一定单位水分,在不使用烘干器的情况下,每件衣服每分钟自然流失1个单位水分,但如果使用了烘干机则每分钟流失K个单位水分,但是遗憾是只有1台 ...
- 湫湫系列故事——设计风景线 HDU - 4514
题目链接:https://vjudge.net/problem/HDU-4514 题意:判断没有没有环,如果没有环,通俗的讲就是找出一条最长的路,相当于一笔画能画多长. 思路:dfs判环. 最后就是没 ...
- java课堂 动手动脑3
(1) 该函数没有赋初值再就是如果类提供一个自定义的构造方法,将导致系统不在提供默认的构造方法. (2) public class test { public static void main(Str ...
- 对API进行版本控制的重要性和实现方式
我在API设计中收到的最常见问题之一就是如何对API进行版本控制.虽然并非所有API都完全相同,但我发现在API版本控制方面,某些模式和实践适用于大多数团队.我已经将这些内容收集起来,下面将提供一些关 ...
- flask 异步celery使用
在开发过程中,耗时长,超时的任务经常发生,比如:获取后端某个大文件数据超时.需要后端计算任务超时,等等, 此时我们就会很自然的想到异步方式,根据需要完成的任务创建一个task_id, 由前端来监听该任 ...
- Redhat 离线安装 Docker (Community from binaries)
需求 在离线环境安装Docker (Community版),因为Enterprise版要花钱.当然资金充裕的客户可参考https://docs.docker.com/install/linux/doc ...
- S3 Select for Java 使用记录
背景 后台基本使用 Amazon 的全家桶(EC2.DynamoDB.S3.Step Fuction 等等)构建.现在需要根据访问者的 IP 确定访问者的国家或地区. 已知: 访问者 IP 一个 ip ...
- 2月9日 《Java 8实战》读后感
第一部分 基础知识 第3章 Lambda表达式 使用函数式接口 Predicate Consumer Function 第二部分 函数式数据处理 第4章 引入流 第5章 使用流 第6章 用流收集数据 ...
- Linux常用命令之权限管理
在linux中的每一个文件或目录都包含有访问权限,这些访问权限决定了谁能访问和如何访问这些文件和目录,这也让linux更安全.下面主要讲解下常用的权限命令chgrp,chmod,chown . 1.文 ...