- 博客(52)
- 收藏
- 关注
原创 2022杭电多校第二场 1001 Static Query on Tree(树链剖分+区间合并)
2022“杭电杯”中国大学生算法设计超级联赛(2)
2022-08-03 14:16:02 165
原创 HDU-3622-Bomb Game(二分+2-sat)
2010 Asia Regional Tianjin Site —— Online Contest
2022-06-30 23:08:18 125
原创 Codeforces Round #650 (A-F2)
A. Short Substrings思路:按照题意每次跳2即可,注意输出最后一个字符。Code:#include<bits/stdc++.h>using namespace std;const int N=2e5+10;char a[N];int main(){ int t; scanf("%d",&t); while(t--){ scanf(" %s",a+1); int len=strlen(a+1); for(int i=1;i<len;i+=2)
2022-05-30 03:29:18 102
原创 树上启发式合并入门-Lomsat gelral
简述:树上启发式合并又叫 dsu on tree ,是解决可以离线的子树问题的一种方法。优点:时间复杂度优秀O(nlogn)O(n logn)O(nlogn),在一些可以使用 dfs 序 + 莫队 算法O(nn)O(n\sqrt{n})O(nn)的题目中有很强的优越性,相比线段树码量要小的多。...
2022-05-17 10:07:17 277
原创 F. Pathwalks(dp+权值线段树)
题目链接思路:题目除了要求边权严格上升外还要求边的编号严格上升,就想到考虑每次加边的影响,dp[i][j]dp[i][j]dp[i][j] 表示的是以 i 点为结尾,结尾边权是 j 的最长长度,(其实和LIS差不多啦)每次加边输入设为 u,v, w 状态转移方程就是 dp[v][w]=max(dp[u][x])x≤w−1dp[v][w]=max(dp[u][x]) x\le w-1dp[v][w]=max(dp[u][x])x≤w−1 ,这个过程用权值线段树来维护就行了,考虑空间和时间需要动态开点(其
2022-05-13 20:25:59 130
原创 F. Ant colony(回滚莫队)
原题链接写在前面:看了看其他题解,居然都是线段树,于是便有了这篇文章。。。思路:题目本质是求区间 GCD 并求区间数字是 GCD 的个数。区间扩展时信息很好更新,但在缩小时信息难以更新,故考虑回滚莫队。因为要记录数字个数,数据范围又是 1e9 区间 GCD 又不能离散化, 开 map ??? 那可以T飞了(在cf上测了下 7000ms)现在区间只有扩展,GCD 只会不断减小 ,假如区间多了一个数 s ,区间 GCD 减小 , 可以证明原区间一定不含 s (反证法可以证明)
2022-05-11 22:03:56 164
原创 E. Martian Strings (kmp)
原题链接思路:和普通的匹配问题稍有不同的是本题匹配到的字符串在母串上可以不相连,但也不能相交。主体思路不难想,考虑记录字符串的所有前缀匹配到的最小位置,记录字符串的所有后缀匹配到的最大位置,只要不相交就可以了,在实现时可以不这么麻烦,直接记录当前缀匹配的最大长度,当前后缀匹配的最大长度,只要合大于等于匹配串的长度就可以了。注意特判长度为1的字符串不满足题意。代码是KMPCode:#include <iostream>#include <map>#in
2022-05-09 10:41:09 86
原创 The 15th Jilin Provincial Collegiate Programming Contest F(AC自动机)
原题链接思路:题目是多模匹配问题故容易想到AC自动机。每次匹配都是以自己作为母串、考虑每次匹配成功对答案的贡献设匹配到的节点是 i不同的字符串可能有相同的前缀,故在字典树的每个节点中要记录以他为前缀的字符串个数 cnt[ ]当前字符串的长度其实就是深度 deep[ ]单点的贡献就是 cnt[i]*deep[i]答案就是所有的累和。思路很明确敲完自信测样例 很好比样例大很多!!!思考发现题目要求的是最长前后缀,而这么写会存在一个字符串对答案贡献多次的问题。多次贡献其..
2022-05-05 20:15:04 146
原创 E. Vasya and a Treetime (思维+数据结构)
原题链接解题思路:是对子树的操作,容易想到dfs序,但又是对深度小于等于k的子树操作,在dfs序中不是连续的,如果考虑bfs序,深度是递增的,但是连续的段又不满足是子树,也不行。本题的特点是查询只有一次,故可以离线,对于任意一个点,只有他的所有父会产生影响,还是考虑dfs ,这样每遍历一个点他的所有父一定已经访问过了,用数据结构维护一个深度段(树状数组,线段树都可),每访问到一个点,把他的操作全做一边,(区间加操作,经典差分)。此时,这个点的答案直接在数据结构里查询就可以。(影响他的点已经全操作
2022-04-24 14:37:07 1471
原创 Array and Segments (Hard version) 思维+线段树
题目链接解题思路:直接贪心选择区间,会有后效性!考虑枚举一种信息,这里选择枚举最小值出现的位置,对于每一个修改区间,只要包含了所枚举的位置,那么区间一定是可选的。因为最小值越小越好,如果区间又包含了最大值的位置,最大最小同减保证答案不会出错。如何实现??修改和查询考虑用线段树,如果每次选择的区间我们都复原,T飞了!!枚举的点是依次增大的,可以记录区间是否已经修改,不断更新就可以了!Code:#include <iostream>#include <map&g
2022-04-21 15:00:02 213
原创 F. Xor-Paths(折半搜索)
题目链接思路:矩形最大是20乘20,不算太大,但爆搜会T!其实这是折半搜索的板题,可以发现我们的搜索树是深度越深情况越多,每次都要乘二。很多搜索树是到不了终点的,起点和终点我们是知道的,如果对起点和终点各搜索一半的深度,在相遇点记录答案,问题就解决了。可以发现这样时间复杂度最多会少半个幂次!Code:#include <iostream>#include <map>#include <set>#include <queue>
2022-04-14 15:19:39 143 1
原创 华华开始学信息学(分块思想+树状数组)
题目链接思路:区间一个数的倍数的个数,我们可以 O(1)算出的,问题在于要找的倍数有很多,考虑分块思想,把修改操作分为两类。大于 sqrt(n) :直接在树状数组中暴力 add小于 sqrt(n) :先记录下来,在每次查询操作时暴力计算时间复杂度:一次查询约是 O(sqrt(n))Code:#include <iostream>#include <map>#include <set>#include <queu...
2022-04-06 10:19:20 246
原创 数星星 Stars(思维+树状数组)
题目链接写在前面:题目卡内存,离散化+二维树状数组 爆内存。思路:观察到一个点的左下部分,x和y一定是小于等于这个点的。题目数据已经排序了,按 y 单调递增的顺序每次查询比当前比 x 小的点的个数就是左下部分的个数 ,再add(x) 即可。Code#include <iostream>#include <map>#include <set>#include <queue>#include <stack>#i.
2022-04-04 17:13:15 317
原创 Caesar Cipher(线段树维护哈希)
https://codeforces.com/gym/102798/problem/G解题思路:1.和普通线段树维护哈希不同的是,这里要求原数组对一个数模mod,观察发现区间一次只加1,线段树记录区间最大值,在查询时如果区间的最大值大于等于mod,重建这部分线段树。2.其他部分和普通的线段树维护哈希就一样了,建议写双哈希,以免被卡。Code:#include <iostream>#include <map>#include <set>#incl
2022-04-02 21:56:05 607
原创 [HEOI2012]采花 (离线树状数组)
原题链接思路:本质是求区间数量大于1的数的个数,考虑一个 next 数组记录相同数最近的下一个位置(经典套路)查询区间离线后 l 从小到大排序,要删掉 l 上的数 如果下一个数存在就要减去下一个数的贡献,如果下下一个数存在就要加上下下一个数的贡献,实现用树状数组,具体看代码一些注意点:数组位置建议从1开始,如果从0开始,树状数组遇到0要特判这个问题是不满足区间相减相加的,很多文章在查询答案时把ans=query(q[i].r);写成了ans=query(q[i].r)-q
2022-03-23 17:01:50 110
原创 牛客挑战赛58C1(二分+贪心)
原题链接解题思路:一条线段可以站多个人,容易想到是二分+贪心贪心思路不太好想,线段可以相互转移故放在一起考虑,尽量要 1 中的线段大,按照 b 的大小升序排序(这样他前面的最大值一定可以转移到他自身,线段相交问题),尽量要 2 中的线段小,2 中线段记录当前时刻排序判断即可参考代码:#include <iostream>#include <map>#include <set>#include <queue>#include &
2022-03-21 10:21:42 226
原创 小石的妹子
原题链接解题思路:考虑贪心思路,假如我们按 ai 的大小排序 ,后面出现的人 ai 一定比前面小,考虑 bi 可以二分求第一个比 bi 小的----说的不清楚具体看代码参考代码#include <iostream>#include <map>#include <set>#include <queue>#include <stack>#include <algorithm>#include <vec
2022-03-20 21:23:56 364
原创 D. Sea Battle(贪心)
原题链接刚开始写的时候把连续的0块单独考虑了,实际上要放在一起考虑思路:找到连续0且等于b的个数num,只能放a个,故最差情况下num-a+1个就一定可以代码:#include <iostream>#include <map>#include <set>#include <queue>#include <stack>#include <algorithm>#include <vector>
2022-03-16 20:22:00 87
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人