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