CF1108A. Two distinct points

做法:模拟

如果两者左端点重合就第二条的左端点++就好,然后输出左端点

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int T;
  4. int l1, r1, l2, r2;
  5. int main() {
  6. scanf("%d", &T);
  7. while(T--) {
  8. scanf("%d%d%d%d", &l1, &r1, &l2, &r2);
  9. printf("%d ", l1);
  10. if(l1 == l2) l2++;
  11. printf("%d\n", l2);
  12. }
  13. }

CF1108B. Divisors of Two Integers

做法:模拟

坑点好多...首先因为所有因数都有,所以最大的数一定是x,y中的一个.把它拎出来,然后删掉它的因子,剩下的最大的就是x,y中的另外一个了

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. int n;
  5. int a[100000];
  6. int cnt[101000];
  7. int main() {
  8. scanf("%d", &n);
  9. int mx = 0;
  10. for(int i = 1; i <= n; ++i) {
  11. scanf("%d", &a[i]);
  12. cnt[a[i]]++;
  13. mx = max(mx, a[i]);
  14. }
  15. printf("%d ", mx);
  16. for(int i = 1; i * i <= mx; ++i) {
  17. if(mx % i == 0) {
  18. cnt[i]--;
  19. if(mx / i != i) cnt[mx / i]--;
  20. }
  21. }
  22. int ans = 0;
  23. for(int i = 1; i <= mx; ++i) {
  24. if(cnt[i] > 0) ans = i;
  25. }
  26. printf("%d\n", ans);
  27. }

CF1108C. Nice Garland

做法:模拟

依旧是模拟qwq.显然合法的排列方式也就那么6种...于是6种方式都跑一遍,然后取min即可

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int N = 2e5 + 10;
  5. int n, id = 0;
  6. char s[N];
  7. string f[6] = {"RGB", "RBG", "BRG", "BGR", "GRB", "GBR"};
  8. int main() {
  9. scanf("%d%s", &n, s + 1);
  10. int ans = N;
  11. for(int k = 0; k < 6; ++k) {
  12. int sum = 0, pos = 0;
  13. for(int i = 1; i <= n; ++i, pos = (pos + 1) % 3) {
  14. if(s[i] != f[k][pos]) ++sum;
  15. }
  16. if(sum < ans) {
  17. ans = sum;
  18. id = k;
  19. }
  20. }
  21. printf("%d\n", ans);
  22. for(int i = 1, pos = 0; i <= n; ++i, pos = (pos + 1) % 3) putchar(f[id][pos]);
  23. }

CF1108D. Diverse Garland

做法:dp

第一问显然sb dp,设f[i,j]表示点i然后点i填的是RGB中的一个(分别对应一个j),直接转移即可.输出方案反而比较难,有各种方法,我的方法是记录每个dp值的转移点,从后往前推回去.

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int N = 2e5 + 10;
  5. int n, id = 0;
  6. char s[N], p[3] = {'R', 'G', 'B'};
  7. int f[N][3], to[N][3];
  8. char t[N];
  9. int main() {
  10. scanf("%d%s", &n, s + 1);
  11. memset(f, 0x3f, sizeof(f));
  12. f[1][0] = f[1][1] = f[1][2] = 1;
  13. if(s[1] == 'R') f[1][0] = 0;
  14. else if(s[1] == 'G') f[1][1] = 0;
  15. else f[1][2] = 0;
  16. for(int i = 2; i <= n; ++i)
  17. for(int j = 0; j < 3; ++j)
  18. for(int k = 0; k < 3; ++k) {
  19. if(j == k) continue;
  20. if(p[j] == s[i]) {
  21. if(f[i - 1][k] < f[i][j])
  22. f[i][j] = f[i - 1][k], to[i][j] = k;
  23. } else {
  24. if(f[i - 1][k] + 1 < f[i][j])
  25. f[i][j] = f[i - 1][k] + 1, to[i][j] = k;
  26. }
  27. }
  28. int ans = 0, id = 0;
  29. if(f[n][0] > f[n][1]) {
  30. ans = f[n][1], id = 1;
  31. } else ans = f[n][0], id = 0;
  32. if(f[n][2] < ans) ans = f[n][2], id = 2;
  33. printf("%d\n", ans);
  34. for(int i = n; i; i--) {
  35. t[i] = p[id];
  36. id = to[i][id];
  37. }
  38. for(int i = 1; i <= n; ++i) putchar(t[i]); puts("");
  39. return 0;
  40. }

