A. Salem and Sticks

签.

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define N 1010
  5. int n, a[N];
  6.  
  7. int work(int x)
  8. {
  9. int res = ;
  10. for (int i = ; i <= n; ++i)
  11. res += max(, abs(x - a[i]) - );
  12. return res;
  13. }
  14.  
  15. int main()
  16. {
  17. while (scanf("%d", &n) != EOF)
  18. {
  19. for (int i = ; i <= n; ++i) scanf("%d", a + i);
  20. int Min = (int)1e9, pos = -;
  21. for (int i = ; i <= ; ++i)
  22. {
  23. int tmp = work(i);
  24. if (tmp < Min)
  25. {
  26. Min = tmp;
  27. pos = i;
  28. }
  29. }
  30. printf("%d %d\n", pos, Min);
  31. }
  32. return ;
  33. }

B. Zuhair and Strings

签.

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define N 200010
  5. int n, k;
  6. char s[N];
  7.  
  8. int work(char c)
  9. {
  10. int res = ;
  11. int tmp = ;
  12. for (int i = ; i <= n; ++i)
  13. {
  14. if (s[i] != c) tmp = ;
  15. else
  16. {
  17. ++tmp;
  18. if (tmp == k)
  19. {
  20. ++res;
  21. tmp = ;
  22. }
  23. }
  24. }
  25. return res;
  26. }
  27.  
  28. int main()
  29. {
  30. while (scanf("%d%d", &n, &k) != EOF)
  31. {
  32. scanf("%s", s + );
  33. int res = ;
  34. for (int i = 'a'; i <= 'z'; ++i)
  35. res = max(res, work(i));
  36. printf("%d\n", res);
  37. }
  38. return ;
  39. }

C. Ayoub and Lost Array

签.

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define ll long long
  5. #define N 200010
  6. const ll MOD = (ll)1e9 + ;
  7. int n, l, r;
  8. ll a[], f[N][];
  9.  
  10. int main()
  11. {
  12. while (scanf("%d%d%d", &n, &l, &r) != EOF)
  13. {
  14. memset(a, , sizeof a);
  15. while (l % && l <= r)
  16. {
  17. a[l % ]++;
  18. ++l;
  19. }
  20. while (r % && l <= r)
  21. {
  22. a[r % ]++;
  23. --r;
  24. }
  25. if (l <= r)
  26. {
  27. ++a[];
  28. int tmp = (r - l) / ;
  29. a[] += tmp;
  30. a[] += tmp;
  31. a[] += tmp;
  32. }
  33. memset(f, , sizeof f);
  34. f[][] = ;
  35. for (int i = ; i <= n; ++i)
  36. {
  37. f[i][] = (f[i - ][] * a[] % MOD + f[i - ][] * a[] % MOD + f[i - ][] * a[] % MOD) % MOD;
  38. f[i][] = (f[i - ][] * a[] % MOD + f[i - ][] * a[] % MOD + f[i - ][] * a[] % MOD) % MOD;
  39. f[i][] = (f[i - ][] * a[] % MOD + f[i - ][] * a[] % MOD + f[i - ][] * a[] % MOD) % MOD;
  40. }
  41. printf("%lld\n", f[n][]);
  42. }
  43. return ;
  44. }

D. Kilani and the Game

