Replay


Dup4:

  • 两轮怎么退火啊?
  • 简单树形dp都不会了,送了那么多罚时
  • 简单题都不想清楚就乱写了,喵喵喵?

X:

  • 欧拉怎么回路啊, 不会啊。
  • 还是有没有手误?未思考清楚或者未检查就提交, 导致自己白送罚时。

A:夺宝奇兵

Solved.

考虑$所有i >= 2 需要跟i - 1 连两条边 只有两种可能 取最小的一种$

$注意n的两个点要连一条边$

  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6.  
  7. const int maxn = 1e5 + ;
  8.  
  9. struct node{
  10. int x1, x2, y1, y2;
  11. }arr[maxn];
  12.  
  13. ll calc(int i,int j)
  14. {
  15. ll ans1 = abs(arr[i].x1 - arr[j].x1) + abs(arr[i].y1 - arr[j].y1) + abs(arr[i].x2 - arr[j].x2) + abs(arr[i].y2 - arr[j].y2);
  16. ll ans2 = abs(arr[i].x1 - arr[j].x2) + abs(arr[i].y1 - arr[j].y2) + abs(arr[i].x2 - arr[j].x1) + abs(arr[i].y2 - arr[j].y1);
  17. return min(ans1, ans2);
  18. }
  19.  
  20. int n , m;
  21.  
  22. int main()
  23. {
  24. while(~scanf("%d %d", &n, &m))
  25. {
  26. for(int i = ; i <= n; ++i) scanf("%d %d %d %d", &arr[i].x1, &arr[i].y1, &arr[i].x2, &arr[i].y2);
  27. ll ans = ;
  28. for(int i = ; i <= n; ++i) ans += calc(i, i - );
  29. ans += abs(arr[n].x1 - arr[n].x2) + abs(arr[n].y1 - arr[n].y2);
  30. printf("%lld\n", ans);
  31. }
  32. return ;
  33. }

C:最小边覆盖

Solved.

考虑$No的情况$

  • 存在一个点的度数为0(没有被覆盖)
  • 存在一条边所连接的两个点其度数 >= 2 即这条边去掉还是个最小边覆盖
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define N 300010
  5. #define pii pair <int, int>
  6. int n, m;
  7. pii G[N];
  8. int d[N];
  9.  
  10. bool f()
  11. {
  12. for (int i = ; i <= n; ++i) if (!d[i]) return false;
  13. for (int i = ; i <= m; ++i)
  14. {
  15. int u = G[i].first, v = G[i].second;
  16. if (d[u] >= && d[v] >= )
  17. return false;
  18. }
  19. return true;
  20. }
  21.  
  22. int main()
  23. {
  24. while (scanf("%d%d", &n, &m) != EOF)
  25. {
  26. memset(d, , sizeof d);
  27. for (int i = , u, v; i <= m; ++i)
  28. {
  29. scanf("%d%d", &u, &v);
  30. ++d[u], ++d[v];
  31. G[i] = pii(u, v);
  32. }
  33. puts(f() ? "Yes" : "No");
  34. }
  35. return ;
  36. }

F:小小马

Solved.

因为不同颜色出现次数相同, 所以步数一定是奇数。

暴力跑出大数据的状态, 发现颜色相同就输出No, 否则输出Yes。

小数据暴力跑即可

  1. #include<bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. const int maxn = 1e6 + ;
  6.  
  7. struct node{
  8. int x, y;
  9. int step;
  10. node(){}
  11. node(int x, int y, int step): x(x), y(y), step(step){}
  12. };
  13.  
  14. int n, m;
  15. int sx, sy, ex, ey;
  16. int vis[][maxn][];
  17. int dir[][] = {-, -, -, , -, -, -, , , -, , , , -, , };
  18.  
  19. int judge(int x, int y,int step)
  20. {
  21. if(x < || x > n || y < || y > m || vis[x][y][step % ]) return false;
  22. else return true;
  23. }
  24.  
  25. void BFS()
  26. {
  27. memset(vis, , sizeof vis);
  28. queue<node>q;
  29. q.push(node(sx, sy, ));
  30. while(!q.empty())
  31. {
  32. node st = q.front();
  33. q.pop();
  34. node now = st;
  35. now.step++;
  36. for(int i = ; i < ; ++i)
  37. {
  38. now.x = st.x + dir[i][];
  39. now.y = st.y + dir[i][];
  40. if(judge(now.x, now.y, now.step))
  41. {
  42. vis[now.x][now.y][now.step % ] = ;
  43. q.push(now);
  44. }
  45. }
  46. }
  47. }
  48.  
  49. int main()
  50. {
  51. while(~scanf("%d %d", &n, &m))
  52. {
  53. scanf("%d %d", &sx, &sy);
  54. scanf("%d %d", &ex, &ey);
  55. if(n < || m < )
  56. {
  57. if(n > m)
  58. {
  59. swap(n, m);
  60. swap(sx, sy);
  61. swap(ex, ey);
  62. }
  63. BFS();
  64. if(vis[ex][ey][]) puts("Yes");
  65. else puts("No");
  66. }
  67. else
  68. {
  69. int ans1 = (sx + sy) % ;
  70. int ans2 = (ex + ey) % ;
  71. if(ans1 != ans2) puts("Yes");
  72. else puts("No");
  73. }
  74. }
  75. return ;
  76. }

