09 2018 档案

摘要:【题解】 求一个序列的LIS有一个二分做法是这样的:f[i]表示长度为i的上升序列中最后一个数最小可以是多少,每次二分大于等于当前数字x的f[j],把f[j]修改为x;如果找不到这样的f[j],那就把长度加一并记录新的f(即f[++len]=x) 现在我们把这个做法放到树上,同样是可以做的。我们用s 阅读全文
posted @ 2018-09-27 16:57 Driver_Lao 阅读(151) 评论(0) 推荐(0) 编辑
摘要:【题解】 很容易想到这是一个DP,f[i][j][k][l]表示4种卡片分别用了多少张,那么转移方程就是f[i][j][k][l]=Max(f[i-1][j][k][l],f[i][j-1][k][l],f[i][j][k-1][l],f[i][j][k][l-1])+a[i+j*2+k*3+l*4 阅读全文
posted @ 2018-09-17 20:17 Driver_Lao 阅读(234) 评论(0) 推荐(0) 编辑
摘要:【题解】 枚举n的各个因数作为段长,O(n)判断每一段内是否有山峰即可。 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cmath> 5 #define LL long long 6 #define r 阅读全文
posted @ 2018-09-16 20:07 Driver_Lao 阅读(206) 评论(0) 推荐(0) 编辑
摘要:【题解】 很显然在一条坐标轴上到各个点距离之和最小的点就是它们的中位数。怎么证明呢?我们假设现在找的某个点x左边有a个点,右边有b个点(a>b)。我们把x向左移动d个单位,并保证x左边依然有a个点,右边依然有b个点,那么现在距离之和减小了ad-bd. 那也就是说,x左右的点数不一样,我们可以通过移动 阅读全文
posted @ 2018-09-16 18:16 Driver_Lao 阅读(205) 评论(0) 推荐(0) 编辑
摘要:1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define LL long long 5 #define rg register 6 #define N 200010 7 using namespace std; 8 阅读全文
posted @ 2018-09-15 20:17 Driver_Lao 阅读(126) 评论(0) 推荐(0) 编辑
摘要:【题解】 我们可以发现每一对可以匹配的左右括号一定是一一对应的,那么我们用一个栈维护即可。如果当前是右括号,栈顶是左括号,那么一定有1的贡献,还要加上之前到达过top-1这个位置多少次,因为现在这一对括号可以和之前的那些组成更长的序列。 1 #include<cstdio> 2 #include<c 阅读全文
posted @ 2018-09-11 19:39 Driver_Lao 阅读(148) 评论(0) 推荐(0) 编辑
摘要:【题解】 我们可以很快发现当n是奇数的时候答案就是n*(n-1)*(n-2),因为这三个数一定两两互质,因为它们中只有n-1是2的倍数,而其它数的倍数的周期都比3长,所以也不可能有别的大于2的公因数。当n是偶数的时候怎么办呢?当n不是3的倍数的时候答案是n*(n-1)*(n-3),这里避开(n-2) 阅读全文
posted @ 2018-09-06 18:46 Driver_Lao 阅读(181) 评论(0) 推荐(0) 编辑
摘要:【题解】 设满足前后两个元素之差为1的最长上升子序列LIS的长度为m,那么本题的答案即为n-m. 证明: 1,n-m次移动一定可以让序列递增。设LIS的第一个数为i,最后一个数为j,我们按照i-1到1的递减的顺序把这些数调换到第一个位置,它们就排好序了。同理处理j+1到n. 总共需要n-m次移动。 阅读全文
posted @ 2018-09-05 21:29 Driver_Lao 阅读(186) 评论(0) 推荐(0) 编辑
摘要:【题解】 排序,然后枚举前两个数,再用类似two pointer的思想扫第三个数即可,不需要二分。复杂度n方。 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #include<cmath> 5 #define LL lo 阅读全文
posted @ 2018-09-02 09:27 Driver_Lao 阅读(175) 评论(0) 推荐(0) 编辑
摘要:【题解】 二重循环枚举起始列和终止列,竖着往下加,转化为一个最大子段和问题,逐行累加即可。 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define LL long long 5 #define N 1000 6 # 阅读全文
posted @ 2018-09-01 23:00 Driver_Lao 阅读(201) 评论(0) 推荐(0) 编辑
摘要:【题解】 先把数字两两组合,问题转化为求a+b=0. 这个问题显然可以排序后two pointer做。需要注意选出来的两个数必须由4个不同位置的数组成,不能重复。 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #defi 阅读全文
posted @ 2018-09-01 22:37 Driver_Lao 阅读(157) 评论(0) 推荐(0) 编辑
摘要:【题解】 dp转移的时候记录一下,然后倒着推出答案即可。 1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 #define LL long long 5 #define rg register 6 #define N 200 阅读全文
posted @ 2018-09-01 20:57 Driver_Lao 阅读(176) 评论(0) 推荐(0) 编辑