正题 题目链接:https://www.luogu.com.cn/problem/P7599 题目大意 \(n\)棵树,在某棵树上时可以选择向左右两边第一棵比它高的树跳,现在\(q\)次询问从\([A,B]\)中某个点出发跳到\([C,D]\)中某个点的最少次数. \(1\leq n\leq 2\times 10^5\) 解题思路 考虑到主要的阈值\([B+1,C-1]\)中的最大值,一旦超过了这个值就只需要考虑是否大于\([C,D]\)中的最大值就好了. 那么我们考虑如何选取起点,首先我们显然…
命题描述 给定一个长度为 \(n\) 的序列,\(m\) 次询问区间最大值 分析 上面的问题肯定可以暴力对吧. 但暴力肯定不是最优对吧,所以我们直接就不考虑了... 于是引入:倍增 首先,倍增是个什么东西? 在这里转一篇写的超棒的blog,点我.要是这都没看懂你就连小白兔都不如我就无语了. 总的来说,其实就是倒着运用二分的思想,从需求小的慢慢倍增把答案更新到需求大的 ST表就是一种常见的倍增思想的运用 关于ST表 ST表和树状数组,线段树这两种算法一样,是一种用于解决 \(RMQ(Range M…
常见操作:先把所有串都连到一起,但中间加上一个特殊的符号(不能在原串中/出现过)作为分割 由于全部的子串就等于所有后缀的所有前缀,那我们对于每一个后缀,去求一个最长的前缀,来满足这个前缀在至少K个原串中出现过 那我们就二分一下这个前缀的长度.现在的问题就是怎么判断这个前缀是否在K个串中出现过了. 显然,对于一个后缀s的长度为x的前缀,只要某个后缀t 和s的LCP>=x,就说明x也是t的后缀 我们知道,LCP(x,y)=min{height[rank[y]],height[rank[y]-1],.…
题目描述 Lemon觉得他需要一个复杂的密码来保证他的帐号的安全.他经过多日思考,决定使用一个长度为奇数的回文串来作为他的密码.  但是这个回文串太长了,Lemon记不住,于是Lemon决定把它记在本子上.当然直接把密码明文记录实在太愚蠢了,于是Lemon决定在记录时加入一些无意义的字符以保证密码的安全.  具体来说,假设Lemon的密码串是S,Lemon选择了一个不超过len(S)/2的正整数x,然后把S的前x个字符组成的字符串设为Left,把S的后x个字符组成的字符串设为Right,把S其余…
题面: 传送门:http://codeforces.com/problemset/problem/475/D Given a sequence of integers a1, -, an and q queries x1, -, xq on it. For each query xi you have to count the number of pairs (l, r) such that 1 ≤ l ≤ r ≤ n and gcd(al, al + 1, -, ar) = xi. 题目大意:…
[BZOJ3277] 串 Description 现在给定你n个字符串,询问每个字符串有多少子串(不包括空串)是所有n个字符串中至少k个字符串的子串(注意包括本身). Solution 首先将所有串连接起来,预处理出后缀数组和高度数组. 显然直接主席树可以很容易做到 \(O(n \log^2 n)\) .对于每一个后缀的位置,二分一个 LCP 长度,找到这个 LCP 长度对应的区间,检查这个区间是否合法来调节二分边界. 注意在这个做法里,瓶颈不在于主席树,因为主席树的功能完全可以用双指针预处理一…
[HAOI2007]理想的正方形 题目描述 有一个\(a*b\)的整数组成的矩阵,现请你从中找出一个\(n*n\)的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输入格式: 第一行为3个整数,分别表示\(a,b,n\)的值 第二行至第\(a+1\)行每行为\(b\)个非负整数,表示矩阵中相应位置上的数.每行相邻两数之间用一空格分隔. 输出格式: 仅一个整数,为\(a*b\)矩阵中所有\(n*n\)正方形区域中的最大整数和最小整数的差值"的最小值. 输入输出样例 输入样例…
传送门 想题5分钟调题两小时系列 其实还是我tcl 读完题之后自然会知道一个关键点能够更新的点是一段连续的区间,于是我们对于每个点能到的左右区间二分答案,用ststst表维护一下查询即可. 代码: #include<bits/stdc++.h> #define ri register int using namespace std; inline int read(){ int ans=0; char ch=getchar(); while(!isdigit(ch))ch=getchar();…
传送门 二分答案好题. 这已经是当年普及组模拟时挖的坑了233. 这道题还是很不错的. 考虑把坐标系转个45度再操作. 为了不爆精度可以直接转切比雪夫距离. 然后就直接二分答案. 其中竖线就按二分的答案来分割. 而横着的线怎么确定是否合法呢? 我们用ststst表来确定是否合法. 然后就能解决普及组模拟题啦QAQ. 代码…
#include<iostream> #include<cmath> using namespace std; ; int a[maxn]; ]; ]; int quick(int a,int n) { ; while(n) { ) ans*=a; a=a*a; n>>; } return ans; } int main() { int n,m; cin>>n>>m; ;i<=n;i++) cin>>a[i]; ;i--) {…