7.10: Test1 惨遭爆零 TAT
第一题 在本地测是过了的 到了教师机莫名输出0 ?? 一道spfa的板子题 还做过 WA了也就GG。。[POJ2502]Subway
后来发现了 结构体强转有大问题???? woc
第二题 听大佬讲 有三种方法
1是floyd判一下 f[x][y] ?= f[x][k] + f[k][y] 还标记个flag(是否存在);
2是一个spfa找负环 这需要建一个神奇的图;
3是一个诡异的贪心 (左端相等 减去左边相等的数 再加入优先队列 如果区间相等 判断数是否相等 不相等就false)。
反正我都没想到 (难道高斯消元+区间离散 不能做?? 到时候再研究)洛谷【P2294】[HNOI2005]狡猾的商人
后来点开标签看了看 原来是差分约束(虽然原来好像讲过,但根本不记得了) 去网上找了篇好博文 终于懂了
第三题 一道强联通分量缩点 + 树形(DAG)dp 没时间写了 也只好GG 洛谷【P3436】[POI2006]PRO-Professor Szu
总结:先做思路更明显的题 程序注意细节 不要瞎搞 再接再厉 明天继续 fighting
7.12:Test2 130分。。(一般人拿的分qwq)
第一题 一道求解涂色方案数问题 判是否可行 看到就一脸懵 以为又是一道数学找规律题 草草地打完了爆搜就没去动了 后来回头想来写dp没写出来QAQ
正解是矩阵快速幂(膜一波hy大大 构造一个可行型矩阵,乘自己n-1次(用快速幂做),最后再乘上dp矩阵) 还有种神奇方法 倍增思想来做dp 两种时间复杂度差不多都是O(log n)
第二题 一道trie的裸题,但是数据卡trie,我就竟然奇迹般地写出了hash(似乎还是正解) 竟然时间效率还不错。以后要多多练练hash。 [HDU1075]What are you talking about?
第三题 一道拓欧的题,不知道拓欧咋写,又咋去用。。。 反正不太会QAQ。。 后来听了几位大牛的讲解 终于搞懂了qwq。。 [POJ2155]C Looooops
总结:有时候脑洞还是要开大一点 有可能灵机一闪的思路是正解
7.13:Test3 200分 (数据太水了。。。正解基本没过。。暴力还有a+b都能AC TAT)
第一题 一道平面几何题 计算任意两点之间距离的最大值 暴力全部秒过= = 正解是先做一遍凸包 把凸包上的点保留 再做一遍暴枚[POJ2187]Beauty Contest
第二题 一道求最大团的题(一开始不知道 写了个点枚暴力复杂度O(n^2 * 2^n)特别高QAQ)后来才知道是一道NP难问题(NPC)GG第一次碰 可以用Bron–Kerbosch算法(但好像会TLE)其实根据这道题的特殊性
可以把原图延伸为一个补图(将所有原图原本存在的边删掉加上不存在的边)然后跑一边二分图最大匹配 这样就可以把原图中互相不认识的一些点删掉 最后答案就是nl+nr-res [POJ3692]Kindergarten
第三题 一道搜索剪枝的题 (考试时候剪枝剪多了WA了 TAT) 有一个玄学剪枝 就是(maxv - sumv) / r * 2 + sums >= ans 这个就将体积换成侧面积来计算接下来的最大面积 这个似乎优化很多
一开始改了很久 发现枚举高度时 不能直接从h-1开始 有时要从(maxv-sumv-minv[deep-1]) / (i*i)(可用体积除以半径)开始 就是两个的最小值 [POJ1190]生日蛋糕
7.14:Test4 170分 (这次比较正常。。发挥刚好。)
第一题 一道最长不上升和不下降的裸题 不能用O(n^2)的算法来做 (n=100000) 要用 二分当前最优解的方法去写。 有点类似于合唱队型。。洛谷【P1091】合唱队形
第二题 一道特殊的01背包 考试没看出来(因为是乘积)最后只好写了一个DFS 去搜索 结果挂了 只有20分TAT 其实就是按减少饥饿值从大到小排序 如果当前减少饥饿值为负数 就不算 否则就更新f[i](i表示减少饥饿值为i时 最大的战斗力) 最后线性扫一遍就行了 [POJ2184]Cow Exhibition
第三题 又是一道报复社会的数论题。。 就是筛素数 要用上一种特殊的筛法 Miller-Rabin 这个就需要一些数论基础了 而且为了防爆范围 需要取模乘(类似于快速幂) 而且还需要一个快速幂来计算 这个运用了费马小定理 还有 二次探测定理 [POJ1811]Prime Test
7.18:Test5 50分 (TAT倒数第四(还有小朋友) 要被丢出去了)
第一题 一道搜索贪心 或者 递推dp 太自信了 5min打完就做后面了 没认真看看TAT
第二题 一道神奇的贪心 将根节点能选的最多节点数计算出来(sum) 再计算出从大到小sum个数的和再加起来。。。没想出来TAT
第三题 这道题就也是报复社会了。。。暴力打挂了,flag前面特判错了QAQ。。。正解用线段树进行维护 十分复杂(可以媲美工业题了)
总结:真的要注重细节啊!!!!! 明天NOI同步赛了。。 争取拿分 沉下心来 好好弄!!!
8.2:Test6 120分 (成功诠释暴力骗分的正确方法2333) PS:以后开始附代码了(还有他们的解题报告。。)
第一题 一道神奇的图论题(我考试时并没有理解题目的真正含义,靠暴力三重循环竟然骗了40分0.0)正解是类似于DAG dp,就是计算每一个点能到达的节点个数,因为能到达的节点必须要扩充边。需要用bitset来维护这个集合,可以进行数位优化,除以一个ω。为了防止爆空间,所以跑两遍。。(dy的程序是真的强,十分精炼……)
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 #include <algorithm> 5 #include <cmath> 6 #include <bitset> 7 using namespace std; 8 #define For(i, l, r) for(int i = (l), _end_ = (int)(r); i <= _end_; ++i) 9 #define Fordown(i, r, l) for(int i =(r),_end_ = (int)(l); i >= _end_; --i) 10 #define Set(a, v) memset(a, v, sizeof(a)) 11 12 inline int read() { 13 int x = 0, fh = 1; char ch; 14 for(; !isdigit(ch); ch = getchar()) if(ch == '-') fh = -1; 15 for(; isdigit(ch); ch = getchar()) x =(x<<1) + (x<<3) + (ch ^ '0'); 16 return x * fh; 17 } 18 19 const int N = 60100, M = 100100; 20 int to[M], Next[M], Head[N], e = 0; 21 void add_edge (int u, int v) { 22 to[++e] = v; 23 Next[e] = Head[u]; 24 Head[u] = e; 25 } 26 27 bitset<N/2> G[N]; 28 bool vis[N]; 29 int n, m, ans = 0; 30 void dfs (int u, bool flag) { 31 if (vis[u]) return; 32 vis[u] = true; 33 if (flag && u <= (n>>1) ) G[u][u] = true; 34 else if (!flag && u > (n>>1) ) G[u][u - (n>>1)] = true; 35 for (int i = Head[u]; i; i = Next[i]) { 36 int v = to[i]; 37 dfs (v, flag); 38 G[u] |= G[v]; 39 } 40 ans += G[u].count(); 41 } 42 43 int main(){ 44 freopen ("worldline.in", "r", stdin); 45 freopen ("worldline.out", "w", stdout); 46 n = read(); m = read(); 47 For (i, 1, m) { 48 int u = read(), v = read(); 49 add_edge (u, v); 50 } 51 For (i, 1, n) dfs (i, true); 52 Set(vis, false); 53 For (i, 1, n) G[i].reset(); 54 For (i, 1, n) dfs (i, false); 55 printf ("%d\n", ans - n - m); 56 return 0; 57 }