题目地址

https://atcoder.jp/contests/abc146/tasks

感觉没有什么有意思的题...

题解

A

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. string s;
  4. int main() {
  5. cin >> s; int now = 0;
  6. if(s[0] == 'S') {
  7. if(s[1] == 'U') now = 0;
  8. else now = 6;
  9. }
  10. if(s[0] == 'M') now = 1;
  11. if(s[0] == 'T') {
  12. if(s[1] == 'U') now = 2;
  13. else now = 4;
  14. }
  15. if(s[0] == 'W') now = 3;
  16. if(s[0] == 'F') now = 5;
  17. printf("%d\n", 7 - now);
  18. }

B

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. char s[10000];
  4. int main() {
  5. int n; cin >> n;
  6. scanf("%s", s);
  7. int len = strlen(s);
  8. for(int i = 0; i < len; ++i) {
  9. s[i] -= 'A';
  10. }
  11. for(int i = 0; i < len; ++i) {
  12. s[i] += n;
  13. s[i] %= 26;
  14. }
  15. for(int i = 0; i < len; ++i) putchar(s[i] + 'A');
  16. return 0;
  17. }

C

不难发现\(n\)和\(d(n)\)都是递增的。那么二分\(n\)即可。

注意数字上限是\(10^9\)。我一开始直接大力\(10^{18}\)结果wa了2发。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N = 100010;
  4. int n, c[N];
  5. int x[N], y[N], deg[N], g[N];
  6. int cnt, head[N];
  7. struct edge {int to, nxt, id;} e[N << 1];
  8. void ins(int u, int v, int id) {
  9. e[++cnt] = (edge) {v, head[u], id};
  10. head[u] = cnt;
  11. }
  12. void dfs(int u, int fa, int col) {
  13. int now = 0;
  14. for(int i = head[u]; i; i = e[i].nxt) {
  15. int v = e[i].to;
  16. if(v == fa) continue;
  17. ++now;
  18. if(now == col) ++now;
  19. g[e[i].id] = now;
  20. dfs(v, u, now);
  21. }
  22. }
  23. int main() {
  24. cin >> n;
  25. for(int i = 1; i < n; ++i) {
  26. cin >> x[i] >> y[i];
  27. deg[x[i]]++; deg[y[i]]++;
  28. ins(x[i], y[i], i), ins(y[i], x[i], i);
  29. }
  30. int ans = 0;
  31. for(int i = 1; i <= n; ++i)
  32. if(deg[i] > deg[ans]) ans = i;
  33. cout << deg[ans] << endl;
  34. dfs(ans, ans, 0);
  35. for(int i = 1; i < n; ++i) printf("%d\n", g[i]);
  36. }

D

显然答案是最大度数。随便钦定个点为根然后遍历一遍,记录一下入边的颜色就可以染色了。

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N = 100010;
  4. int n, c[N];
  5. int x[N], y[N], deg[N], g[N];
  6. int cnt, head[N];
  7. struct edge {int to, nxt, id;} e[N << 1];
  8. void ins(int u, int v, int id) {
  9. e[++cnt] = (edge) {v, head[u], id};
  10. head[u] = cnt;
  11. }
  12. void dfs(int u, int fa, int col) {
  13. int now = 0;
  14. for(int i = head[u]; i; i = e[i].nxt) {
  15. int v = e[i].to;
  16. if(v == fa) continue;
  17. ++now;
  18. if(now == col) ++now;
  19. g[e[i].id] = now;
  20. dfs(v, u, now);
  21. }
  22. }
  23. int main() {
  24. cin >> n;
  25. for(int i = 1; i < n; ++i) {
  26. cin >> x[i] >> y[i];
  27. deg[x[i]]++; deg[y[i]]++;
  28. ins(x[i], y[i], i), ins(y[i], x[i], i);
  29. }
  30. int ans = 0;
  31. for(int i = 1; i <= n; ++i)
  32. if(deg[i] > deg[ans]) ans = i;
  33. cout << deg[ans] << endl;
  34. dfs(ans, ans, 0);
  35. for(int i = 1; i < n; ++i) printf("%d\n", g[i]);
  36. }

E

唯一一个需要想一想的题。

考虑题目所求为\(s[r] - s[l] \equiv r - l \mod k\),移项一下就是\(s[r] - r \equiv s[l] - l \mod k\)

然后直接拿个map什么的东西算一算就行了。

注意判断\(r-l\)大于\(k\)的情况,是不合法情况。

  1. /*
  2. s[r] - s[l] = r - l (mod k)
  3. s[r] - r = s[l] - l (mod k)
  4. */
  5. #include <bits/stdc++.h>
  6. using namespace std;
  7. typedef long long ll;
  8. const int N = 200010;
  9. int n, k;
  10. ll s[N];
  11. map<ll,ll>S;
  12. int main() {
  13. cin >> n >> k;
  14. for(int i = 1, x; i <= n; ++i) {
  15. cin >> x;
  16. s[i] = s[i - 1] + x;
  17. }
  18. S[0] = 1;
  19. ll ans = 0;
  20. int l = 0;
  21. // for(int i = 1; i <= n; ++i) printf("%d ", (s[i] - i + k) % k);
  22. // puts("");
  23. for(int i = 1; i <= n; ++i) {
  24. if(i >= k) {S[(s[l] - l + k) % k]--; ++l;}
  25. ans += S[(s[i] - i + k) % k];
  26. // printf("%d ", S[(s[i] - i + k) % k]);
  27. S[(s[i] - i + k) % k]++;
  28. }//puts("");
  29. printf("%lld\n", ans);
  30. return 0;
  31. }

F