G:置置置换

Solved.

$在已知1-n的方案数, 枚举n+1出现的位置$

$当枚举到位置x的时候, 选出x-1个数放在前x个, 然后计算方案数 统计即可$

$2 \cdot ans_{n + 1} = \sum\limits_{i = 0}^{n} C_n^i \cdot ans_i \cdot ans_{n - i}$

  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. typedef long long ll;
  6.  
  7. const ll MOD = (ll)1e9 + ;
  8. const int maxn = 1e3 + ;
  9.  
  10. int n;
  11. ll fac[maxn];
  12. ll inv[maxn];
  13. ll invfac[maxn];
  14.  
  15. ll ans[maxn];
  16.  
  17. void Init()
  18. {
  19. fac[] = , inv[] = , invfac[] = ;
  20. for(int i = ; i < maxn; ++i)
  21. {
  22. fac[i] = fac[i - ] * i % MOD;
  23. inv[i] = inv[MOD % i] * (MOD - MOD / i) % MOD;
  24. invfac[i] = invfac[i - ] * inv[i] % MOD;
  25. }
  26. }
  27.  
  28. ll calc(int n, int m)
  29. {
  30. if(n == m || m == ) return 1ll;
  31. return fac[n] * invfac[m] % MOD * invfac[n - m] % MOD;
  32. }
  33.  
  34. int main()
  35. {
  36. Init();
  37. ans[] = ans[] = ;
  38. for(int i = ; i + < maxn; ++i)
  39. {
  40. for(int j = ; j <= i; ++j)
  41. {
  42. ans[i + ] = (ans[i + ] + calc(i, j) * ans[j] % MOD * ans[i - j] % MOD) % MOD;
  43. }
  44. ans[i + ] = (ans[i + ] * inv[]) % MOD;
  45. }
  46. while (scanf("%d", &n) != EOF)
  47. {
  48. printf("%lld\n", ans[n]);
  49. }
  50. return ;
  51. }

I:咆咆咆哮

Solved.

考虑如果选择$a_i的个数固定为x,那么对于所有选取b_i的卡牌来说它的贡献是固定的$

枚举$x, 再贪心选取即可$

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define ll long long
  5. #define N 1010
  6. int n, a[N], b[N];
  7.  
  8. ll f(int x)
  9. {
  10. priority_queue <ll> pq;
  11. ll res = ;
  12. for (int i = ; i <= n; ++i)
  13. {
  14. res += a[i];
  15. pq.push(1ll * b[i] * x - a[i]);
  16. }
  17. for (int i = ; i <= n - x; ++i)
  18. {
  19. res += pq.top();
  20. pq.pop();
  21. }
  22. return res;
  23. }
  24.  
  25. int main()
  26. {
  27. while (scanf("%d", &n) != EOF)
  28. {
  29. for (int i = ; i <= n; ++i) scanf("%d%d", a + i, b + i);
  30. ll res = ;
  31. for (int i = ; i <= n; ++i)
  32. res = max(res, f(i));
  33. printf("%lld\n", res);
  34. }
  35. return ;
  36. }

Div1:

三分

