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 }
View Code

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2021-04-16
  • 2021-08-14
  • 2021-06-06
  • 2022-01-26
  • 2021-09-26
  • 2022-02-12
猜你喜欢
  • 2021-06-22
  • 2021-12-12
  • 2021-12-11
  • 2021-10-14
  • 2022-01-22
  • 2021-12-30
  • 2021-06-29
相关资源
相似解决方案