04 2019 档案
摘要:提交通道 洛谷日报 考虑非$O(n^2)$的预处理。一遍dfs时,check某颜色有没有的数组何时清空很尴尬:得到某树答案后如果不清,则影响接下来兄弟树的搜索;如果清了,父亲节点又难以收集答案。 解决方法:先让儿子们各顾各的家,算一遍各自的答案(假如能算),check清就清了吧。然后考虑人为优化,即
阅读全文
摘要:1.题意有坑,实际要求第k小。 2.没学过动态开点也没学过主席树,看一下博主思路然后妄想自己实现的后果就是拿命去调bug。
阅读全文
摘要:要点 本题使用$O(n^2)$的算法 外层枚举左端点,内层一直kmp到结尾,中间遇到合法的就ans++ 如果是acccca这种数据直接kmp过程顺手判断即可;但是aaa这种数据,j = 2,实际判断是不合法的,也就是说,其实只要Next里有合法的即本串合法,因此多开Num数组记录 C++ inclu
阅读全文
摘要:常规dp。看到数据很小就直接暴力了,没有预处理。kmp好像过分了…… C++ include include include include include include using namespace std; int n, k, t, dp[205][45]; string T = " ",
阅读全文
摘要:要点 是树形的考虑dfs 分为取一枝,取两枝两种情况,将它们的合法情况进行暴举取最好答案即可,貌似我乱搞得相当冗…… 顺手记忆化 正解应该是树上背包 树上背包版,j k要使用上个儿子的所以j倒序: C++ include include include define pb push_back usi
阅读全文
摘要:走格子拿分数,直接弄dp[i]是到了第i格的最大得分可以发现是假的。 于是此题设f[i][j][k][t]代表四种步伐各用了几次可以得到的最大得分,到达的点可以直接算出来,就好转移了。 C++ const int maxn = 355; int N, M; int a[maxn], cnt[4];
阅读全文
摘要:要点 不难想到gcd一下然后枚举每个开头走一圈,并记录一下数值。 最终答案是分情况的:1.能走几圈走几圈然后加上最后剩余的最大子段和;2.也可能是最后一圈后面的拖后腿了,所以最后一圈没走完就停,即长度为一圈长的最大子段和;3.一圈为负数时只考虑一圈内的即可,多走了反而变差。 求环形的、不超过某长度的
阅读全文
摘要:球冠公式是$\frac{\pi h^2(3R h)}{3}$,这样再余弦公式用$R_a$和$R_b$导一导两个球冠的$h$就做完了。算是补了个camp时没做出来的小坑了。 C++ include using namespace std; typedef double db; const db eps
阅读全文
摘要:我预处理$1e7log(1e7)$的因数被T掉了,就不敢往这个复杂度想了……无奈去看AC代码 结果怎么暴举gcd剪一剪小枝就接近3s卡过去了!vector有锅(确信
阅读全文
摘要:对于某个开关,都有n个选项可能影响它的结果,如果会影响,则系数为1,否则系数为0;最后得到自由元的个数,自由元可选0也可选1.
阅读全文
摘要:AC通道 要点 欧拉函数对于素数有一些性质,考虑将输入数据唯一分解后进行素数下的处理。 对于素数$p$有:$\phi(p^k)=p^{k 1} (p 1)=p^k \frac{p 1}{p}$,因此将$a_i$唯一分解后有:$\phi(\prod_{i=l}^ra_i)=\prod_{i=l}^ra
阅读全文
摘要:AC通道 两边同步搜,一步里面A走一次B走两次,遇到对方走过的地方就得到了答案。
阅读全文
摘要:AC通道 如果建立第一天某点到某点有几条路的矩阵,做k次矩阵乘就是第k天某点到某点有几条路。统计即可。 C++ include using namespace std; typedef long long ll; const int maxn = 101, mod = 1e9 + 7; int N,
阅读全文
摘要:要点 998244353的原根g = 3,意味着对于任意$$1 include include include include using namespace std; typedef long long ll; const int p = 998244353, g = 3; int K, b[10
阅读全文
摘要:一开始写的第一步让0和1一起走然后第二步再让0走会挂最后一个点……然后探索一下觉得主要问题在于我模拟的一步一步地走。如果这样的话9 2这个数据会使第17步他俩就碰在final点了,而实际上我们想要的效果是他们走第18步时差一格,然后第20步碰上后大家一起,所以提前碰到会炸。故而要两步两步地走才行,发
阅读全文
摘要:为了物尽其用,Next求出最多有哪部分能重复使用,然后重复使用就行了…… C++ const int maxn = 5e5 + 5; char s[maxn], t[maxn]; int cnts0, cnts1, cntt0, cntt1; int Next[maxn]; int main() {
阅读全文
摘要:构造模拟要分情况讨论感觉不是够本质,然后官解是因为只有四个量所以可以根据限制条件列两个方程,再枚举一下解就可以了。 C++ const int maxn = 5000 + 5; int n, c[maxn], a[maxn]; vector zero, two, cl, ac, ans1, ans2
阅读全文
摘要:要点 显然要滑动修改维护。 像通常的数列next关系一样建边(单调栈预处理),因为贪心所以是树,然后发现增删只会影响 区间内的 子(or父,看你连边方向行事)节点,于是使用dfs序建线段树。 为了正确地修改,会发现必须得用大数向小数连边。一是根据题意,一个大数会有好几个小数儿子但小数只会贪心选一个父
阅读全文
摘要:要点 假设第i个最后总共选的值为ci,不妨把它分成两部分:$$c_i=cnt'_i L+q_i$$$$L=840,\ 0 W; rep(i, 1, 8) cin cnt[i]; memset(dp, 1, sizeof dp); dp[0][0] = 0; rep(fakei, 0, 7) { re
阅读全文
摘要:要点 二分显然,关键在于怎么判断 题解方法:开k个队列代表每个时间有哪些电脑会挂掉,这部分O(n)预处理一下,之后扫一遍时间,每个时间点贪心选取最靠前的会挂的电脑未雨绸缪给它充电,然后看看充电以后要不要换队列,这样就把n k的变成了n + k的 C++ const int maxn = 2e5 +
阅读全文
摘要:传送门 与Codeforces1107G一起食用 思路 想到要用dp……然后常规地设dp[i]为推倒前i个牌的最小花费 有两种情况:一是当前这个推,二是不推而被别人推。对于第一种,需要找到这个左推(因为扫到这里他是最后一个所以不用右推)的最远处,于是有了预处理每一位的最左边;对于第二种,巨弱鲁莽地优
阅读全文
摘要:常规的dp,当前有值且碰不到管子就转移,可以连跳的操作我就加了一维表示当前是不是连跳过来的。第二问前缀和即可得(不对啊边走边记录就行了吧我冗了Orz)。 C++ include include include using namespace std; const int maxn = 1e4 + 5
阅读全文
摘要:题目传送 记得这是我初学dp时的一道题 虽说就像LCS一样搞一搞即可 ~~但我还是写挂了qwq~~ C++ include include include using namespace std; char s[2005], t[2005]; int dp[2005][2005]; int main
阅读全文
摘要:自己水平太低,不丢人。 结论是最后选取的数后缀一定是若干个9,暴举即可。然而暴举也有暴举的艺术。 C++ ll n; ll dfs(ll n) { if (n == 0) return 1; if (n n; cout
阅读全文
摘要:Codeforces 1107一题除了dp做法还有二分带权匹配O(n^3)做法,国外网友的板子时间非常优秀,但矩阵设定的事情并不是很懂…… C++ //Codeforces 1107F const int maxn = 505; int n; ll a, b, k, Matrix[maxn][max
阅读全文
摘要:题目传送 做法 对于每个人,inc为x,pref为y;对于每道菜,p和s为x,b为y 于是根据题意有$$p[i] include include include include define rep(i, a, b) for (int i = a; i void read(T &x) { x = 0
阅读全文
摘要:pi只有0~5000且只找最小的没出现的,又要找不同club的,考虑二分匹配,左边pi,右边ci,一个匹配一个。离线倒着加边即可。
阅读全文
摘要:题目传送 推公式博客传送 推完式子就是去朴素地求就行了Orz C++ const int maxn = 1e5 + 5; const int mod = 1e9 + 7; int m, mu[maxn], vis[maxn], primes[maxn], tot; ll dp[maxn]; vect
阅读全文
摘要:bit扫描坐标套路题,注意有重复的点,莽WA了。 C++ const int maxn = 1e5 + 5; struct node { ll B, F, D; bool operator rhs.B; return F
阅读全文
摘要:答案只有n 1种暴举即可,对于每种,gcd是一那踩雷稳了,否则看雷的分布有没有把模余占满。
阅读全文
摘要:乍一看很唬人,草稿纸上多写几个发现规律:两个元音算一层,像剥洋葱一样,外面的其实都动不了,能变顺序的只有最里层的辅音。 C++ inline bool ok(char ch) { return ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || c
阅读全文
摘要:dp[i][j][k]表示第i位填数字k时,与后面的相连模数为j时,后面的数字最小填多少。 测得我提心吊胆还以为复杂度高了,结果出来46ms还是cf评测姬强啊。
阅读全文
摘要:笔者休息娱乐。贪心即可,爱怎么暴力怎么暴力。莽WA,改了几下算法发现是输出中二了…… C++ int T, color[26], tot; bool adj[26][26]; string s; void get(int cur) { set s; rep(i, 0, T 1) if (adj[cu
阅读全文
摘要:本来我就模拟和搜索恐惧症,场上乍一看调度来调度去的真的吓得没敢写。然鹅赛后听说别的队写得贼短就写了写,真的不难……嘤嘤嘤 C++ include include include include using namespace std; struct Others { int usage, recov
阅读全文
摘要:1.不会超过500个不同的串…… 2.样例没给has到has是怎么样的,实测是true。 3.记忆化别剪错枝就好,嘤嘤嘤…… C++ const int maxn = 505 + 5; int n, m, tot; string s, op, t; bool can[maxn][maxn][2],
阅读全文
摘要:树上每个割点计算一下各个size的组合相乘再相加为第一问答案,取最大的;再把本答案中最大的两个size相乘减掉,为第二问答案。 C++ const int maxn = 1e4 + 5; int n, size[maxn], ans, b; vector adj[maxn]; void dfs(in
阅读全文
摘要:dp[i][j][0/1]:第i天处于第j状态要不要吃。
阅读全文
摘要:其实我读题都懵逼……他给出一个素数p,让你设计一种加和乘的运算使得$$(m+n)^p = m^p+n^p$$ 答案是设计成%p意义下的加法和乘法,这样:$$(m+n)^p\ \%\ p = m+n$$$$m^p\ \%\ p=m$$$$n^p\ \%\ p=n$$ 所以$$(m+n)^p\ \%\
阅读全文
摘要:题目传送 官方题解说的很好了,剩下的就是读大佬代码了,前面是tarjan求SCC缩点图。我图论没学过,接下来删点是怎么操作看得有点头秃,直到我看到了%%% 安德鲁何 神仙的代码。 按照题面连通紫线以后,我们姑且先考虑从入度为0的点着手看看是否可行。由于都是入度为0的点,所以现在我们连的都是绿边。 假
阅读全文
摘要:题目传送 先给出设计dp的结论: dp[i][j]:以第i个位置、以rankj的数 拓展出去 的方案数。意会一下,我实在想不好语言…… 其中所谓rankj=真·rank\%11 找到拓展的规律,转移也就顺理成章了。不妨先看1~9拓展到的二位数里有哪些是合法拓展: $$Rank1\%11=1:所以数字
阅读全文
摘要:题目传送 贪心方法 按边从小到大扫,先凑3个,没凑足的记录一下数量,后面大的优先跟这些凑,俩带走一个,多余的再凑3个,再……就这样走到最后即可。
阅读全文
摘要:题目传送 排序看一看。 关键点在于发现性质: 算一个点的贡献时: 1.与后一个有重叠。$$当 a[i] + r = a[i + 1] + l, 即 r l = a[i + 1] a[i] 时$$a[i] 与 a[i+1] 重叠的部分,都算在a[i+1]里,则a[i]的贡献为:a[i+1] a[i]
阅读全文
摘要:表格和前面的字不要贴着行…… | 1 | 2 | 3 | | | | | | 嘤 | 嘤 | 嘤 | 多换一行就可以了。 1 | 2 | 3 | | 嘤 | 嘤 | 嘤
阅读全文
摘要:题目传送 虽然线段树比较显然但是发现a数组并不好维护。考虑将a转化为好维护的数组b。 方法 这里我将k[1]设为0,对应着$$a[1] + k[1] INF) { C++ include include include include using namespace std; typedef lon
阅读全文
摘要:可以变换坐标:x' = x, y' = y - x ^ 2,如此之后可得线性函数x' * b + c = y',可以发现两点连边为抛物线,而其他点都在这条线下方才满足题意,故而求一个上凸壳即可。
阅读全文
摘要:1.先预处理出在循环中某数前面的数是谁。 2.读入a数列时贪心选取最晚的父亲。 3.链上倍增预处理二进制祖先。 4.对于每个位置,预处理第n-1个祖先位置最早要从哪里开始,技巧上再顺手与前一位的最早位置取max,尽量缩小区间。 5.查询已经可做。
阅读全文
摘要:队友和大佬都什么几种情况啥的……我是把终点都插了,起点随便选一个,暴举答案莽A。
阅读全文
摘要:怎么就没人解释一下为啥用b排序可以保证正确性呢……太菜了,理解了好久。 时间流逝价值会丢失的背包,类似题洛谷1417 本题与洛谷1417不同之处在于流逝是有截止的。 1.这个dp[j]的含义是:最后跑路时欠了j个费所得到的最大钱数。 2.假设是不排序的,直接去背包,考虑两种转移,一种是选了当前这个以
阅读全文
摘要:听队友说过结论:a^n + b^n = c^n在n > 2时无解。 勾股那里本菜数学不好直接暴举了Orz。 跟大家学一波勾股数的构造:a是奇数时,tmp = a / 2; b = (tmp + 1) * tmp * 2; c = b + 1; 举例:5、12、13. a是偶数时,tmp = a /
阅读全文
摘要:题目传送 官方题解 A.官方说是随机数据所以暴力线段树…… #include <bits/stdc++.h> using namespace std; const int maxn = 1e5 + 5; int N, L; class SegmentTree { public: #define ls
阅读全文
摘要:这个数位dp倒是没什么限制条件,只是需要在过程中把每个数字出现次数记录一下即可。记忆化返回时数学算出。框架还是套板子。
阅读全文
摘要:数位dp第二道~就当成搜索,套板子写了写。我写的dp[pos][pre][state0]记录的是当前pos位没有限制时、前面的数是pre时、前面是否都是0时的方案数。
阅读全文
摘要:喜闻乐见的数位入门第一道,这个dp[pos][state]记录的是第pos位如果没有限制的话(有限制当然要搜一搜暴力数了),前一位 放6 or 不放6 的方案数。也就是并不是要求的答案,其实就是记忆化一下,减小搜索的复杂度,跟dp没啥关系吧……
阅读全文
摘要:关键点在于:全排列中,任意两点u、v相邻的次数一定是(n - 1)! * 2次,即一个常数(可以由高中数学知识计算,将这两个点捏一起然后全排列然后乘二;或者用n! / C(2, n))。 这之后就好算了,每条边算一下子树size对吧,乘法原理就是贡献次数,乘以边权加一起就行了。 所以不是dfs就行了
阅读全文
摘要:Update:smz说regex秒过Orz,yzd记在这里了。 听说今年天梯赛有个烦人的模拟,我便被队友逼着试做一下……一发15,二发20.记一记,要不然枉费我写这么久…… 自己还是代码能力太菜了,校内大佬依旧随手A过去,你吉老师该AK还是AK…… 调调改改的,很丑,懒得优化写法了。 大概思路就是先
阅读全文
摘要:据说这题是种dp的套路?然后被我国红名神仙(南大Roundgod)贪心了,不过思路上非常相近了,故而可贪吧。 设的dp[i][0]是:如果把第i个数放在上升序列里了,那么下降序列结尾的那个最大是多少;同理,dp[i][1]是:如果把第i个数放在下降序列里了,那么上升序列结尾的那个最大是多少。 个人y
阅读全文
摘要:发现奇环不可行,偶环可行,考虑二分图。然后染色,方向全都从一种指向另一种就可以了,随意。
阅读全文
摘要:题目传送门 性质是:把节点dfs序以后,异象石按这个序号排序,然后相邻两两求树上距离,这些距离的和除以二就是最小斯坦纳树。 插入删除的具体操作是根据我们上述性质,用一个set维护dfn,比如插入x,则ans加上:(set里的,即之前已经插进来的)左x + x右 - 左右。
阅读全文