签.

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define N 1010
  5. int n, m, p;
  6. char G[N][N];
  7. int s[];
  8. struct node
  9. {
  10. int x, y, step;
  11. node () {}
  12. node (int x, int y, int step) : x(x), y(y), step(step) {}
  13. };
  14. queue <node> q[];
  15. bool stop()
  16. {
  17. for (int i = ; i <= p; ++i) if (!q[i].empty())
  18. return false;
  19. return true;
  20. }
  21.  
  22. int Move[][] =
  23. {
  24. -, ,
  25. , ,
  26. ,-,
  27. , ,
  28. };
  29. bool ok(int x, int y)
  30. {
  31. if (x < || x > n || y < || y > m || G[x][y] != '.') return false;
  32. return true;
  33. }
  34.  
  35. void BFS(int id, int cnt)
  36. {
  37. while (!q[id].empty())
  38. {
  39. int x = q[id].front().x;
  40. int y = q[id].front().y;
  41. int step = q[id].front().step;
  42. //printf("%d %d %d %d\n", x, y, id, step);
  43. if (step / s[id] >= cnt) return;
  44. q[id].pop();
  45. for (int i = ; i < ; ++i)
  46. {
  47. int nx = x + Move[i][];
  48. int ny = y + Move[i][];
  49. if (ok(nx, ny))
  50. {
  51. G[nx][ny] = id + '';
  52. q[id].push(node(nx, ny, step + ));
  53. }
  54. }
  55. }
  56. }
  57.  
  58. int main()
  59. {
  60. while (scanf("%d%d%d", &n, &m, &p) != EOF)
  61. {
  62. for (int i = ; i <= p; ++i) scanf("%d", s + i);
  63. for (int i = ; i <= n; ++i) scanf("%s", G[i] + );
  64. for (int i = ; i <= p; ++i) while (!q[i].empty()) q[i].pop();
  65. for (int i = ; i <= n; ++i) for (int j = ; j <= m; ++j) if (isdigit(G[i][j]))
  66. q[G[i][j] - ''].push(node(i, j, ));
  67. int cnt = ;
  68. while ()
  69. {
  70. for (int i = ; i <= p; ++i) BFS(i, cnt);
  71. ++cnt;
  72. if (stop()) break;
  73. }
  74. int ans[];
  75. memset(ans, , sizeof ans);
  76. for (int i = ; i <= n; ++i) for (int j = ; j <= m; ++j) if (isdigit(G[i][j]))
  77. ++ans[G[i][j] - ''];
  78. //for (int i = 1; i <= n; ++i) printf("%s\n", G[i] + 1);
  79. for (int i = ; i <= p; ++i) printf("%d%c", ans[i], " \n"[i == p]);
  80. }
  81. return ;
  82. }

E. Helping Hiasat

Upsolved.

题意:

两种操作

  • 更改自己的handle
  • 伙伴查询handle

如果一个伙伴在每次查询时显示的都是自己名字,那么他就会开心

问 最多可以让多少人开心

思路:

法一:

一张图的最大独立集是选出一个点集,使得任意两点不相邻

一张图的最大团是选出一个点集,使得任意两点之间有边相连

一张无向图的补图的最大图就是原图的最大独立集

我们发现这道题两个1之间的所有点都是不能一起happy的,那我们给他们两两之间连上边