直接单调队列优化dp即可。dp的时候记录一下转移点。复杂度\(O(n)\)

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. const int N = 200010;
  5. int n, m, f[N], g[N], st[N], top;
  6. char s[N];
  7. struct Node {int v, id;};
  8. deque<Node>q;
  9. int main() {
  10. memset(g, -1, sizeof(g));
  11. memset(f, 0x3f, sizeof(f));
  12. scanf("%d%d", &n, &m);
  13. scanf("%s", s);
  14. f[0] = 0; q.push_back({f[0], 0});
  15. for(int i = 1; i <= n; ++i) {
  16. while(!q.empty() && i - q.front().id > m) q.pop_front();
  17. if(s[i] == '1') continue;
  18. if(!q.empty()) f[i] = q.front().v + 1, g[i] = q.front().id;
  19. while(!q.empty() && q.back().v > f[i]) q.pop_back();
  20. if(f[i] != 0x3f3f3f3f) q.push_back({f[i], i});
  21. }
  22. if(g[n] == -1) return puts("-1"), 0;
  23. int now = n;
  24. while(g[now] != -1) {st[++top] = now - g[now], now = g[now];}
  25. while(top) printf("%d ", st[top--]);
  26. puts("");
  27. }

AtCoder Beginner Contest 146解题报告的更多相关文章

  1. AtCoder Beginner Contest 122 解题报告

    手速选手成功混进rated only里面的前30名,但是总排名就到110+了... A - Double Helix #include <bits/stdc++.h> #define ll ...

  2. Atcoder Beginner Contest 124 解题报告

    心态爆炸.本来能全做出来的.但是由于双开了Comet oj一个比赛,写了ABC就去搞那个的B题 还被搞死了. 回来写了一会D就过了.可惜比赛已经结束了.真的是作死. A - Buttons #incl ...

  3. AtCoder Beginner Contest 118 解题报告

    A - B +/- A #include <bits/stdc++.h> int main() { int a, b; std::cin >> a >> b; b ...

  4. AtCoder Beginner Contest 120 解题报告

    为啥最近都没有arc啊... A - Favorite Sound #include <algorithm> #include <iostream> #include < ...

  5. AtCoder Beginner Contest 117 解题报告

    果然abc都是手速场. 倒序开的qwq. D题因为忘记1e12二进制几位上界爆了一发. A - Entrance Examination 就是除一下就行了... 看样例猜题意系列. #include& ...

  6. AtCoder Beginner Contest 132 解题报告

    前四题都好水.后面两道题好难. C Divide the Problems #include <cstdio> #include <algorithm> using names ...

  7. AtCoder Beginner Contest 129 解题报告

    传送门 写了四个题就跑去打球了.第五题应该能肝出来的. A - Airplane #include <bits/stdc++.h> using namespace std; inline ...

  8. AtCoder Beginner Contest 127 解题报告

    传送门 非常遗憾.当天晚上错过这一场.不过感觉也会掉分的吧.后面两题偏结论题,打了的话应该想不出来. A - Ferris Wheel #include <bits/stdc++.h> u ...

  9. AtCoder Beginner Contest 126 解题报告

    突然6道题.有点慌.比赛写了五个.罚时爆炸.最后一个时间不太够+没敢写就放弃了. 两道题奇奇怪怪的WJ和20/20.今天的评测机是怎么了. A Changing a Character #includ ...

随机推荐

  1. 【Activiti学习之五】BPMN事件

    环境 JDK 1.8 MySQL 5.6 Tomcat 7 Eclipse-Luna activiti 6.0 一.事件定义1.定时器事件(1)timeDate:指定时间触发<timerEven ...

  2. Orm 常见查询实例

    一.Moon.Orm框架总述 (您还用hibernate?实体框架?) 1.框架名:Moon 意思是月亮,而非Mono.因为很喜欢明月,所以以此为名.它是一个.NET下的Orm框架. 2.发展历史:历 ...

  3. 关于 Keras 模型

    在 Keras 中有两类主要的模型:Sequential 顺序模型 和 使用函数式 API 的 Model 类模型. 1.Sequential 顺序模型 ====>>开始使用 Keras ...

  4. SQL Server创建、更改和删除架构

    SQL Server创建架构 学习如何使用SQL Server CREATE SCHEMA在当前数据库中创建新架构. SQL Server中的架构是什么 架构是包括表,视图,触发器,存储过程,索引等在 ...

  5. 【转帖】netstat命令总结

    netstat命令总结 https://www.cnblogs.com/chenqionghe/p/10654109.html nestat介绍 netstat是一款命令行工具,可用于列出系统上所有的 ...

  6. Shell获取指定区间随机未占用的端口号

    说明 最近在写Jenkins自动运维的脚本,由于是用的docker,部署的时候启动容器端口号冲突会导致部署失败,用的微服务也不在乎端口什么的,只求部署成功,所以想了很久,参考了一些文章,还有运维大哥的 ...

  7. SQL系列(八)—— 分组(group by)

    在很多场景时,需要对数据按照某条件进行分组统计其数量.平均值等等.有这种需求,SQL自然也有解决方式. 在SQL中通过group by子句对结果按某条件进行分组.语法: select count(co ...

  8. golang学习笔记--接口

    go 的接口类型用于定义一组行为,其中每个行为都由一个方法声明表示. 接口类型中的方法声明只有方法签名而没有方法实体,而方法签名包括且仅包括方法的名称.参数列表和结果列表. 只要一种数据类型的方法集合 ...

  9. .NET Core解析DNS域名或主机名的方法

    在.NET Core中我们可以用System.Net.Dns类来解析域名或主机名的IP地址,我们新建一个.NET Core控制台项目,写入下面代码: using System; using Syste ...

  10. SQL Server中临时表是在什么schema下的(转载)

    Specifying schema for temporary tables 问: I'm used to seeing temporary tables created with just the ...