- 博客(31)
- 收藏
- 关注
原创 线段树基本操作
文章目录线段树&树状数组常规操作维护区间连续信息最长子段和区间单调连续序列数量维护区间复杂信息维护最长递增序列异或区间分段线段树维护线性基线段树维护哈希扫描线矩阵面积:扫描线维护值域线段树维护区间覆盖区间覆盖价值最大值区间覆盖每个点覆盖次数最大值区间覆盖每个点覆盖次数最小值(或区间是否完全覆盖)线段树常用二分区间第k大的数(代替set)查询区间右端开始最近大于x的位置(即前缀MAX)查询01串区间右端开始最长0位置。主席树区间第k大按父亲建主席树(树上路径第k小)按dfs序建主席树(维护子树)按深度
2021-11-05 14:36:57 257
原创 多校思维题
文章目录牛客思维题Train Wreck:ORHamburger SteakCounting TrianglesBlack and whiteStack航电思维题MedianYiwen with Sqc牛客思维题Train Wreck:给你进出栈的序列,要求为这个序列的每个元素着色,使得每一次入栈操作发生后的栈内序列是两两不同的。前言:比赛时就知道括号化序列,但没啥想法,感觉情况太复杂了,后面看题解,发现括号化序列原来可以建树,建树就明了了,建树后就是个贪心,这个套路可以记一下。思路:我们可以
2021-11-04 21:37:18 158
原创 kuangbin_ac自动机
前言kuangbinkuangbinkuangbin的acacac自动机还是比较基础的,大多数题多是状态机模型的dpdpdp,其中有两道需要用到矩阵优化来记录路径数,然后是关于在tire图上找最短路问题,还有些要状压等等,用于字符串匹配的题很少,废话不多说,先大致分个类吧。状态机dpdpdp前言:状态机dpdpdp主要为建立AC自动机,开一维AC自动机的状态,在AC自动机上计数或求最大值等等。通常用记忆化能写,但记忆化不能压空间,也不能优化(比如:矩阵优化),这是只能递推写,递推时要注意设初始状
2021-09-21 21:23:12 186
原创 C - LIS to Original Sequence(LIS+构造)
C - LIS to Original Sequence(LIS+构造)传送门思路:题目给出LISLISLIS,我们可以得出在AiA_iAi到Ai+1A_{i+1}Ai+1之间肯定是递减的序列,且不属区间[Ai,Ai+1][A_i,A_{i+1}][Ai,Ai+1],这样保证了LISLISLIS不会增大。然后题目要构造字典序最小,我们就将能放在Ai,Ai+1A_i,A_{i+1}Ai,Ai+1之间的数放一个最小的放在总结,其余的以降序放在AnA_nAn
2021-09-14 13:10:02 187
原创 B - Squares(平方差)
B - Squares(平方差)传送门思路:如题要求x2−y=z2x^2-y=z^2x2−y=z2,zzz的个数,我们将其化为:x2−z2=yx^2-z^2=yx2−z2=y,则求的是平方数之间的差值有多少不同的情况,易知差值其为等差数列,枚举平方数之间的间隔,通过公式来计算答案。代码:#include <iostream>using namespace std;typedef long long ll;const ll mod=998244353;ll n;int m
2021-09-14 13:07:47 152
原创 G - Game on Tree 2(主席树+树形dp)
G - Game on Tree 2(主席树+树形dp)传送门思路:首先中位数为跟到叶子节点的树链的中位数, 我们能用主席树算出,然后根据中位数来树形dp,深度为奇数则是Alice操作选中位数最大,偶数为BOb操作选中位数最小。代码#include <iostream>#include <vector>#include <algorithm>#define mid (l+r>>1)using namespace std;const int
2021-09-14 13:03:12 120
原创 G - Groups(计数dp+分组)
G - Groups(计数dp+分组)传送门思路:这题分组,我们可以向推斯特林数的递推一样推这题。状态划分:f[i][j]f[i][j]f[i][j]为1-i个人合法划分j组的方案。当一个人要进入分组的时候,他可以单独分为一组,或者可以放入前面合法组中。状态转移:f[i][j]=f[i−1][j−1]+f[i−1][j]∗(j−i−1m)f[i][j]=f[i-1][j-1]+f[i-1][j]*(j-\frac{i-1}{m})f[i][j]=f[i−1][j−1]+f[i−1][j]∗(j−
2021-09-14 13:00:45 95
原创 F - Make Pai(区间dp+计数)
F - Make Pai(区间dp+计数)传送门思路:状态划分:dp[i][j]dp[i][j]dp[i][j]为i到j配对完的的方案数我们让i去找个k配对,那么其中间的一定也要配对完才能选[i+1,k-1],即可 将其划分[i+1,k-1]和[k+1,j]两个集合,然后进行状态转移。状态转移:dp[i][j]=dp[i+1][k−1]∗dp[k+1][j]∗Cx+y+1xdp[i][j]=dp[i+1][k-1]*dp[k+1][j]*C_{x+y+1}^{x}dp[i][j]=dp[i+1]
2021-09-14 12:58:27 71
原创 G - 01Sequence(树状数组+并查集)
G - 01Sequence传送门思路:可以看出,我们应该贪心的将111的数量放在最后面开始放,我们可以用树状数组在实现区间查询修改,用并查集来支持从最右边开始单点修改的位置。代码:#include <iostream>#include <algorithm>using namespace std;const int N=2e5+7;struct node{int l,r,x;}a[N];int n,m,Ans[N],tr[N],f[N];int lowb
2021-09-14 12:55:59 110
原创 近期比赛训练
近期比赛训练ABC_216文章目录近期比赛训练ABC_216**C - Many Balls**思路:**D - Pair of Balls**思路:代码:**E - Amusement Park**思路:代码:**F - Max Sum Counting**思路:代码:**G - 01Sequence**思路:代码:ABC_127**D - Cutting Woods**思路:代码:**E - Sorting Queries**思路:代码:**F - Make Pair**思路:代码:**G - G
2021-09-14 12:45:48 118
原创 P4824 [USACO15FEB]Censoring S(kmp删子串)
P4824 [USACO15FEB]Censoring S(kmp删子串)传送门题意:给你S,T字符串,删除S串,重复这个过程,直到不能删为止,删除后字符串会拼接起来思路:用栈维护,当删除成功时,出栈至拼接的位置,然后看其next数组位置,继续kmp匹配。方案打印即为栈内元素。代码:#include <iostream>#include <cstring>#include <stack>using namespace std;const int N
2021-08-30 23:15:23 125
原创 P2894 [USACO08FEB]Hotel G(维护最长连续的1)
P2894 [USACO08FEB]Hotel G(维护最长连续的1)传送门题意:给你长度为n的1串,m次操作找到最左边长度为x连续的1,若找到区间修改为0,找不到,输出0将l-r区间修改为1思路:对于1操作,由于左端点不确定,所以我们用线段树维护区间[l,r][l,r][l,r]最长的连续的1即线段树维护len区间最长连续空房的长度lmx从l端点开始最长连续空房的长度rmx从r端点开始最长连续空房的长度之后在线段树上二分,即可完成1操作。#include <iost
2021-08-30 23:00:36 58
原创 P1502 窗口的星星(扫描线)
P1502 窗口的星星(扫描线)传送门题意:给出n个星星的二维坐标及星星亮度,问给你W×HW\times HW×H的矩阵去框住星星的亮度总和。思路:首先做个转换,我们将星星体积转换位W×HW\times HW×H 的矩阵,之后用扫描线维护,即如果星星能被W×HW\times HW×H的矩阵框住,即星星之间有交集,我们即扫描线求矩阵交来维护亮度和。#include <iostream>#include <vector>#include <algorithm>
2021-08-30 22:42:10 84
原创 D. Ezzat and Grid(dp+线段树维护区间交)
D. Ezzat and Grid(dp+线段树维护区间交)思路:首先题目问删最小的行,我们可以找个满足题意的最长序列,则考虑用dp在解决。状态划分:dp[i]dp[i]dp[i]为选iii行的满足题意最大子序列状态转移:dp[i]=dp[j]+1dp[i]=dp[j]+1dp[i]=dp[j]+1,其中第j行与第i行有交集。我们可以在线段树上进行转移。#include <iostream>#include <algorithm>#include <vect
2021-08-23 23:53:02 208
原创 E. Trees of Tranquillity(括号化序列)
E. Trees of Tranquillity(括号化序列)传送门题目大意:给你两课树,找个点集使在第一棵树上两两之间有祖先关系,第二课树上两两之间没有祖先关系。思路:在第二颗树上遍dfs,即可获得括号化序列括号化序列:括号化序列为,只有不相交和包含关系的区间。被包含的节点在该节点子树里。即有祖先关系。我们要在第一棵树上跑dfsdfsdfs,按照dfsdfsdfs顺序维护区间即可保证集合在第一棵树上两两之间有祖先关系,且区间不相交,即保证在第二棵树上两两之间没有祖先关系。我们将区间加入
2021-08-23 23:52:19 95
原创 HDU多校3
HDU多校3传送门1004.Game on Plane思路:将斜率存入pair后,将线段分成不同种类,之后按不同种类依次选择线段。交点出为线段总数减去当前存在最多线段数一种线段具体实现看代码。#include <iostream>#include <map>#include <queue>#define bug cout<<"???\n";using namespace std;const int N=1e5+7;typedef lo
2021-07-28 20:40:31 115
原创 2021牛客暑期多校训练营4
2021牛客暑期多校训练营4传送门B.Sample Game概率dp,挖坑LCS按LCS大小顺序,模拟即可,代码不美观就不发了。E.Tree Xor思路:可知我们先令Wi=0W_i=0Wi=0,可得节点Wi={W1,W2...Wn}W_i=\{W_1,W_2...W_n\}Wi={W1,W2...Wn} 。易知当W1 xor XW_1\ xor\ XW1 xor X,之后所以WiW_iWi都会异或上X,那么我们
2021-07-28 20:22:17 81
原创 2021牛客暑期多校训练营1
2021牛客暑期多校训练营1比赛链接Alice and BobSG打表:通过SG打表发现他大部分情况都是先手必胜态。递推转移:所以我们可以通过递推的方式,将先手必败态转移必胜,之后先手必胜被标记过后将不再转移。即可将时间复杂优化为O(n2∗logn)O(n^2*logn)O(n2∗logn)或者直接打表 (雾代码:#include <iostream>#include <cstring>#include <unordered_set>using
2021-07-21 20:40:25 91
原创 Sum of Log(数位dp)
Sum of Log(数位dp)传送门题意:求满足∑i=0X∑j=[i=0]Y[i&j=0]⌊log2(i+j)+1⌋\sum_{i=0}^{X}\sum_{j=[i=0]}^Y [i\&j=0]⌊log_2(i+j)+1⌋∑i=0X∑j=[i=0]Y[i&j=0]⌊log2(i+j)+1⌋的值思路:数位dp:我们可以用数位dp枚举[0,x]和[0,y]的。二进制处理。我们可以讲述搞成二进制,那么可以通过数位dp得到[i&j=0][i\&j=0]
2021-07-13 22:42:30 115
原创 AtCoder Regular Contest 108
AtCoder Regular Contest 108传送门A - Sum and Product思路:联立方程,得到二次函数,易知函数具有单调性,n\sqrt{n}n枚举#include <iostream>using namespace std;typedef long long ll;ll p,s;int main(){ cin>>s>>p; int ok=0; for(ll i=1;s-i>=1;i++){
2021-06-29 12:53:48 110
原创 Hello 2019
Hello 2019Hello 2019C. Yuhao and a Parenthesis处理两组数据一组数据是放左边的括号,且该括号放左边要合法。一组数据是放右边的括号,且该括号放右边要合法。合法的意义令左括号为1,右括号-1,为放左边的括号从左往右的任意的前缀和不低于0令左括号为-1,右括号1,为放右边的括号从右往左的任意的前缀和不低于0将两种数据分别放入multiset,进行匹配,计算答案。#include <iostream>#include <
2021-06-17 00:22:03 80
原创 Educational Codeforces 79
Educational Codeforces Round 79 (Rated for Div. 2)A. New Year Garland题目链接思路:首先排序,假设排序后,a≤b≤ca\le b\le ca≤b≤c,那么我们将a与b交错的叠一起,那么得到一个a+ba+ba+b的串,之后判断与ccc串能否叠一起而不会有相同颜色。具体判断看代码。代码实现:#include <iostream>#include <algorithm>using namespace std
2021-05-26 23:24:14 62
原创 AtCoder Regular Contest 105
AtCoder Regular Contest 105C - Camels and Bridge题目链接思路:首先题目N比较小,可以全排。状态划分:dp[i]dp[i]dp[i]为第i只骆驼离第1只骆驼的距离。状态转移:dp[i]=max(dp[i],dp[j]+len(i,j)),j<idp[i]=max(dp[i],dp[j]+len(i,j)) ,j<idp[i]=max(dp[i],dp[j]+len(i,j)),j<i对于len(i,j)len(i,j)len
2021-05-26 22:47:56 107
原创 I. Sequence
I. Sequence题目链接思路:转换:由题目可得,四元组的个数,就是N×NN\times NN×N矩阵里子矩阵的个数,其中m限制ai,bia_i,b_iai,bi就是不可选的单元。举个栗子,样例一现在问题就是要计算有多少个子矩阵了。计算子矩阵假如矩阵的1×w1\times w1×w的矩阵。那么子矩阵的数量为 dp[i]=dp[i−1]+idp[i]=dp[i-1]+idp[i]=dp[i−1]+i。dp[i]dp[i]dp[i]为1×w1\times w1×w的子矩阵的个数。推广
2021-05-26 00:30:40 283
原创 Codeforces Round #722 (Div. 2)
Codeforces Round #722 (Div. 2)B. Sifid and Strange Subsequences题目链接思路:题目要求子序列两两之间的值全部大于等于MAX,不妨给序列排序。排序后,对于序列,只需在意相邻是数是否大于等于MAX。很容易看出,所有非正数都是满足的,现在对多能加入一个正数,选最小的正数看是否比原先答案更优。代码实现:#include <iostream>#include <set>using namespace std;c
2021-05-26 00:28:00 110 2
原创 Codeforces Round #721 (Div. 2)
Codeforces Round #721 (Div. 2)A. And Then There Were K思路水题,要将最高位按位&掉,就要构造个(1<<cnt)-1;B1. Palindrome Game (easy version)思路:策略后走的可以将置1在先走的对位,再次构成回文串。最后只剩两个0时,绝杀后手少花费2分一开始是回文串,如果0的个数位偶数的话,那么先走的多花费2分,先走的输,如果0为奇数的话,先走的花费1分,构造成回文串,将自己变为后走的,
2021-05-21 11:13:37 75
原创 AtCoder Regular Contest 104
AtCoder Regular Contest 104AtCoder Regular Contest 104D - Multiset Mean思路:首先需要进行转换,对于平均数m,(∑x∈Sx)/∣S∣=m({\sum_{x\in S}x})/{|S|}=m(∑x∈Sx)/∣S∣=m,可以处理成∑x∈S(x−m)=0\sum_{x\in S}(x-m)=0∑x∈S(x−m)=0 ,举个例子。在x∈{1,2,3,4,5,6}x\in \{1,2,3,4,5,6\}x∈{1,2,3,4,5,6}
2021-05-20 19:29:16 156 1
原创 Educational Codeforces Round 109 (Rated for Div. 2)
Educational Codeforces Round 109 (Rated for Div. 2)传送门A. Potion-making水题,求gcd即可。B. Permutation Sort水题,答案只有0,1,2,3四种情况。C. Robot Collisions思路:首先观察可以发现两个结论。只有坐标奇偶相同的机器人会发生碰撞。两个机器人坐标已知的情况下能直接算出碰撞时间。由以上结论我们离ac还差这么在O(n)时间得到机器人两两相撞。栈。我们从左到右遍历,将机器人先
2021-05-19 13:56:41 136 2
原创 AtCoder Regular Contest 119
AtCoder Regular Contest 119题目链接A.119 × 2^23 + 1题意:给你N,求N=a×2b+cN=a\times 2^b+cN=a×2b+c,a+b+ca+b+ca+b+c的最小值思路:我们首先构造,N=NN=NN=N,即a=N,b=0,c=0a=N,b=0,c=0a=N,b=0,c=0,如果可以a%2==0a\%2==0a%2==0这说明能从a中拿出因子222,N=a2×2b+1+cN=\frac a2\times2^{b+1}+cN=2a×2b+1+c,即a
2021-05-18 17:17:20 136
原创 并查集
并查集是一种用来管理元素分组情况的数据结构,并查集可以高效的进行如下操作。● 查询元素a和元素b是否属于同一组。● 合并元素a和元素b所在的组。首先初始化,n个节点来表示n个元素,最开始没有边void init(int n){ for(int i=1;i<=n;i++){ par[i]=i; rank[i]=0; }接着需要查询树的根,我们知道per[son]=father,其中son是子节点,father是父节点,我
2020-06-21 14:35:33 74
原创 扩展欧几里得求逆元
[牛客网]A Number Theoretical Problem题目链接:https://ac.nowcoder.com/acm/problem/207599这貌似是一道求逆元的模板题,但是。。。逆元是什么啊!!!扩展欧几里得是什么啊!!!于是我今天花了一下去看别人的博客,一脸懵逼的进去,一脸懵逼的出来。其实有很多地方我都搞不明白,但也管不了那么多啦,把我搞明白的讲出来就可以了**欧几里得算法**首先我们都知道欧几里得算法(也叫辗转相除法)能求出两个数a,b的最大公约数,即gcd(a,b)
2020-06-17 23:00:40 209 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人