前言

比赛链接:

Div.1 : http://47.110.12.131:9016/contest/13

Div.2 : http://47.110.12.131:9016/contest/12

Div.2——Charlotte

下面是 Div.2 的题解。

A. 我思及他人

对于 \(10\%\) 的数据,枚举 \(A,B,C\) 判断即可,时间复杂度 \(O(n^3)\)。

对于 \(30\%\) 的数据,枚举 \(A,B\) 判断 \(C\) 是否合法即可,时间复杂度 \(O(n^2)\)。

对于 \(50\%\) 的数据,枚举 \(C\) 计算它对答案的贡献即可,时间复杂度 \(O(n)\)。

对于 \(100\%\) 的数据,我们考虑把上面对 \(C\) 贡献的计算用数学方法搞成这样一个式子:(只用到了等差数列的求和公式)

\[ans=\sum_{i=1}^{R-2\times L+1}i=\frac{(R-2\times L+1)\cdot(R-2\times L+2)}{2}
\]

这样的时间复杂度为 \(O(1)\),即可通过本题。

  1. if(R-L-L<0) printf("0\n");
  2. else printf("%lld\n",(R-L-L+1)*(R-L-L+2)/2);

B. 恋情与火焰

这题应该算是道送分题——输出 No 有 \(60\) 分。(当然乱搞还可以得到更多的分)

但实际上正解也不算很难。

设 \(m\) 为 \(a_i\) 中的最小值,\(M\) 为 \(a_i\) 中的最大值,\(cnt\) 为 \(a_i\) 中 \(m\) 出现的次数。

  • 首先有一个显然的结论:若 \(M-m>1\),则不存在合法的构造方案。

  • 考虑另一种比较简单的结论:若 \(M-m=0\),则当且仅当 \(cnt=n-1\) 或 \(2\times cnt\leq n\) 时存在合法的构造方案。

事实上,我们会发现:\(n\) 个人中的颜色要么全都不同,要么就不存在某种颜色只出现了一次。

当颜色全都不同时,\(cnt=n-1\);当不存在某种颜色只出现了一次时,\(2\times cnt\leq n\)。

  • 最后来看这样一个结论:若 \(M-m=1\),则当且仅当 \(m<cnt\) 或 \(n-cnt<2\times (M-cnt)\) 时存在合法构造方案。

我们考虑 \(cnt\) 的本质意义:只出现一次的颜色数量。

对于一个颜色只出现一次的人来说,他能看到除自己以外所有只出现一次的颜色,有 \(cnt-1\) 种。

同时他还能看到至少一种出现多次的颜色,所以他至少应该看到 \(cnt\) 种颜色。

于是合法的构造要满足 \(m\geq cnt\)。

类似地,对于一个颜色出现多次的人来说,他可以看到当前的所有颜色,所以 \(M\) 是颜色总数。

那么 \(M-cnt\) 就是出现多次颜色的数量。

而出现多次的颜色至少要有两个,那么此时就需要满足 \(n-cnt\geq 2\times (M-cnt)\) 才有合法方案。

根据上述三个结论便可得到正解。

  1. #include<bits/stdc++.h>
  2. #define Re register
  3. using namespace std;
  4. const int N=100005;
  5. int n,a[N];
  6. int cnt,Max,Min=0x3f3f3f3f;
  7. int main()
  8. {
  9. scanf("%d",&n);
  10. for(Re int i=1;i<=n;i++)
  11. {
  12. scanf("%d",&a[i]);
  13. Max=max(Max,a[i]);
  14. Min=min(Min,a[i]);
  15. }
  16. for(Re int i=1;i<=n;i++)
  17. {
  18. if(a[i]==Min)
  19. {
  20. cnt++;
  21. }
  22. }
  23. if(Max-Min>1) return 0*puts("No");
  24. if(Max==Min)
  25. {
  26. if(Min==n-1||2*Min<=n) return 0*puts("Yes");
  27. else return 0*puts("No");
  28. }
  29. if(Min<cnt||n+cnt<2*Max) return 0*puts("No");
  30. return 0*puts("Yes");
  31. }

C. 未曾留意的幸福

取 \(x=\left(\prod\limits_{i=1}^{n}a_i\right)-1\) 可得 \(f(x)=\left(\sum\limits_{i=1}^{n}a_i\right)-n\)。

