[BZOJ3207] 花神的嘲讽计划Ⅰ (主席树)
Description
Input
Output
Sample Input
1 2 3 4 5 6 7 8
2 5 2 3 4
1 8 3 2 1
5 7 4 5 6
2 5 1 2 3
1 7 3 4 5
Sample Output
Yes
Yes
Yes
No
HINT
Source
Solution
CTSC上人生第一次写主席树,竟然过了,,,然后就兴(S)奋(B)地想找主席树的题巩固。有人说:不要在考试时写你不会的算法,或许是扯[哔——]吧。
先把所有长为k的串哈希,可以用线段树查询区间内某个数是否出现过。但这样就需要$n$棵树,而每棵树$3n$个结点。。。MLE*TLE等等。
窝们的HJT主席搞出来了一个数据结构,使得时空复杂度均为$O(nlogn)$(掌声在哪里)
嗯,就是搞两个指针,一个表示旧树,一个表示新树。树的结点表示某段权值区间内有多少个数。每棵树整体表示$[1, i]$区间内所有的数
因为相邻两棵树只有一个叶子结点不同,所以从根开始,一个儿子拷贝旧数的对应结点的标号,另一个儿子开一个新点,然后递归处理这个结点。因为每一次建树最多增加一条链的结点数$(logn)$,时间和空间复杂度就是$O(nlogn)$
查询答案时就是把$[1, r]$的答案减去$[1, l-1]$的答案,每次搜到叶子结点就结束,时间复杂度$O(mlogn)$
至此这道题就做完了。
(完了我自己都不知道自己在说些什么)
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct hjtree
{
int l, r, sum;
}a[];
int d[], ql[], qr[], ctot, root[], ptot;
ll sh[], cd[]; void update(int o1, int &o2, int l, int r, int id)
{
int mid = (l + r) >> ;
if(!o2) o2 = ++ptot;
a[o2].sum = a[o1].sum + ;
if(l == r) return;
if(id <= mid) a[o2].r = a[o1].r, update(a[o1].l, a[o2].l, l, mid, id);
else a[o2].l = a[o1].l, update(a[o1].r, a[o2].r, mid + , r, id);
} int query(int o1, int o2, int l, int r, int id)
{
int mid = (l + r) >> ;
if(l == r) return a[o2].sum - a[o1].sum;
if(id <= mid) return query(a[o1].l, a[o2].l, l, mid, id);
return query(a[o1].r, a[o2].r, mid + , r, id);
} int main()
{
int n, m, k, tmp;
scanf("%d%d%d", &n, &m, &k);
for(int i = ; i <= n; i++)
scanf("%d", d + i);
for(int i = ; i <= n - k + ; i++)
for(int j = ; j < k; j++)
sh[i] = sh[i] * + d[i + j];
for(int i = ; i <= n - k + ; i++)
cd[i] = sh[i];
for(int i = ; i <= m; i++)
{
scanf("%d%d", ql + i, qr + i);
for(int j = ; j <= k; j++)
{
scanf("%d", &tmp);
sh[n - k + + i] = sh[n - k + + i] * + tmp;
}
cd[n - k + + i] = sh[n - k + + i];
}
sort(cd + , cd + n - k + m + );
for(int i = ; i <= n - k + m + ; i++)
sh[i] = lower_bound(cd + , cd + n - k + m + , sh[i]) - cd;
for(int i = ; i <= n - k + ; i++)
update(root[i - ], root[i], , , (int)sh[i]);
for(int i = ; i <= m; i++)
puts(query(root[ql[i] - ], root[qr[i] - k + ], , , (int)sh[n - k + + i]) ? "No" : "Yes");
return ;
}
[BZOJ3207] 花神的嘲讽计划Ⅰ (主席树)的更多相关文章
- BZOJ3207花神的嘲讽计划Ⅰ——主席树+hash
题目描述 背景 花神是神,一大癖好就是嘲讽大J,举例如下: “哎你傻不傻的![hqz:大笨J]” “这道题又被J屎过了!!” “J这程序怎么跑这么快!J要逆袭了!” …… 描述 这一天DJ在给吾等众蒟 ...
- bzoj 3207 花神的嘲讽计划Ⅰ 主席树+hash
花神的嘲讽计划Ⅰ Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3112 Solved: 1086[Submit][Status][Discuss] ...
- BZOJ3207: 花神的嘲讽计划Ⅰ(hash)
3207: 花神的嘲讽计划Ⅰ Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3569 Solved: 1258[Submit][Status][Di ...
- [bzoj3207][花神的嘲讽计划Ⅰ] (字符串哈希+主席树)
Description 背景 花神是神,一大癖好就是嘲讽大J,举例如下: “哎你傻不傻的![hqz:大笨J]” “这道题又被J屎过了!!” “J这程序怎么跑这么快!J要逆袭了!” …… 描述 这一天D ...
- BZOJ3207 花神的嘲讽计划I
Time Limit: 10 Sec Memory Limit: 128 MB Summary 给你一个模式串P,q个询问,对每个询问回答从Pl到Pr是否存在与给定串相同的子串,同时有所有的给定串长度 ...
- BZOJ3207 花神的嘲讽计划
hash值建主席树. 垃圾题面没有熟虑范围害我MLE——>RE. By:大奕哥 #include<bits/stdc++.h> #define unll unsigned long ...
- [bzoj3207]花神的嘲讽计划Ⅰ[可持久化线段树,hash]
将每k个数字求一个哈希值,存入可持久化线段树,直接查询即可 #include <iostream> #include <algorithm> #include <cstd ...
- BZOJ3207: 花神的嘲讽计划Ⅰ
显然hash,然后stl随便搞. #include<bits/stdc++.h> #define N 100005 using namespace std; typedef unsigne ...
- 【字符串哈希】【莫队算法】bzoj3207 花神的嘲讽计划Ⅰ
既然询问的长度是确定的,那么我们可以将所有长度为K的字串弄个哈希值出来,这样字串存在性=>哈希值存在性. 自然上溢哈希,base=107比较不错. 序列长度n=>n-K+1 询问区间[x, ...
随机推荐
- zabbix客户端一键安装脚本(主动模式监控)
#!/bin/bash basepath=$(cd `dirname $0`; pwd)SHELL_DIR="${basepath}/shell"PACKAGE_DIR=" ...
- Kubeadm 安装部署 Kubernetes 集群
阅读目录: 准备工作 部署 Master 管理节点 部署 Minion 工作节点 部署 Hello World 应用 安装 Dashboard 插件 安装 Heapster 插件 后记 相关文章:Ku ...
- Fiddler使用简单介绍
一,fiddler简介 1.1,什么是fiddler Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的"进出&qu ...
- 【Javascript】在文本框光标处插入文字并定位光标 (转)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Freemarker的基本语法及入门基础
freemarker的基本语法及入门基础一.freemarker模板文件(*.ftl)的基本组成部分 1. 文本:直接输出的内容部分 2. 注释:不会输出的内容,格式为&l ...
- Linux常见目录及其作用
在Linux操作系统中,所有文件和目录都被组织成一个以根节点开始的倒置的树状结构.如下图 系统一般以 / 来表示根目录.在根目录之下的可以是目录也可以是文件,而每一个目录中又可以包含子目录文件.如此反 ...
- javascript selenium全套教程发布
为什么有这个系列 目前javascript生态非常丰富,越来越多的人开始用js去做前端的ui测试了.而selenium是web ui测试的标准解决方案,所以一套js的selenium教程是很有必要的. ...
- JS标签的各种事件的举例
1.鼠标单击事件( onclick ) <!DOCTYPE HTML> <html> <head> <meta http-equiv="Conten ...
- 老男孩Python全栈开发(92天全)视频教程 自学笔记21
day21课程内容: json: #序列化 把对象(变量)从内存中 编程可存储和可传输的过程 称为序列化import jsondic={'name':'abc','age':18}with open ...
- Java基础系列--集合之ArrayList
原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/8494618.html 一.概述 ArrayList是Java集合体系中最常使用,也是最简单 ...