好像满足凸性? 我不会证啊。..

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define ll long long
  5. #define N 100010
  6. int n, a[N], b[N];
  7.  
  8. ll check(int x)
  9. {
  10. ll res = ;
  11. priority_queue <ll> pq;
  12. for (int i = ; i <= n; ++i)
  13. {
  14. res = res + a[i];
  15. pq.push(1ll * b[i] * x - a[i]);
  16. }
  17. for (int i = n - x; !pq.empty() && i; --i)
  18. {
  19. res += pq.top(); pq.pop();
  20. }
  21. return res;
  22. }
  23.  
  24. int main()
  25. {
  26. while (scanf("%d", &n) != EOF)
  27. {
  28. for (int i = ; i <= n; ++i) scanf("%d%d", a + i, b + i);
  29. int l = , r = n; ll res = ;
  30. while (r - l >= )
  31. {
  32. int midl = (l + r) >> ;
  33. int midr = (midl + r) >> ;
  34. ll tmpl = check(midl);
  35. ll tmpr = check(midr);
  36. if (tmpl <= tmpr)
  37. {
  38. res = max(res, tmpr);
  39. l = midl + ;
  40. }
  41. else
  42. {
  43. res = max(res, tmpl);
  44. r = midr - ;
  45. }
  46. }
  47. printf("%lld\n", res);
  48. }
  49. return ;
  50. }

K:两条路径

Solved.

考虑$x作为交它的权值要被算上$

在考虑两条路径可以选取端点,端点的选择在其儿子对应的子树中选取一个点且仅能选取一个

树形DP即可

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define ll long long
  5. #define N 100010
  6. #define INFLL 0x3f3f3f3f3f3f3f3f
  7. int n, q;
  8. ll val[N];
  9. vector <int> G[N];
  10. ll Bit[], f[N];
  11.  
  12. void DFS(int u, int fa)
  13. {
  14. f[u] = -INFLL;
  15. for (auto v : G[u]) if (v != fa)
  16. {
  17. DFS(v, u);
  18. f[u] = max(f[u], f[v]);
  19. }
  20. f[u] = max(f[u], 0ll);
  21. f[u] += val[u];
  22. }
  23.  
  24. void out(ll x)
  25. {
  26. if (x < ) putchar('-'), x = -x;
  27. string res = "";
  28. while (x)
  29. {
  30. res += (x % + '');
  31. x /= ;
  32. }
  33. reverse(res.begin(), res.end());
  34. cout << res << "\n";
  35. }
  36.  
  37. int main()
  38. {
  39. Bit[] = ;
  40. for (int i = ; i <= ; ++i) Bit[i] = Bit[i - ] << ;
  41. while (scanf("%d", &n) != EOF)
  42. {
  43. for (int i = ; i <= n; ++i) G[i].clear();
  44. for (int i = , x; i <= n; ++i)
  45. {
  46. scanf("%d", &x);
  47. if (!x)
  48. {
  49. val[i] = ;
  50. continue;
  51. }
  52. int vis = ;
  53. if (x < )
  54. {
  55. x = -x;
  56. vis = -;
  57. }
  58. --x;
  59. val[i] = Bit[x] * vis;
  60. }
  61. for (int i = , u, v; i < n; ++i)
  62. {
  63. scanf("%d%d", &u, &v);
  64. G[u].push_back(v);
  65. G[v].push_back(u);
  66. }
  67. int x;
  68. scanf("%d", &q);
  69. while (q--)
  70. {
  71. scanf("%d", &x);
  72. priority_queue <ll> pq;
  73. for (auto v : G[x])
  74. {
  75. DFS(v, x);
  76. pq.push(f[v]);
  77. }
  78. ll res = val[x];
  79. for (int i = ; i <= && !pq.empty() && pq.top() > ; ++i)
  80. {
  81. res += pq.top(); pq.pop();
  82. }
  83. //cout << res << endl;
  84. out(res);
  85. }
  86. }
  87. return ;
  88. }