然后求补图的最大团即可

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define N 110
  5. int n, m, t;
  6. int g[N][N];
  7. int dp[N];
  8. int stk[N][N];
  9. int mx;
  10.  
  11. map <string, int> mp;
  12. int get(string s)
  13. {
  14. if (mp.find(s) != mp.end()) return mp[s];
  15. else mp[s] = t++;
  16. return mp[s];
  17. }
  18.  
  19. int DFS(int n, int ns, int dep)
  20. {
  21. if (ns == )
  22. {
  23. mx = max(mx, dep);
  24. return ;
  25. }
  26. int i, j, k, p, cnt;
  27. for (i = ; i < ns; ++i)
  28. {
  29. k = stk[dep][i];
  30. cnt = ;
  31. if (dep + n - k <= mx)
  32. return ;
  33. if (dep + dp[k] <= mx)
  34. return ;
  35. for (j = i + ; j < ns; ++j)
  36. {
  37. p = stk[dep][j];
  38. if (g[k][p])
  39. stk[dep + ][cnt++] = p;
  40. }
  41. DFS(n, cnt, dep + );
  42. }
  43. return ;
  44. }
  45.  
  46. int clique(int n)
  47. {
  48. int i, j, ns;
  49. for (mx = , i = n - ; i >= ; --i)
  50. {
  51. for (ns = , j = i + ; j < n; ++j)
  52. {
  53. if (g[i][j])
  54. stk[][ns++] = j;
  55. }
  56. DFS(n, ns, );
  57. dp[i] = mx;
  58. }
  59. return mx;
  60. }
  61.  
  62. vector <int> vec;
  63. void add()
  64. {
  65. vec.erase(unique(vec.begin(), vec.end()), vec.end());
  66. for (auto u : vec) for (auto v : vec)
  67. g[u][v] = g[v][u] = ;
  68. vec.clear();
  69. }
  70.  
  71. int main()
  72. {
  73. while (scanf("%d%d", &n, &m) != EOF)
  74. {
  75. t = ;
  76. mp.clear();
  77. for (int i = ; i < m; ++i) for (int j = ; j < m; ++j) g[i][j] = ;
  78. []()
  79. {
  80. int op; char s[];
  81. for (int nn = ; nn <= n; ++nn)
  82. {
  83. scanf("%d", &op);
  84. if (op == )
  85. add();
  86. else
  87. {
  88. scanf("%s", s + );
  89. vec.push_back(get(s + ));
  90. }
  91. }
  92. }();
  93. add();
  94. for (int i = ; i < m; ++i) g[i][i] = ;
  95. //for (int i = 1; i <= m; ++i) for (int j = 1; j <= m; ++j) printf("%d %d %d\n", i, j, g[i][j]);
  96. printf("%d\n", clique(m));
  97. }
  98. return ;
  99. }

法二:

$m = 40, 可以折半状压,再合起来$

考虑妆压的时候要从子集转移到超集,可以通过$dp上去$

$vp的时候想到折半状压,但是当时是枚举子集来转移,复杂度大大增加..$

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define N 50
  5. #define M 1100010
  6. int n, m, t;
  7. int G[N][N];
  8.  
  9. map <string, int> mp;
  10. int get(string s)
  11. {
  12. if (mp.find(s) != mp.end()) return mp[s];
  13. else mp[s] = ++t;
  14. return mp[s];
  15. }
  16.  
  17. vector <int> vec;
  18. void add()
  19. {
  20. vec.erase(unique(vec.begin(), vec.end()), vec.end());
  21. for (auto u : vec) for (auto v : vec)
  22. G[u][v] = ;
  23. vec.clear();
  24. }
  25.  
  26. int f[M], g[M];
  27. int main()
  28. {
  29. while (scanf("%d%d", &n, &m) != EOF)
  30. {
  31. t = ; mp.clear();
  32. memset(G, , sizeof G);
  33. int op; char s[N];
  34. for (int nn = ; nn <= n; ++nn)
  35. {
  36. scanf("%d", &op);
  37. if (op == ) add();
  38. else
  39. {
  40. scanf("%s", s + );
  41. vec.push_back(get(s + ));
  42. }
  43. }
  44. add();
  45. for (int i = ; i <= m; ++i)
  46. G[i][i] = ;
  47. int s1 = m / , s2 = m - s1;
  48. for (int i = ; i < ( << s1); i <<= ) f[i] = ;
  49. for (int i = ; i < ( << s2); i <<= ) g[i] = ;
  50. f[] = g[] = ;
  51. for (int i = ; i < ( << s1); ++i)
  52. {
  53. for (int j = ; j < s1; ++j) if (!((i >> j) & ))
  54. {
  55. int flag = ;
  56. for (int k = ; k < s1; ++k) if (((i >> k) & ) && G[k + ][j + ])
  57. {
  58. flag = ;
  59. break;
  60. }
  61. f[i | ( << j)] = max(f[i | ( << j)], f[i] + flag);
  62. }
  63. }
  64. for (int i = ; i < ( << s2); ++i)
  65. {
  66. for (int j = ; j < s2; ++j) if (!((i >> j) & ))
  67. {
  68. int flag = ;
  69. for (int k = ; k < s2; ++k) if (((i >> k) & ) && G[s1 + k + ][s1 + j + ])
  70. {
  71. flag = ;
  72. break;
  73. }
  74. g[i | ( << j)] = max(g[i | ( << j)], g[i] + flag);
  75. }
  76. }
  77. int res = ;
  78. for (int i = ; i < ( << s1); ++i)
  79. {
  80. int s3 = ( << s2) - ;
  81. for (int j = ; j < s1; ++j) if ((i >> j) & )
  82. {
  83. for (int k = ; k < s2; ++k) if (G[j + ][s1 + k + ] && ((s3 >> k) & ))
  84. s3 ^= ( << k);
  85. }
  86. res = max(res, f[i] + g[s3]);
  87. }
  88. printf("%d\n", res);
  89. }
  90. return ;
  91. }

