摘要:
题意:N个点的一棵带权树。切掉某条边的价值为切后两树直径中的最大值。求各个边切掉后的价值和(共N-1项)。 解法一: 强行两遍dp,思路繁琐,维护东西较多: dis表示以i为根的子树的直径,dis2表示切掉以i为根的子树后的直径。 第一遍dp,记录 down[][0]:从i结点向下的最大距离 dow 阅读全文
摘要:
某次投了阿里算法岗玩,有一道题是这样的: 某张试卷有20题,做对一个得5分,做错一个得-3分,不做得0分。问:最后得分有几种情况? 随便写个程序暴力算一下即可。 那么如果范围比较大应该怎么办? 今天看《组合数浅谈》(王连笑著,哈尔滨工业大学出版社)里有讲解法。 设有n道题,评分标准如下:每道题答对得 阅读全文
摘要:
题意:给定n个数字,你可以从中选出一个数A(不能对该数进行修改操作),并对其它数减小至该数的倍数,统计总和。问总和最大是多少? 题解:排序后枚举每个数作为选出的数A,再枚举其他数, sum += a[i]-a[i]%A;复杂度为O(n^2), 爆炸。 显然应该降至O(nlogn). 枚举每个数a[i 阅读全文
摘要:
题意:给一个序列,可以进行若干次操作,每次操作选择一个数让它+1或-1,问最少要几次操作使得序列变为严格单调递增序列。 题解:首先考虑非严格递增序列,则每个数字最终变成的数字一定是该数组中的某个数。那么O(n^2)复杂度dp一下即可。 dp[i][j]表示第i个数变成第j小的数,dp[i][j] = 阅读全文
摘要:
题目链接 题意:给定一棵n个结点的树,问:对于每个结点,能否通过删除一条边并添加一条边使得仍是树,并且删除该结点后得到的各个连通分量结点数 <= n/2? 题解:树形dp,两遍dfs,第一遍dfs求得以各个结点为根的子树的结点数,以及各个结点下面切掉某条边后最多可切出多少个结点; 第二遍dfs求得每 阅读全文
摘要:
数组A包含N个整数(可能包含相同的值)。设S为A的子序列且S中的元素是递增的,则S为A的递增子序列。如果S的长度是所有递增子序列中最长的,则称S为A的最长递增子序列(LIS)。A的LIS可能有很多个。例如A为:{1 3 2 0 4},1 3 4,1 2 4均为A的LIS。给出数组A,求A的LIS有多 阅读全文
摘要:
题意:给你n点m边的图,然后让你确定每条边的方向,使得入度=出度的点最多 。 度数为偶数的点均能满足入度 = 出度。 证明:度数为奇数的点有偶数个,奇度点两两配对连无向边,则新图存在欧拉回路,则可使新图所有点入度 = 出度。 1 #include <bits/stdc++.h> 2 using na 阅读全文
摘要:
以下这份代码并没有过。但感觉没有问题。不是蜜汁WA就是蜜汁T。 1 #include <cstdio> 2 #include <iostream> 3 #include <cstring> 4 #include <algorithm> 5 typedef long long ll; 6 using 阅读全文
摘要:
题目链接 题意:给定两个长度为n的数组a与长度为m的数组b, 给定一个操作符op满足 x op y = x < y ? x+y : x-y. 有q个询问,每次给出询问c,问:有多少对(i, j)满足a[i] op b[j] = c ? 0 <= c <= 100000, 其余数据范围在[0, 500 阅读全文
摘要:
题意:dp[n] = ∑ ( dp[n-i]*a[i] )+a[n], ( 1 <= i < n) cdq分治。 计算出dp[l ~ mid]后,dp[l ~ mid]与a[1 ~ r-l]做卷积运算。 1 #include <bits/stdc++.h> 2 using namespace std 阅读全文