摘要:
这题就是每次维护一条链上的信息,如果普通暴力,那么复杂度会超,但是我们观察到m只有2e3,每次只有两个点,因此我们把所有可能操作的点以及他们的lca全部保留下来 新建成一棵虚树,就能维护所有的信息,并且所有的点不会超过8000,也就是说每次最多操作8e3的点,最多有2e3次的操作,所以相乘不会超时。 阅读全文
摘要:
B题 暴力题,通过维护数组表示在i位置能够取到数的大小 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=2e5+10; int l[N]; vector<int> num[N]; int a 阅读全文
摘要:
这道题求取的本质是二进制不进位加法的队数,因此模型比较常见,因为我们不太会维护有下界的数位dp 所以往往使用容斥原理变成无下界的dp #include<bits/stdc++.h> using namespace std; typedef long long ll; typedef pair<ll, 阅读全文
摘要:
常规做法,看出是破环成链后用哈希维护,只要枚举前k位,之后往后跳n次,看看是不是都有满足条件的字符串 注意,每个字符串只能用一次,因此还需要额外维护一个map表示是否已经使用 cf的数据比较强,卡了单哈希也卡了加法双哈希,因此用pll维护哈希即可 #include<bits/stdc++.h> us 阅读全文
摘要:
https://zhuanlan.zhihu.com/p/268630329 在知乎上有位网友总结出来一种贪心套路 这题的本质上是对于每对数,要将ai放入A集合或者把bi放入B集合 最后求min(MAX(A)+MAX(B)),因此采用排序后,保留合适的值 之后枚举每种可能答案即可 #include< 阅读全文
摘要:
暴力的做法就是枚举每一位选什么,但是过于暴力,我们只需要记忆化搜索一下,表示之后的有没有算过即可 #include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=5e5+10; const int mod= 阅读全文
摘要:
多模式串匹配问题,因为要求每个串不重复出现的次数,我们只需要对于每个串维护一个len,如果匹配到当前串的末尾并且到之前匹配的长度大于等于len,那么说明是新的答案 我采用的方法是对于每个独立串的末尾标记一下,这样我们去做自动机的时候就能够知道是否匹配,但是每次都要走到根,因为这样才可以覆盖到所有的串 阅读全文
摘要:
本题难想的是状态设计,因为要做到不重不漏,所以我们设计状态为f[i][j]表示以i为根,子树中到i点最大距离为j的方案数。 那么在更新的时候,只要根据新的子树和之前所有的子树的关系即可更新,因为很多j都可以成为答案,如果再枚举一维就会超过复杂度 因此使用前缀和优化,来降维到二维dp #include 阅读全文
摘要:
比较容易看的出来的是这题求得是最小公倍数的最大值 然后我们可以发现一定是选不同质数的次幂,因此每个质数的次幂就是一个集合,因此只需要跑一下分组背包就可以了 #include<bits/stdc++.h> using namespace std; typedef long long ll; const 阅读全文
摘要:
如果没有取模,直接维护线段树哈希,原理跟普通哈希是相同的,就是维护一个哈希数组 本题有取模操作,其实有一个常见的套路就是我们发现取模的次数并不会太多,因此对最大值超过限制的区间直接暴力取模变成0,这样复杂度还是可以过关的 #include<bits/stdc++.h> using namespace 阅读全文