法三:

为什么随机也行啊,能不能证明啊,喵喵喵..

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define ll long long
  5. #define N 50
  6. int n, m, t;
  7. int G[N][N], a[N];
  8. ll f[N];
  9.  
  10. map <string, int> mp;
  11. int get(string s)
  12. {
  13. if (mp.find(s) != mp.end()) return mp[s];
  14. else mp[s] = ++t;
  15. return mp[s];
  16. }
  17.  
  18. vector <int> vec;
  19. void add()
  20. {
  21. vec.erase(unique(vec.begin(), vec.end()), vec.end());
  22. for (auto u : vec) for (auto v : vec)
  23. G[u][v] = ;
  24. vec.clear();
  25. }
  26.  
  27. int main()
  28. {
  29. while (scanf("%d%d", &n, &m) != EOF)
  30. {
  31. t = ; mp.clear();
  32. memset(G, , sizeof G);
  33. int op; char s[N];
  34. for (int nn = ; nn <= n; ++nn)
  35. {
  36. scanf("%d", &op);
  37. if (op == ) add();
  38. else
  39. {
  40. scanf("%s", s + );
  41. vec.push_back(get(s + ));
  42. }
  43. }
  44. add();
  45. for (int i = ; i <= m; ++i)
  46. G[i][i] = ;
  47. int res = ;
  48. for (int i = ; i <= m; ++i) a[i] = i;
  49. for (int i = ; i <= m; ++i)
  50. {
  51. f[i] = ;
  52. for (int j = ; j <= m; ++j) if (G[i][j])
  53. f[i] |= (1ll << (j - ));
  54. }
  55. for (int t = ; t <= ; ++t)
  56. {
  57. random_shuffle(a + , a + + m);
  58. ll g = ; int tmp = ;
  59. for (int i = ; i <= m; ++i) if (((g >> (a[i] - )) & 1ll) == )
  60. {
  61. g |= f[a[i]];
  62. ++tmp;
  63. }
  64. res = max(res, tmp);
  65. }
  66. printf("%d\n", res);
  67. }
  68. return ;
  69. }