这样 \(O(n)\) 计算即可。

  1. scanf("%d",&n);
  2. for(Re int i=1;i<=n;i++)
  3. {
  4. scanf("%d",&a);
  5. ans+=a;
  6. }
  7. printf("%d",ans-n);

D. 不在此处的世界

考虑 \(\operatorname{lcm}(x,y)\) 可能取到的最小值。

实际上,取 \(x=L,y=2\times L\) 得到 \(\operatorname{lcm}(x,y)=2\times L\) 为最小值。

这样 \(O(1)\) 计算即可。

  1. if(r<2*l) puts("-1 -1");
  2. else printf("%d %d\n",l,2*l);

E. 你我的约定

把每个 pair 写作 \((a_i,b_i)\)、\((-a_i,-b_i)\) 的形式。

那个符号的组合意义就变成是 \((a_i,b_i)\) 到 \((-a_j,-b_j)\) 的折路径个数。

于是就可以在平面上 DP 来一起统计:设 \(f_{i,j}\) 表示 \((i,j)\) 到它左下角的点的路径总数。

那么有 \(f_{i,j}=f_{i-1,j}+f_{i,j-1}+cnt_{i,j}\),搞定。

Div.1——某科学的超电磁炮

下面是 Div.1 的题解。

A. RAILGUN

同 Div.2 的 A 题。

B. 御坂妹妹

答案就是两倍总边长减去树的直径。

这个比较显然,你手模一下,发现整棵树绝大多数边都需要遍历两遍,除了其中一条路径,那么当然减去直径最合算。

C. 白井黑子

同 Div.2 的 B 题。

D. 上条当麻

答案为:\(P^{(n-1)^2}\),因为你枚举左上的 \(n-1\) 行和 \(n-1\) 列的结果,有这么多种。

于是你可以求得 \(A_{i,n}=P\cdot(N-1)-\sum_{j=1}^nA_{i,j}\),\(A_{n,i}\) 也同理。

对于 \(A_{n,n}\),你会惊奇地发现没有冲突!

注意:\(C\) 是没有用的,实现的时候,模数只能对 \(998244353-1\) 取模。

  1. inline void solve()
  2. {
  3. long long n, c, m; cin >>n >>c >>m;
  4. cout << qpow(m % 998244353, (n - 1) % 998244352 * ((n - 1) % 998244352) % 998244352) << endl;
  5. }

E. 信仰不灭

这个是 SG 函数的模板应用,如果不会的话可以看一下 SG 函数的 oi-wiki,代码如下:

  1. #include <bits/stdc++.h>
  2. using namespace std; typedef long long ll; const int maxn = 5e6 + 1e2;
  3. int n, cnt, SG[maxn]; unordered_map<ll, int> id;
  4. inline ll get(int x, int y) { return x * 100000ll + y; }
  5. int DFS(int x, int y)
  6. {
  7. //cerr << x << ' ' << y << ' ' << cnt << endl;
  8. if (x + y >= n) return 0; int u, v;
  9. if (u = id[get(x, y)]) return SG[u]; u = id[get(x, y)] = ++cnt;
  10. v = DFS(1, x + y); if (!v) SG[u] = 1;
  11. v = DFS(x * 2, y); if (!v) SG[u] = 1;
  12. v = DFS(x * 3, y); if (!v) SG[u] = 1; return SG[u];
  13. }
  14. extern "C" int _opt(int nn, int x, int y)
  15. {
  16. n = nn, DFS(1, 0);
  17. if (!SG[id[get(1, x + y)]]) return 1;
  18. if (!SG[id[get(x * 2, y)]]) return 2;
  19. if (!SG[id[get(x * 3, y)]]) return 3;
  20. return -1;
  21. }
  22. int main()
  23. {
  24. int n, a, b; cin >> n >>a >>b;
  25. cout << _opt(n, a, b) << endl;
  26. }

