08 2018 档案
摘要:【题解】 直接做树形DP即可。f[i]表示取i及其子树的最大的美丽指数,若某个儿子son满足f[son]>0,f[i]就加上f[son]. 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define LL long l
阅读全文
摘要:【题意概述】 对一个1到n的排列做m次区间排序,最后询问位置q上面的数。 【题解】 区间排序的效率是nlogn,所以暴力做的话效率是mnlogn,显然达不到要求。 我们考虑二分答案。如果某个位置的数比mid小,就设为0,如果么某个位置的数大于等于mid,就设为1. check的时候我们只需对01序列
阅读全文
摘要:【题解】 二分答案,贪心check. 然后根据二分出来的答案去计算每个人抄写的部分,注意要让前面的人少抄写,所以从后往前贪心即可。 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define LL long long
阅读全文
摘要:【题解】 经典的最大子段和问题。如果当前sum大于等于0,就累加上当前的数;当前的sum小于0,就把sum变为0,即之前的那些都不取,因为它们对答案的贡献是负的。扫一遍即可。 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4
阅读全文
摘要:【题解】 两个人面对面碰见,然后转身继续走,这一过程可以看做两个人对穿而过。那么这道题其实就是简单的贪心题,每个人选择远的一边走就可以求出最大值,反之可以求出最小值。 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #de
阅读全文
摘要:【题意概述】 给一棵以1为根的树,树上的每个节点有一个ai值,代表它可以传送到自己的ai倍祖先,如果不存在则传送出这棵树。现在询问某个节点传送出这棵树需要多少步。 【题解】 其实是把“弹飞绵羊”那道题从序列上搬到了树上,解法其实类似。 我们可以用LCT维护传送的关系,若点i存在ai倍祖先,那么就把他
阅读全文
摘要:【题解】 区间DP. 设f[i][j]表示i~j的最小代价。再枚举中间点k,很容易想到转移方程为f[i][j]=min(f[i][j],f[i][k]+f[k][j]),同时如果i~k可以通过重复获得i~j,那么f[i][j]=min(f[i][j],f[i][k]+len(x)+2),这里的len
阅读全文
摘要:【题意概述】 给出n个01串组成的字典和m个询问,每次询问某个01串和多少个字典中的串有相同的前缀。(前缀长度是两串中较小的部分) 【题解】 直接上Trie树即可。树上每个节点记录两个信息:这个节点有多少个串经过,这个节点是多少个串的结尾。 1 #include<cstdio> 2 #include
阅读全文
摘要:【题解】 因为n很小,直接弗洛伊德就可以了。按照询问来做弗洛伊德,把两次询问之间新修好的点拿来当中继点,更新其他点的答案,并回答询问。 1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #define LL long lon
阅读全文
摘要:【题意概述】 有n只狼要杀,杀每只狼的代价是它的攻击值加上它相邻的存活的狼的附加值。求最小的代价。 【题解】 区间DP. 设f[i][j]为杀掉i~j的狼的最小代价,可以推出状态转移方程为f[i][j]=min(f[i][k]+f[k+1][j]+a[k]+b[i-1]+b[j+1]),枚举区间长度
阅读全文
摘要:【题意概述】 有n个位置,每个位置可以放F或者M,规定一种合法的放置方案为不存在单独的F(即每个F的左边或者右边必须至少有一个F),问有多少种放置方案。 【题解】 假设有一种合法的放置方案,有n-1个位置,那么我们在末尾多放一个M,必定是一个合法的方案。(放F则不一定) 有n-2个位置的合法放置方案
阅读全文
摘要:【题解】 暴力枚举添加字符的位置,然后判断去掉这个位置的字符串是否有由两个相同的串拼接而成。本题的n的范围为200W,暴力判断会TLE,所以要使用哈希。 1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #include<m
阅读全文
摘要:【题解】 活捉大水题。 这道题并不涉及什么决策。最左边的那一堆纸牌如果与平均数不相等,就必须是第二堆纸牌进行调整,然后第二堆纸牌就变成了第一堆。从左到右进行一遍即可。 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #de
阅读全文
摘要:【题解】 本题要求求出区间内的各个元素通过加减之后能够得出的最小的数,那么根据裴蜀定理可知答案就是区间内各个元素的最大公约数。 那么本题题意化简成了维护一个序列,支持区间加上某个数以及查询区间元素的最大公约数。 我们要证明这样一个定理: 对于一个序列(a,b,c,d,...),gcd(a,b,c,d
阅读全文
摘要:【题解】 很容易想到暴力做法:对于每个询问暴力查找区间内的最小字母,统计其出现次数。效率O(N^2),无法通过全部数据。 我们可以换一个思路,设f[i][j]为第i个字母(字母‘A'到’Z'分别对应0到25)到第j个位置的出现次数和。 对于每个询问[L,R],我们只要从0到25枚举每个字母,如果满足
阅读全文
摘要:【题解】 二分答案。check的时候如果ai>A*mid,就把sum加上[(ai-A*mid)/B]上取整,最后判断sum是不是小于二分出来的最小时间mid即可。 1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #defi
阅读全文
摘要:【题解】 我们设原来的数组为a1,a2,a3..., 那么一次操作之后的数组变为a1+a2,a2+a3,a3+a4..., 两次操作之后数组变为a1+2a2+a3,a2+2a3+a4,a3+2a4+a5..., 三次操作之后数组变为a1+3a2+3a3+a4,a2+3a3+3a4+a5..., 有没
阅读全文
摘要:【题解】 很容易想到DP方程:f[i]+=f[i-a[i]] 1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #define LL long long 5 #define rg register 6 #define N 2
阅读全文
摘要:【题意概述】 给出三行字符串,前两行代表密码与明文的对应关系,第三行为待翻译的文本。要求按照对应关系翻译文本。 【题解】 直接模拟即可。 注意判断Failed的情况。 1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #de
阅读全文
摘要:【题意概述】 给出一个图,点有正点权,边有正边权,通过两点的代价为两点间的最短路加上路径通过的点的点权最大值。 有M个询问,每次询问通过两点的代价。 【题解】 先把点按照点权从小到大排序,然后按照这个顺序跑floyed. 这样的话当前路径i-->k-->j的点权最大值只会在i,j,k中产生,用一个a
阅读全文
摘要:【题解】 这道题除去根操作就是普通的树链剖分了。但是有换根操作怎么处理呢? 我们可以发现如果现在的根不在查询的点的子树里,那么对本次查询没有影响。如果现在的跟在查询的点x的子树里,那么答案将变为整棵树除去现在的根root所属的x的孩子的子树。 为了快速确定root属于x的哪一个孩子,我们可以写个倍增
阅读全文
摘要:【题解】 分别做一遍最长上升序列和最长下降序列,再枚举峰的位置计算答案即可。 1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #define LL long long 5 #define rg register 6 #de
阅读全文
摘要:【题解】 排个序然后扫一遍进行统计即可。 1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #define LL long long 5 #define rg register 6 #define N 200010 7 us
阅读全文
摘要:【题解】 我们要做的就是把这些数排序。排序的时候判断两个数是否交换的方法,就是把这两个数相接形成两个长度相同的数字,比较这两个数字的大小。 1 #include<cstdio> 2 #include<algorithm> 3 #include<cstring> 4 #define N 200010
阅读全文