Codeforces Round #533 (Div. 2) Solution的更多相关文章

  1. Codeforces Round #533 (Div. 2)题解

    link orz olinr AK Codeforces Round #533 (Div. 2) 中文水平和英文水平都太渣..翻译不准确见谅 T1.给定n<=1000个整数,你需要钦定一个值t, ...

  2. Codeforces Round #466 (Div. 2) Solution

    从这里开始 题目列表 小结 Problem A Points on the line Problem B Our Tanya is Crying Out Loud Problem C Phone Nu ...

  3. 老年OIer的Python实践记—— Codeforces Round #555 (Div. 3) solution

    对没错下面的代码全部是python 3(除了E的那个multiset) 题目链接:https://codeforces.com/contest/1157 A. Reachable Numbers 按位 ...

  4. Codeforces Round #545 (Div. 1) Solution

    人生第一场Div. 1 结果因为想D想太久不晓得Floyd判环法.C不会拆点.E想了个奇奇怪怪的set+堆+一堆乱七八糟的标记的贼难写的做法滚粗了qwq靠手速上分qwqqq A. Skyscraper ...

  5. Codeforces Round #533 (Div. 2) C.思维dp D. 多源BFS

    题目链接:https://codeforces.com/contest/1105 C. Ayoub and Lost Array 题目大意:一个长度为n的数组,数组的元素都在[L,R]之间,并且数组全 ...

  6. Codeforces Round 500 (Div 2) Solution

    从这里开始 题目地址 瞎扯 Problem A Piles With Stones Problem B And Problem C Photo of The Sky Problem D Chemica ...

  7. Codeforces Round #533 (Div. 2) C. Ayoub and Lost Array 【dp】

    传送门:http://codeforces.com/contest/1105/problem/C C. Ayoub and Lost Array time limit per test 1 secon ...

  8. Codeforces Round #533 (Div. 2) B. Zuhair and Strings 【模拟】

    传送门:http://codeforces.com/contest/1105/problem/B B. Zuhair and Strings time limit per test 1 second ...

  9. Codeforces Round #533(Div. 2) C.Ayoub and Lost Array

    链接:https://codeforces.com/contest/1105/problem/C 题意: 给n,l,r. 一个n长的数组每个位置可以填区间l-r的值. 有多少种填法,使得数组每个位置相 ...

随机推荐

  1. /etc/docker/key.json

    /etc/docker/key.json 描述信息: This is the dockerd key for TLS connections.in web format, that docker us ...

  2. Python 使用正则表达式匹配电子邮箱

    如下: In [1]: import re In [2]: email = "1210640219@qq.com" In [3]: regular = re.compile(r'[ ...

  3. 关于MCU的烧录,下载与其他接口的比较(一)

    今天呢,犯了一个很严重的错误,我不知道这会产生什么样的影响,但我知道,如果我以后再没有具体的了解,仔细认真地观察,认证,只会滑到无底的深渊.做技术来不得半点虚假,切记一知半解,凡事都要弄得清楚明白,认 ...

  4. ubuntu的安装方法

    Ubuntu 是一个启动速度超快.界面友好.安全性好的开源操作系统,它由全球顶尖开源软件专家开发,适用于桌面电脑.笔记本电脑.服务器以及上网本等,并且它可以永久免费使用.如果你厌倦了Windows,如 ...

  5. Day04_数据类型占位符使用及进制转换

    2013年10月09日 星期三 10时03分51秒 回顾:  1.变量  2.scanf标准函数 字符类型是一种数据类型 在C语言程序中字符类型用char表示 字符类型中包含了256个不同的字符,例如 ...

  6. web基础----->模板引擎Velocity的使用(二)

    这里面是关于velocity的一些用法,比较基础的使用.愿你生命中有够多的云翳,来造成一个美丽的黄昏. velocity生成javaBean 一.定义一个简单的bean类 public class C ...

  7. Fragments (官方文档中文版)

    转 http://blog.sina.com.cn/s/blog_69a4fbd70100r5j4.html   概述   Fragment表现Activity中UI的一个行为或者一部分.可以将多个f ...

  8. CCNP

    CCNP全称是:Cisco Certified Network Professional——思科认证网络高级工程师.CCNP专业人员表示通过认证的人员具有丰富的网络知识.获得CCNP认证的专业人员可以 ...

  9. Eclipse打包Egret App (Egret4.1.0)

    Egret官方提供eclipse和androidstudio打包. 这里使用eclipse. 1 下载配置android环境 2 Egret打包App 3 Eclipse设置 4 Eclipse调试 ...

  10. Android自动读取短信验证码

    Android自动读取短信验证码  extends:http://www.cnblogs.com/jiayaguang/p/4366384.html,http://blog.csdn.net/yung ...