CCPC-Wannafly Winter Camp Day4 (Div2, onsite)的更多相关文章

  1. 2019 CCPC-Wannafly Winter Camp Day4(Div2, onsite)

    slove 6/11 A.夺宝奇兵 Code:zz Thinking:zz 贪心即可.这条路线里,点n1和点n2肯定是相连的,接下来,点(n-1)1和点(n-1)2分别是和n1和点n2相连的,一共有两 ...

  2. 2020 CCPC Wannafly Winter Camp Day1 C. 染色图

    2020 CCPC Wannafly Winter Camp Day1 C. 染色图 定义一张无向图 G=⟨V,E⟩ 是 k 可染色的当且仅当存在函数 f:V↦{1,2,⋯,k} 满足对于 G 中的任 ...

  3. CCPC Wannafly Winter Camp Div2 部分题解

    Day 1, Div 2, Prob. B - 吃豆豆 题目大意 wls有一个\(n\)行\(m\)列的棋盘,对于第\(i\)行第\(j\)列的格子,每过\(T[i][j]\)秒会在上面出现一个糖果, ...

  4. CCPC-Wannafly Winter Camp Day5 (Div2, onsite) Sorting(线段树)

    题目链接 题意 对序列进行三种操作: 1.区间求和. 2.将区间小于等于$x$的数不改变相对顺序的前提下放到$x$左边,用同样规则将比$x$大的放到右边. 3.将区间大于$x$的数不改变相对顺序的前提 ...

  5. CCPC-Wannafly Winter Camp Day8 (Div2, onsite)

    咕咕咕.    camp补题. 传送门:https://www.zhixincode.com/contest/29/problems A.Aqours 题意:有一棵有根树,根节点为1,给出每个结点的父 ...

  6. CCPC-Wannafly Winter Camp Day3 (Div2, onsite)

    Replay Dup4: 没想清楚就动手写? 写了两百行发现没用?想的还是不够仔细啊. 要有莽一莽的精神 X: 感觉今天没啥输出啊, 就推了个公式?抄了个板子, 然后就一直自闭A. 语文差,题目没理解 ...

  7. 2019 CCPC-Wannafly Winter Camp Day1 (Div2, onsite)

    solve:4/11 补题:6/11 A 机器人 补题:zz 这是一道分类讨论的题目,有一个规律就是如果必须要从第一个区到第二个区,那么最多转区两次(1到2一次,2到1一次),然后分类讨论即可,只要细 ...

  8. 2019 CCPC-Wannafly Winter Camp Day7(Div2, onsite)

    solve 6/11 补题: A.迷宫 Code:zz Thinking:zz kk 把每个节点的深度都处理出来,同一深度的点的冲突度为 (x-1),x为同层次点数减一. 然后冲突度不断下传(冲突度为 ...

  9. Wannafly Winter Camp Day8(Div1,onsite) E题 Souls-like Game 线段树 矩阵乘法

    目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog @ Problem:传送门  Portal  原题目描述在最下面.  简单的 ...

随机推荐

  1. NGUI在5.3打包失败问题

    一.NGUI版本 NGUI是很好用的Unity UI插件. 当前使用版本NGUI Next-Gen UI v3.9.7 (Feb 10, 2016)和NGUI Next-Gen UI 3.9.0两个版 ...

  2. 在js中通过call或者apply实现继承

    通过call或者apply可以实现函数里面this的改变,利用这一特点,可以实现继承 代码如下所示: /*父类*/ function Parent(add,net,no,teacher) { this ...

  3. iOS打电话、发短信、发邮件功能开发

    本文转载至 http://www.lvtao.net/ios/506.html 今天把APP里常用小功能 例如发短信.发邮件.打电话.全部拿出来简单说说它们的实现思路. 1.发短信实现打电话的功能,主 ...

  4. iPad UIPopoverController弹出窗口的位置和坐标

    本文转载至:http://blog.csdn.net/chang6520/article/details/7921181 TodoViewController *contentViewControll ...

  5. Java中list对象的三种遍历方式

    1.增强for循环 for(String str : list) {//其内部实质上还是调用了迭代器遍历方式,这种循环方式还有其他限制,不建议使用. System.out.println(str); ...

  6. android 动画学习系列(一)

    老师今天开始讲android的游戏,讲到了view和surfaceview 下面是view的演示部分 private Paint paint; //游戏里很少用double,都是用long priva ...

  7. 在ubuntu14.04上漏洞环境vulndocker的DOCKER搭建

    一.下载git包以及安装: git clone https://github.com/leveryd/vulndocker.git cd vulndocker apt-get install uwsg ...

  8. 高中生的IT之路-1.1自序

        近几年来越来越多的人问我关于 高中生要不要读大学.大学选择专业.毕业后的择业问题,索性我不如把我对这几方面的理解写出来,如果有幸能帮助到更多的人,那也算是个人对社会做出了一点贡献.       ...

  9. html to pdf小工具,支持evernote导出的html和firefox插件scrapbook

    周末花了一天时间用wpf写了一个html转换为pdf的小工具. 已经在win7 32位 和win8 64两台机器上测试,目前基本可用,特拿来分享. 程序下载地址:http://pan.baidu.co ...

  10. 动态设置progressBar的进度

    progressDrawable = this.getResources().getDrawable(R.drawable.image); progressDrawable.setBounds(mSe ...