摘要:
来自Blogewoosh #6。 啃了一下,写个翻译吧。 问题:你有一个数组,你不知道每个元素的大小,但是能够提出询问:a[x]是否>=v?你需要找出这个数组的最大值,只能询问n + lognlogV次。 我们首先随机一个排列,按照这个顺序来询问。 记录一个前缀最大值。如果当前值大于前缀最大值,就暴 阅读全文
摘要:
解:splay维护括号序列,就是进子树一次出子树一次。树上每个点直接记录这两个点的编号。 建树的时候按照分配的编号建树。 1 #include <bits/stdc++.h> 2 typedef long long LL; 3 #define gc pa==pb&&(pb=(pa=buf)+frea 阅读全文
摘要:
D:题意:树上每个顶点有个权值,求最长链,满足链上gcd > 1 解:对每个质数建虚树,每个点只会拆成log个点,所以是log2的。 1 #include <bits/stdc++.h> 2 3 const int N = 200010; 4 5 struct Edge { 6 int nex, v 阅读全文
摘要:
我也不知道哪里蒯来的题。反正二分 + 2-sat + 线段树优化连边就完事了。 注意答案可能为0.. 1 #include <bits/stdc++.h> 2 3 const int N = 100010; 4 5 struct Edge { 6 int nex, v; 7 }edge[300001 阅读全文
摘要:
题意:给定n个区间,每个区间有颜色。m次询问,每次询问:这n个区间中所有被包含在[x, y]这一区间中的区间,它们的颜色是否取遍了[l, r]中的所有颜色。 强制在线。 解:第一步是大家都熟悉的套路⑧,把这些区间按照左端点排序。 然后从右往左加区间,用一个可持久化数据结构维护答案。 然后我在这里就被 阅读全文
摘要:
解:搜索...... 我们可以每次选择分支少的搜索,或者说,贪心的搜索当前更优的决策。 每一层把能剪的点搞出来,按照度数/SIZ排序,然后依次搜索。加个最优化剪枝就完事了。 1 #include <bits/stdc++.h> 2 3 const int N = 310, INF = 0x3f3f3 阅读全文
摘要:
无向简单图上给定s,t。每秒s先向t按照最短路走两步(优先节点编号较小的),然后t随机行动一步。 问期望多少秒相遇。n <= 1000 解: 这个s太蛇皮了...所以预处理一波。 然后不会,看题解发现是SB记忆化搜索...... 1 #include <bits/stdc++.h> 2 3 cons 阅读全文
摘要:
我觉得这道题非常有前途....... 题意:给定一个填了一半的数组,你要把它补完,使之不存在奇回文串,求方案数。字符集为k。 n,k<=20w 解:不能有长为三的回文串。也就是不能有两个相隔1的数相同。 发现奇偶下标互相独立,抽出来就是不能有两个相邻的数相同。 我们可以设f[i][0]表示第i位填的 阅读全文
摘要:
给你n个二元组,选出不多于k个满足第一维的min乘上第二维的sum最大。 傻逼题,按第一维排个序然后对顶堆求第二维前k大之和就没了。 1 #include <bits/stdc++.h> 2 3 typedef long long LL; 4 const int N = 300010; 5 6 st 阅读全文
摘要:
解:考场上爆0了...... 回想怎么求两个排列的最长公共子序列。 回想怎么求1~n每个数恰出现两次的两个序列的最长公共子序列。就是每个数替换为它在另一个序列里的出现位置,降序。 所以我们可以把这每个空位都倒序填入m个数,然后暴力,最后输出方案。 考虑优化。发现在每个空位的时候,这m个数都是单降的。 阅读全文