CF1108E1. Array and Segments (Easy version)

做法:暴力

考虑怎么样才能让结果最大,把线段分成两类,一种是没有覆盖最大值,一种是有覆盖最大值的,如果选了覆盖最大值的显然只会减小答案,所以可以暴力枚举最大值,并累加不覆盖最大值的线段,对所有情况取max即可复杂度是\(O(n^2m)\)的

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int N = 2e5 + 10;
  5. const int inf = 0x3f3f3f3f;
  6. int n, m, a[N], b[N];
  7. int vis[N];
  8. struct seg {
  9. int l, r, id;
  10. } s[N];
  11. vector<int> Ans;
  12. int ans = -1;
  13. int main() {
  14. scanf("%d%d", &n, &m);
  15. for(int i = 1; i <= n; ++i) scanf("%d", &a[i]);
  16. for(int i = 1; i <= m; ++i) scanf("%d%d", &s[i].l, &s[i].r), s[i].id = i;
  17. for(int i = 1; i <= n; ++i) {
  18. vector<int> cur; cur.clear();
  19. int lans = 0;
  20. for(int j = 1; j <= n; ++j) b[j] = a[j];
  21. for(int j = 1; j <= m; ++j) {
  22. if(s[j].l <= i && i <= s[j].r) continue;
  23. for(int k = s[j].l; k <= s[j].r; ++k) b[k]--;
  24. cur.push_back(j);
  25. }
  26. for(int j = 1; j <= n; ++j) {
  27. if(j == i) continue;
  28. lans = max(lans, a[i] - b[j]);
  29. }
  30. if(lans > ans) {
  31. ans = lans;
  32. Ans = cur;
  33. }
  34. }
  35. sort(Ans.begin(), Ans.end());
  36. printf("%d\n%d\n", ans, (int)Ans.size());
  37. for(int i = 0, len = Ans.size(); i < len; ++i) {
  38. printf("%d ", Ans[i]);
  39. }
  40. return 0;
  41. }

CF1108E2. Array and Segments (Hard version)

做法:线段树优化暴力

考虑优化E1的暴力,注意到m很小,所以复杂度里面是可以有一个m的.然后利用线段树来优化把线段覆盖下去的过程,即利用线段树维护区间修改,维护区间min.这样的复杂度是\(O(nmlogn)\)的.这样朴素的去做会TLE on 12.发现每次如果加入线段然后再删除线段会有很多重复的操作,可以拿一个数组来标记哪条线段有覆盖哪条没有,如果有线段不能覆盖下去且已经覆盖了,那么就+1回去,能覆盖下去的同理,这样修改次数就大大降低了.这样就能通过本题了

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int N = 1e5 + 10;
  5. const int inf = 0x3f3f3f3f;
  6. int n, m, a[N], b[N];
  7. struct seg {
  8. int l, r, id;
  9. } s[N];
  10. vector<int> Ans;
  11. int ans = -1;
  12. struct tree {
  13. int l, r, mn, tag;
  14. } t[N<<2];
  15. #define lc (rt << 1)
  16. #define rc (rt << 1 | 1)
  17. void pushup(int rt) { t[rt].mn = min(t[lc].mn, t[rc].mn); }
  18. void build(int l, int r, int rt) {
  19. t[rt].l = l; t[rt].r = r; t[rt].mn = inf;
  20. if(l == r) { t[rt].mn = a[l]; return; }
  21. int mid = (l + r) >> 1;
  22. build(l, mid, lc); build(mid + 1, r, rc); pushup(rt);
  23. }
  24. void pushdown(int rt) {
  25. if(t[rt].tag) {
  26. int &x = t[rt].tag;
  27. t[lc].tag += x; t[rc].tag += x;
  28. t[lc].mn += x; t[rc].mn += x;
  29. x = 0;
  30. }
  31. }
  32. #define l (t[rt].l)
  33. #define r (t[rt].r)
  34. void upd(int L, int R, int c, int rt) {
  35. if(L <= l && r <= R) {
  36. t[rt].tag += c; t[rt].mn += c;
  37. return;
  38. }
  39. pushdown(rt); int mid = (l + r) >> 1;
  40. if(L <= mid) upd(L, R, c, lc);
  41. if(R > mid) upd(L, R, c, rc);
  42. pushup(rt);
  43. }
  44. #undef l
  45. #undef r
  46. #undef lc
  47. #undef rc
  48. bool vis[N];
  49. int main() {
  50. scanf("%d%d", &n, &m);
  51. for(int i = 1; i <= n; ++i) scanf("%d", &a[i]);
  52. for(int i = 1; i <= m; ++i) scanf("%d%d", &s[i].l, &s[i].r), s[i].id = i;
  53. build(1, n, 1);
  54. for(int i = 1; i <= n; ++i) {
  55. vector<int> cur; cur.clear();
  56. int lans = 0;
  57. for(int j = 1; j <= m; ++j) {
  58. if(s[j].l <= i && i <= s[j].r) {
  59. if(vis[j]) {
  60. vis[j] = 0;
  61. upd(s[j].l, s[j].r, 1, 1);
  62. }
  63. } else {
  64. if(!vis[j]) vis[j] = 1, upd(s[j].l, s[j].r, -1, 1);
  65. cur.push_back(j);
  66. }
  67. }
  68. lans = max(0, a[i] - t[1].mn);
  69. if(lans > ans) {
  70. ans = lans;
  71. Ans = cur;
  72. }
  73. }
  74. sort(Ans.begin(), Ans.end());
  75. printf("%d\n%d\n", ans, (int)Ans.size());
  76. for(int i = 0, len = Ans.size(); i < len; ++i) {
  77. printf("%d ", Ans[i]);
  78. }
  79. return 0;
  80. }