YAOI Round #5 题解的更多相关文章

  1. YAOI Round #7 题解

    前言 比赛链接: Div.1 : http://47.110.12.131:9016/contest/16 Div.2 : http://47.110.12.131:9016/contest/15 D ...

  2. YAOI Round #3 题解

    前言 比赛链接: Div.1 : http://47.110.12.131:9016/contest/7 Div.2 : http://47.110.12.131:9016/contest/8 Div ...

  3. YAOI Round #1 题解

    前言 比赛网址:http://47.110.12.131:9016/contest/3 总体来说,这次比赛是有一定区分度的, \(\text{ACM}\) 赛制也挺有意思的. 题解 A. 云之彼端,约 ...

  4. Codeforces Round #556 题解

    Codeforces Round #556 题解 Div.2 A Stock Arbitraging 傻逼题 Div.2 B Tiling Challenge 傻逼题 Div.1 A Prefix S ...

  5. LibreOJ β Round #2 题解

    LibreOJ β Round #2 题解 模拟只会猜题意 题目: 给定一个长为 \(n\) 的序列,有 \(m\) 次询问,每次问所有长度大于 \(x\) 的区间的元素和的最大值. \(1 \leq ...

  6. Codeforces Round #569 题解

    Codeforces Round #569 题解 CF1179A Valeriy and Deque 有一个双端队列,每次取队首两个值,将较小值移动到队尾,较大值位置不变.多组询问求第\(m\)次操作 ...

  7. Codeforces Round #557 题解【更完了】

    Codeforces Round #557 题解 掉分快乐 CF1161A Hide and Seek Alice和Bob在玩捉♂迷♂藏,有\(n\)个格子,Bob会检查\(k\)次,第\(i\)次检 ...

  8. CFEducational Codeforces Round 66题解报告

    CFEducational Codeforces Round 66题解报告 感觉丧失了唯一一次能在CF上超过wqy的机会QAQ A 不管 B 不能直接累计乘法打\(tag\),要直接跳 C 考虑二分第 ...

  9. Google kickstart 2022 Round A题解

    Speed Typing 题意概述 给出两个字符串I和P,问能否通过删除P中若干个字符得到I?如果能的话,需要删除字符的个数是多少? 数据规模 \[1≤|I|,|P|≤10^5 \] 双指针 设置两个 ...

随机推荐

  1. git&nodejs安装教程

    git https://www.cnblogs.com/ximiaomiao/p/7140456.html nodejs https://jingyan.baidu.com/article/e7505 ...

  2. AtCoder Regular Contest 121 D - 1 or 2

    题目链接:点我点我 Problem Statement Snuke has a blackboard and NN candies. The tastiness of the ii-th candy ...

  3. opentack - 本地化

    目录 1 Openstack minimal component 1 组件与功能 2 集群数据存储 2 neutron控制端和计算节点 2.1 SDN网络实现方式 2.2 安全组实现 2.3 虚拟机内 ...

  4. Git使用总结(包含Git Bash和Git GUI的使用)(转自CSDN)

    基本命令 初始化设置 配置本机的用户名和Email地址 $ git config --global user.name "Your Name" $ git config --glo ...

  5. AI框架类FAQ

    AI框架类FAQ 数据处理 问题:如何在训练过程中高效读取数量很大的数据集? 答复:当训练时使用的数据集数据量较大或者预处理逻辑复杂时,如果串行地进行数据读取,数据读取往往会成为训练效率的瓶颈.这种情 ...

  6. 如何使用TensorCores优化卷积

    如何使用TensorCores优化卷积 本文将演示如何在TVM中使用TensorCores编写高性能的卷积计划.假设卷积的输入有大量数据.首先介绍如何在GPU上优化卷积. TensorCore简介 每 ...

  7. 使用nGraph的Intel&#174;Xeon&#174;上的高性能TensorFlow

    使用nGraph的IntelXeon上的高性能TensorFlow High-performance TensorFlow* on Intel Xeon Using nGraph 最近宣布了nGrap ...

  8. Java抽象类、继承及多态和适配器的实现

    Java继承 方法重写是Java语言多态的特性,必须满足以下条件 在子类中,方法名称与父类方法名称完全相同 方法的参数个数和类型完全相同,返回类型完全相同 方法的访问修饰符访问级别不低于父类同名方法的 ...

  9. NX二次开发-通过3x3矩阵获取XYZ轴矢量

    函数:UF_CSYS_ask_wcs() 函数说明:通过3x3矩阵获取XYZ轴矢量 用法: 1 #include <uf.h> 2 #include <uf_mtx.h> 3 ...

  10. .NET平台系列31:.NET团队送给.NET开发人员的云原生学习资源汇总

    系列目录     [已更新最新开发文章,点击查看详细] .NET Core 启动于2016年,跟K8S同年诞生,既拥有着悠久的历史积累,又集成了当下最新的设计理念,加上.NET团队持续对容器技术的官方 ...