05 2019 档案

摘要:Professor GukiZ and Two Arrays 题解: 将a数组都sort一遍之后, b数组也sort一遍之后。 可以观察得到 对于每一个ai来说, 整个数组bi是一个V型的。 并且对于ai+1的最优解一定是在ai的右边。 然后我们将a数组 和 b数组枚举一遍。 然后再将a数组22组合 阅读全文
posted @ 2019-05-24 10:49 Schenker 阅读(179) 评论(0) 推荐(0)
摘要:代码: int e[50][50]; int cnt[N], group[N], sta[N], ans; int n; bool dfs(int u, int deep){ for(int i = u + 1; i <= n; ++i){ if(cnt[i] + deep <= ans) retu 阅读全文
posted @ 2019-05-24 09:47 Schenker 阅读(164) 评论(0) 推荐(0)
摘要:Helping Hiasat 题解: 如果我们把连续的2出现的人都相互连边的话, 题目就是问最大独立集的答案是多少。 求最大独立集可以将图变成反图, 然后求最大团。 代码: #include<bits/stdc++.h> using namespace std; #define Fopen freo 阅读全文
posted @ 2019-05-24 09:40 Schenker 阅读(174) 评论(0) 推荐(0)
摘要:Big Secret 题解: 若 cur ^ x > cur 则 x2进制下最高位的1 所对应cur的那个位置是0, 否则数字一定变小。 我们可以将每个数的最高位找出来。 然后我们从低位去check某位是不是0。 虽然对于每个数来说都只要考虑最高位就好了, 但是相对的最高位会影响比他低位置的数, 低 阅读全文
posted @ 2019-05-22 16:06 Schenker 阅读(212) 评论(0) 推荐(0)
摘要:Kuro and GCD and XOR and SUM 题解: 对于每个值先找到所有的因子。 然后每次add的时候,在他的所有因子都加入这个数。 然后询问的时候询问这个数的因子所构成的字典树。 代码: #include<bits/stdc++.h> using namespace std; #de 阅读全文
posted @ 2019-05-22 13:02 Schenker 阅读(196) 评论(0) 推荐(0)
摘要:Beautiful Subarrays 题解: 把数字转化成2进制之后,用字典树去维护。 想到字典树之后就应该是一道很容易写的题目了。 代码: #include<bits/stdc++.h> using namespace std; #define Fopen freopen("_in.txt"," 阅读全文
posted @ 2019-05-20 16:36 Schenker 阅读(284) 评论(0) 推荐(0)
摘要:st-Spanning Tree 题解: 将除了s, t以外的点相联通的点缩成一个点。 然后将将这些点和分类, 1. 只和s相连, 2 只和t相连 3.同时和s, t相连。 对于1 2来说将他们都连到对应的点上去。 对于3来说,则是能连s就连s, 能连t就连t。 为了保证s, t联通, 我们将第3种 阅读全文
posted @ 2019-05-19 17:34 Schenker 阅读(179) 评论(0) 推荐(0)
摘要:Time to Raid Cowavans 题意: 询问 下标满足 a + b * k 的和是多少。 题解: 将询问分块。 将b >= blo直接算出答案。 否则存下来。 存下来之后,对于每个b扫一遍数组,然后同时处理相同b的询问。 代码: #include<bits/stdc++.h> using 阅读全文
posted @ 2019-05-18 16:20 Schenker 阅读(218) 评论(0) 推荐(0)
摘要:Glad to see you! 题解: 交互题一般都是需要用二分去完成。 在二分时候每次检查左边和右边哪边会和答案更近, 然后在更近的那段新区间去重复检查, 知道区间长度为1。 在检查的时候,可以使得答案更近贴近于左边,或者右边。 代码: #include<bits/stdc++.h> using 阅读全文
posted @ 2019-05-18 15:27 Schenker 阅读(237) 评论(0) 推荐(0)
摘要:Partial Sums 题解: 一个数列多次前缀和之后, 对于第i个数来说他的答案就是 唯一注意的就是这个k会到1e9。 观察可能,其实我们最多也就用了n个组合数, 并且这个C(n, m) 的 m 足够小。 所以我们可以根据定义先把这几个组合数先预处理出来。 代码: #include<bits/s 阅读全文
posted @ 2019-05-18 14:14 Schenker 阅读(305) 评论(0) 推荐(0)
摘要:Number Transformation II 题解: 对于操作2来说, a - a % x[i] 就会到左边离a最近的x[i]的倍数。 也就是说 [ k * x[i] + 1, (k+1)* x[i] -1 ]这段区间的的数都会走到 k * x[i]上。 所以对于每个位置都先计算出他到右边最远的 阅读全文
posted @ 2019-05-18 12:47 Schenker 阅读(192) 评论(0) 推荐(0)
摘要:Bear and Polynomials 题解: 如果改变一个其中的一个数,那么需要知道的是,前面的数都可以进到当前位来,如果过不来的话,那么就会因为前面有数导致无法变成0。 所以我们将前面的数不断向高位转移,找到第一个不能往上进位的位置, p。 现在只有在0 <= i <= p 的时候才有解。 然 阅读全文
posted @ 2019-05-18 10:45 Schenker 阅读(212) 评论(0) 推荐(0)
摘要:Martian Strings 题解: 对于询问串, 我们可以从前往后先跑一遍exkmp。 然后在倒过来,从后往前跑一遍exkmp。 我们就可以记录下 对于每个正向匹配来说,最左边的点在哪里。 对于每个反向匹配来说,最右边的点在哪里。 然后判断可不可以构成这个串就好了。 代码: #include<b 阅读全文
posted @ 2019-05-17 17:28 Schenker 阅读(301) 评论(0) 推荐(0)
摘要:Sum of Medians 题解: 对于这个题目,先想到是建立5棵Splay,然后每次更新把后面一段区间的树切下来,然后再转圈圈把切下来的树和别的树合并。 但是感觉写起来太麻烦就放弃了。 建立5棵线段树。 然后 seg[rt][i]代表的是只考虑当前所管辖的区间中的情况下, 下标对5取余之后为 i 阅读全文
posted @ 2019-05-17 16:39 Schenker 阅读(155) 评论(0) 推荐(0)
摘要:Coloring Brackets 题解: dp[ l ] [ r ] [ lc ] [ rc ] 代表的是第在区间[ l , r] 的情况下 左端点颜色是lc, 右端点颜色是rc的方案数是多少。 然后记忆化DP。 将一个序列拆成一个个匹配的序列。 为了防止一开始序列不匹配,所以从2个虚拟的地方开始 阅读全文
posted @ 2019-05-17 14:29 Schenker 阅读(131) 评论(0) 推荐(0)
摘要:Om Nom and Necklace 题意: 询问每个前缀是否能构成A + B + A + ...+ B + A这个形式。 题解: 首先要明白的是KMP求最小循环节,然后算出前面有多少个重复的串。 一个串有2种构成方式: 1. SSSSSS, 及这个串刚好是全由S构成的的,一共z个S。 需要明白的 阅读全文
posted @ 2019-05-16 23:43 Schenker 阅读(193) 评论(0) 推荐(0)
摘要:High Cry 题解: 把思路转换成总-非法方案数。 对于第i个点来说 找到L[i], R[i] 然后 对于所有的在[ L[i], R[i] ] 的值都 < a[i], 然后对于第i个点来说 在 [L[i], i]这段区间中找到最大的x使得 a[x] | a[x+1] | ... | a[i] > 阅读全文
posted @ 2019-05-16 17:47 Schenker 阅读(142) 评论(0) 推荐(0)
摘要:The hat 题解: 定义d[i]为第i个数和他对面的差值。 然后我们可以发现d[i]和d[i+1]的差值只会有3种情况2, -2, 0。 并且可以知道 d[i] = - d[i+n/2] 所以如果一开始n = 4 * k 即 d[1] 是偶数的话, 一定有d[i] = 0的情况。 如果d[l] 阅读全文
posted @ 2019-05-16 11:43 Schenker 阅读(146) 评论(0) 推荐(0)
摘要:今天目标10题达成。ε=ε=ε=(~ ̄▽ ̄)~ 。 总结一下今天: 1: Strictly Positive Matrix 代码: #include<bits/stdc++.h> using namespace std; #define Fopen freopen("_in.txt","r",std 阅读全文
posted @ 2019-05-15 22:59 Schenker 阅读(154) 评论(0) 推荐(0)
摘要:Ice cream coloring 题解: 这个题目中最关键的一句话是, 把任意一种类型的冰激凌所在的所有节点拿下来之后,这些节点是一个连通图(树)。 所以就不会存在多个set+起来之后是一个新的完全图。 所以只要直接去做就好了。 对于每个节点来说,染色。 代码: #include<bits/st 阅读全文
posted @ 2019-05-15 13:49 Schenker 阅读(123) 评论(0) 推荐(0)
摘要:Sereja and the Arrangement of Numbers 题解: ummm。 在一副图中,如果全部点的度数是偶数/只有2个点是奇数,则能一笔画。 考虑图的点数k为奇数的时候,那么每个点的度数都是偶数点,所以就是可以一笔画,答案为 1 +k * (i - kll) / 2; k为偶数 阅读全文
posted @ 2019-05-15 11:57 Schenker 阅读(145) 评论(0) 推荐(0)
摘要:Restore Cube 题解: x->yyy 其实就是把x代替成yyy这个值。 如果不好理解的话, 可以试想一下, 刚开始的话 0->0, 1->1, 2->2,...,9->9. 现在有一条指令 1->23 那么就是就是0->0, 1->23, 2->2,...,9->9. 现在又有一条指令2- 阅读全文
posted @ 2019-05-15 10:51 Schenker 阅读(191) 评论(0) 推荐(0)
摘要:Strictly Positive Matrix 题解: 如果原来的 a[i][j] = 0, 现要 a[i][j] = 1, 那么等于 sum{a[i][k] + a[k][j]} > 1。 如果把a[i][j]视作 i -> j 是否能达到。 那么对于上述的那个方程来说,相当于 i先走到k, k 阅读全文
posted @ 2019-05-15 09:57 Schenker 阅读(121) 评论(0) 推荐(0)
摘要:Magic Numbers 题意: 题意比较难读:首先对于一个串来说, 如果他是d-串, 那么他的第偶数个字符都是是d,第奇数个字符都不是d。 然后求[L, R]里面的多少个数是d-串,且是m的倍数。 题解: 数位dp。 dp[x][y]代表的是余数为x, 然后剩下的长度是y的情况的方案数是多少。 阅读全文
posted @ 2019-05-14 17:02 Schenker 阅读(154) 评论(0) 推荐(0)
摘要:Iahub and Permutations 题解: 令 cnt1 为可以没有限制位的填充数字个数。 令 cnt2 为有限制位的填充数字个数。 那么:对于cnt1来说, 他的值是cnt1! 然后我们对cnt2进行dp。 对于任意一个新加进来的数字,我们可以令一个一个没有限制位数放在这里, 那么新加进 阅读全文
posted @ 2019-05-13 21:54 Schenker 阅读(230) 评论(0) 推荐(0)
摘要:Underground Lab 题解: 如果遍历一棵树,我们可以发现最多需要走的步数也不会超过2 * n步。 所以我们选出一棵树,然后遍历一边这颗树。 然后把序列分成k块就好了。 代码: #include<bits/stdc++.h> using namespace std; #define Fop 阅读全文
posted @ 2019-05-13 16:25 Schenker 阅读(284) 评论(0) 推荐(0)
摘要:[HNOI2008]玩具装箱toy 斜率优化dp: 好久没有写斜率优化dp都忘记了这个东西到底是怎么回事。 对于斜率优化dp来说, 我们可以将一个 转移方程转换成 y = k x + b. 其中要求的东西在b上。 注意: 现在是给定了一堆点(x,y), 让你在固定k的前提下求出最小/最大的b是多少。 阅读全文
posted @ 2019-05-13 12:15 Schenker 阅读(146) 评论(0) 推荐(0)
摘要:Complete The Graph 题解: 比较特殊的dij的题目。 dis[x][y] 代表的是用了x条特殊边, y点的距离是多少。 然后我们通过dij更新dis数组。 然后在跑的时候,把特殊边都先当做1在跑,并且经过特殊边的时候,记得将x更新。 然后如果dis[0][t] < L 则代表不用特 阅读全文
posted @ 2019-05-12 21:17 Schenker 阅读(154) 评论(0) 推荐(0)
摘要:Anton and School - 2 题解: 枚举每个左括号作为必选的。 那么方案数就应该是下面的 1 , 然后不断化简, 通过范德蒙恒等式 , 可以将其化为一个组合数。 代码: #include<bits/stdc++.h> using namespace std; #define Fopen 阅读全文
posted @ 2019-05-12 19:13 Schenker 阅读(194) 评论(0) 推荐(0)
摘要:Lipshitz Sequence 题解: 可以通过观察得到,对于任意一个区间来说, 只有相邻的2个点的差值才会是区间的最大值。 具体观察方法,可以用数学分析, 我是通过画图得到的。 那么基于上面的观察结果。 对于一次询问, 我们可以枚举右端点, 然后, 不断的把右端点往右边移动, 然后把新的值加进 阅读全文
posted @ 2019-05-12 17:10 Schenker 阅读(171) 评论(0) 推荐(0)
摘要:Three Statesy 题解: 以3个大陆为起点,都dfs一遍,求出该大陆到其他点的最小距离是多少, 然后枚举每个点作为3个大陆的路径交点。 代码: #include<bits/stdc++.h> using namespace std; #define Fopen freopen("_in.t 阅读全文
posted @ 2019-05-12 13:03 Schenker 阅读(141) 评论(0) 推荐(0)
摘要:Super M 题解: 定义 dp[u][0] 为遍历完u中的所有节点, 但不回到u点的路径花费值。 定义 dp[u][1] 为遍历完u中的所有节点, 且要回到u点的路径花费值。 转移方程. dp[u][1] = sum(dp[v][1] + 2). dp[u][0] = max(dp[v][1] 阅读全文
posted @ 2019-05-11 15:26 Schenker 阅读(212) 评论(0) 推荐(0)
摘要:Friends and Subsequences 题解: 如果左端点来说, 那么对于a[i]来说是向上的一条折线, b[i]来说是向下的一条折线, 那么如果这2个折线求交点个数的话, 我们可以二分去求第一个 a[i] == b[i] 的地方, 求最后一个a[i] == b[i]的地方。 代码: #i 阅读全文
posted @ 2019-05-10 14:06 Schenker 阅读(202) 评论(0) 推荐(0)
摘要:Little Pony and Harmony Chest 题解: 因为 1 <= ai <= 30 所以 1 <= bi <= 58, 因为 59 和 1 等效, 所以不需要59。 [1, 58]只有16个质数,对于这16个质数去状压。 对于1->58的数,我们计算出每个数对于质数来说的状态,然后 阅读全文
posted @ 2019-05-08 23:14 Schenker 阅读(258) 评论(0) 推荐(0)
摘要:Ant colony 题解: 因为一个数是合法数,那么询问区间内的其他数都要是这个数的倍数,也就是这个区间内的gcd刚好是这个数。 对于这个区间的gcd来说,不能通过前后缀来算。 所以通过ST表来询问这个区间的gcd。 那么题目就变成了询问一个区间内有多少个k。 我们对于每个数都离散化之后,在相应的 阅读全文
posted @ 2019-05-08 22:08 Schenker 阅读(174) 评论(0) 推荐(0)
摘要:int Log[N]; struct ST { int dp[N][20], a[N]; void init(int n) { for(int i = -(Log[0]=-1); i < N; i++) Log[i] = Log[i - 1] + ((i & (i - 1)) == 0); for( 阅读全文
posted @ 2019-05-08 22:01 Schenker 阅读(123) 评论(0) 推荐(0)
摘要:Appleman and Tree 题解: 定义dp[u][1] 为以u的子树范围内,u这个点已经和某个黑点相连的方案数。 dp[u][0] 为在u的子树范围内, u这个点还未和某个黑点相连的方案数。 转移方程: 如果 u为黑点, dp[u][0] = 0, dp[u][1] = 1, 然后考虑从下 阅读全文
posted @ 2019-05-08 15:44 Schenker 阅读(187) 评论(0) 推荐(0)
摘要:题目传送门 题意:求树上路径可修改的第k大值是多少。 题解:CDQ整体二分+树刨。 每一个位置上的数都会有一段持续区间 根据CDQ拆的思维,可以将这个数拆成出现的时间点和消失的时间点。 然后通过整体二分第k大思路 + 树炮询问路径上出现点的个数就好了。 说一下整体二分的思路。 先假设第k大的值是mi 阅读全文
posted @ 2019-05-03 17:08 Schenker 阅读(179) 评论(0) 推荐(0)
摘要:1. kmp 相当于往前求出一段字符信息,使得 这段字符信息和前缀相等。 void getnext(){ int k = -1, j = 0; nx[0] = -1; while(j < m){ if(k == -1 || b[j] == b[k]) nx[++j] = ++k; else k = 阅读全文
posted @ 2019-05-02 16:26 Schenker 阅读(261) 评论(0) 推荐(0)