CF1108F. MST Unification

做法:最小生成树

考虑怎么样才会使一个最小生成树不唯一.设有一条边边权为val,且它没有在最小生成树中,那么加入最小生成树之后,就会出来一个环,如果这个环中有一条边边权为val,那么这个mst就是不唯一的.可以倍增实现这个过程但是比较麻烦,也可以选择就是对所有边权相同的边权统一考虑一下:如果此边的两个端点已经在最小生成树里面了,那么显然这条边对mst的唯一性没有影响(因为连接它的边边权一定更小),不用管它.如果两端点之前还未接入最小生成树,但是在加到这条边的时候又已经加入了(即有同样长度的边使两端点联通),那么这条边就一定会对答案产生影响,需要+1保证mst的唯一性

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int N = 200010;
  5. struct edge {
  6. int x, y, v;
  7. } e[N];
  8. int n, m, f[N];
  9. bool cmp(edge a, edge b) {
  10. return a.v < b.v;
  11. }
  12. int find(int x) {
  13. if(f[x] == x) return x;
  14. else return f[x] = find(f[x]);
  15. }
  16. int main() {
  17. scanf("%d%d", &n, &m);
  18. for(int i = 1; i <= m; ++i) {
  19. scanf("%d%d%d", &e[i].x, &e[i].y, &e[i].v);
  20. }
  21. sort(e + 1, e + m + 1, cmp);
  22. for(int i = 1; i <= n; ++i) f[i] = i;
  23. int ans = 0;
  24. for(int i = 1, j = 1; i <= m; i = j) {
  25. while(j <= m && e[j].v == e[i].v) ++j;
  26. int tot = j - i;
  27. for(int k = i; k < j; ++k) {
  28. int x = find(e[k].x), y = find(e[k].y);
  29. if(x == y) --tot;
  30. }
  31. for(int k = i; k < j; ++k) {
  32. int x = find(e[k].x), y = find(e[k].y);
  33. if(x == y) continue;
  34. f[x] = y;
  35. --tot;
  36. }
  37. ans += tot;
  38. }
  39. printf("%d\n", ans);
  40. }

