Carry之路 三人组 队伍正式成立了。。。。QAQ
2016.11.3 打了第一场比赛
09年的第五场多校合练
当时我们最后过的题
在杭电的 题目列表是: 2853-2862
赛后补了下,1002、1008
1001 当时只有10多个人过的图论
熊神 用km算法跑二分带权匹配,用了一个cf上面学到的巧妙地算法过了。 先给所有权扩大1000倍,给想要走的边 +1 ,让每次都能选则这条边,具体不是很懂。。。 %panda
1002
md,最坑的就是这题, 这题感觉最难点就是题意。。。 一个then 表达了一万个意思,真的理解不了。。。
题意应该是这样的:
如果一个数n ,能够列举出a、b 满足条件1: a*a*b+1,并且a、b不满足条件二:a*a+b,那么这个数n就是NO,否则就是YES
然后我们预处理打个表,然后O(1)判断就好了
(表中a、b扫到1000 就可以了,甚至都不用扫到5000)
1003
斐波那契+组合数。。。 算了,数学看着头疼,交给小学弟搞了
1004
题解都没有,就先不补了
1006、1010 都同理 先不补了
1005
签到题,简单计算几何
1007
算一个dp?
我们在对角线上dp, 对于每一个点,我们都以他为矩阵的左下角,扫能够达到的最大的边长。然后对角线上会有很明显的关系。。而且dp[i-1][j+1]=5 的话,dp[i][j]最大也只可能是5+1了
然后,熊神写的代码显然要比我的简介很多啊,%panda
char mp[1010][1010];
int dp[1010][1010];
int main() {
int n;
while (scanf("%d", &n) != EOF) {
if (n == 0)
break;
for (int i = 1; i <= n; i++) {
scanf("%s", mp[i] + 1);
}
int ans = 1;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i == 1 || j == n) {
dp[i][j] = 1;
continue;
}
int row = i;
int col = j;
while (row >= 1 && col <= n && mp[row][j] == mp[i][col]) {
row--;
col++;
}
int x = i - row;
if (dp[i - 1][j + 1] + 1 <= x) {
dp[i][j] = dp[i - 1][j + 1] + 1;
} else
dp[i][j] = x;
ans = max(ans, dp[i][j]);
}
}
printf("%d\n", ans);
}
return 0;
}
1008 赛后发现是一个挺简答得并查集维护。。。。
但当时 不知为什么,没有去看。。。
只有一个坑点,当合并A、B的时候,如果A==B ,那么这个操作使非法的
并查集可以错的地方,我之前貌似都错过了,所以很快就敲完了,但没注意每个样例之后的换行PE了。。。
1009
dp
最坑的地方是: 预处理 ,然后O(1)输出,答案,否则就会TLE ,整个人都被T得不好了。。。
毕竟还是too naive ,这个都记不得了。。。