Codeforces Round #535 (Div. 3) 解题报告的更多相关文章

  1. Codeforces Round #324 (Div. 2)解题报告

    ---恢复内容开始--- Codeforces Round #324 (Div. 2) Problem A 题目大意:给二个数n.t,求一个n位数能够被t整除,存在多组解时输出任意一组,不存在时输出“ ...

  2. Codeforces Round #382 (Div. 2) 解题报告

    CF一如既往在深夜举行,我也一如既往在周三上午的C++课上进行了virtual participation.这次div2的题目除了E题都水的一塌糊涂,参赛时的E题最后也没有几个参赛者AC,排名又成为了 ...

  3. Codeforces Round #380 (Div. 2) 解题报告

    第一次全程参加的CF比赛(虽然过了D题之后就开始干别的去了),人生第一次codeforces上分--(或许之前的比赛如果都参加全程也不会那么惨吧),终于回到了specialist的行列,感动~.虽然最 ...

  4. Codeforces Round #216 (Div. 2)解题报告

    又范低级错误! 只做了两题!一道还被HACK了,囧! A:看了很久!应该是到语文题: 代码:#include<iostream> #include<];    ,m2=;    ;i ...

  5. Codeforces Round #281 (Div. 2) 解题报告

    题目地址:http://codeforces.com/contest/493 A题 写完后就交了,然后WA了,又读了一遍题,没找出错误后就开始搞B题了,后来回头重做的时候才发现,球员被红牌罚下场后还可 ...

  6. Codeforces Round #277 (Div. 2) 解题报告

    题目地址:http://codeforces.com/contest/486 A题.Calculating Function 奇偶性判断,简单推导公式. #include<cstdio> ...

  7. Codeforces Round #276 (Div. 2) 解题报告

    题目地址:http://codeforces.com/contest/485 A题.Factory 模拟.判断是否出现循环,如果出现,肯定不可能. 代码: #include<cstdio> ...

  8. Codeforces Round #350 (Div. 2)解题报告

    codeforces 670A. Holidays 题目链接: http://codeforces.com/contest/670/problem/A 题意: A. Holidays On the p ...

  9. Codeforces Round #479 (Div. 3)解题报告

    题目链接: http://codeforces.com/contest/977 A. Wrong Subtraction 题意 给定一个数x,求n次操作输出.操作规则:10的倍数则除10,否则减1 直 ...

随机推荐

  1. 检索系统向量化计算query-doc相似度

    def cal_sim2(A,B): ''' A :query [1,2] B: answers [[1,2],[3,5]] ''' need_norm=False A = np.array(A) B ...

  2. html5-新元素新布局模板-完善中

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  3. keras如何求分类问题中的准确率和召回率

    https://www.zhihu.com/question/53294625 由于要用keras做一个多分类的问题,评价标准采用precision,recall,和f1_score:但是keras中 ...

  4. python 内置函数 sorted()

    sorted() 函数对所有可迭代的对象进行排序操作. sort 与 sorted 区别: sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作. list 的 s ...

  5. 【转】ETL讲解(很详细!!!)

    ETL是将业务系统的数据经过抽取.清洗转换之后加载到数据仓库的过程,目的是将企业中的分散.零乱.标准不统一的数据整合到一起,为企业的决策提供分析依据. ETL是BI项目重要的一个环节. 通常情况下,在 ...

  6. 增强for循环遍历集合或数组

    遍历:for循环遍历数组或集合:iterator迭代器遍历集合:还有增强for循环(for each)遍历数组或集合: 遍历数组: 遍历集合:

  7. 20165215 2017-2018-2《Java程序设计》第一周学习总结

    20165215 2017-2018-2 <Java程序设计>第一周学习总结 教材学习内容总结 跟随网课学习了<Java2 实用教程>的第一章,进行了基础的编译练习 在Ubun ...

  8. centos6.8卸载DB2 10.5

    1.卸载实例 Ø  使用Root用户登陆 cd /opt/ibm/db2/V9.5/instance/ ./db2idrop db2inst1 ./dasdrop db2inst1 2.卸载db2 Ø ...

  9. GUI常用对话框4

    %普通对话框 dialog %单击时会关闭当前窗口 %自定义 关于对话框 点击确定 关闭 h = dialog( ]); uicontrol( ], ... 'string','确定','Callba ...

  10. Python+OpenCV图像处理(七)—— 滤波与模糊操作

    过滤是信号和图像处理中基本的任务.其目的是根据应用环境的不同,选择性的提取图像中某些认为是重要的信息.过滤可以移除图像中的噪音.提取感兴趣的可视特征.允许图像重采样等等.频域分析将图像分成从低频到高频 ...