YAOI Round #5 题解
前言
比赛链接:
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\) 贡献的计算用数学方法搞成这样一个式子:(只用到了等差数列的求和公式)
\]
这样的时间复杂度为 \(O(1)\),即可通过本题。
if(R-L-L<0) printf("0\n");
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)\) 才有合法方案。
根据上述三个结论便可得到正解。
#include<bits/stdc++.h>
#define Re register
using namespace std;
const int N=100005;
int n,a[N];
int cnt,Max,Min=0x3f3f3f3f;
int main()
{
scanf("%d",&n);
for(Re int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
Max=max(Max,a[i]);
Min=min(Min,a[i]);
}
for(Re int i=1;i<=n;i++)
{
if(a[i]==Min)
{
cnt++;
}
}
if(Max-Min>1) return 0*puts("No");
if(Max==Min)
{
if(Min==n-1||2*Min<=n) return 0*puts("Yes");
else return 0*puts("No");
}
if(Min<cnt||n+cnt<2*Max) return 0*puts("No");
return 0*puts("Yes");
}
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)\) 计算即可。
scanf("%d",&n);
for(Re int i=1;i<=n;i++)
{
scanf("%d",&a);
ans+=a;
}
printf("%d",ans-n);
D. 不在此处的世界
考虑 \(\operatorname{lcm}(x,y)\) 可能取到的最小值。
实际上,取 \(x=L,y=2\times L\) 得到 \(\operatorname{lcm}(x,y)=2\times L\) 为最小值。
这样 \(O(1)\) 计算即可。
if(r<2*l) puts("-1 -1");
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\) 取模。
inline void solve()
{
long long n, c, m; cin >>n >>c >>m;
cout << qpow(m % 998244353, (n - 1) % 998244352 * ((n - 1) % 998244352) % 998244352) << endl;
}
E. 信仰不灭
这个是 SG 函数的模板应用,如果不会的话可以看一下 SG 函数的 oi-wiki,代码如下:
#include <bits/stdc++.h>
using namespace std; typedef long long ll; const int maxn = 5e6 + 1e2;
int n, cnt, SG[maxn]; unordered_map<ll, int> id;
inline ll get(int x, int y) { return x * 100000ll + y; }
int DFS(int x, int y)
{
//cerr << x << ' ' << y << ' ' << cnt << endl;
if (x + y >= n) return 0; int u, v;
if (u = id[get(x, y)]) return SG[u]; u = id[get(x, y)] = ++cnt;
v = DFS(1, x + y); if (!v) SG[u] = 1;
v = DFS(x * 2, y); if (!v) SG[u] = 1;
v = DFS(x * 3, y); if (!v) SG[u] = 1; return SG[u];
}
extern "C" int _opt(int nn, int x, int y)
{
n = nn, DFS(1, 0);
if (!SG[id[get(1, x + y)]]) return 1;
if (!SG[id[get(x * 2, y)]]) return 2;
if (!SG[id[get(x * 3, y)]]) return 3;
return -1;
}
int main()
{
int n, a, b; cin >> n >>a >>b;
cout << _opt(n, a, b) << endl;
}
YAOI Round #5 题解的更多相关文章
- YAOI Round #7 题解
前言 比赛链接: Div.1 : http://47.110.12.131:9016/contest/16 Div.2 : http://47.110.12.131:9016/contest/15 D ...
- YAOI Round #3 题解
前言 比赛链接: Div.1 : http://47.110.12.131:9016/contest/7 Div.2 : http://47.110.12.131:9016/contest/8 Div ...
- YAOI Round #1 题解
前言 比赛网址:http://47.110.12.131:9016/contest/3 总体来说,这次比赛是有一定区分度的, \(\text{ACM}\) 赛制也挺有意思的. 题解 A. 云之彼端,约 ...
- Codeforces Round #556 题解
Codeforces Round #556 题解 Div.2 A Stock Arbitraging 傻逼题 Div.2 B Tiling Challenge 傻逼题 Div.1 A Prefix S ...
- LibreOJ β Round #2 题解
LibreOJ β Round #2 题解 模拟只会猜题意 题目: 给定一个长为 \(n\) 的序列,有 \(m\) 次询问,每次问所有长度大于 \(x\) 的区间的元素和的最大值. \(1 \leq ...
- Codeforces Round #569 题解
Codeforces Round #569 题解 CF1179A Valeriy and Deque 有一个双端队列,每次取队首两个值,将较小值移动到队尾,较大值位置不变.多组询问求第\(m\)次操作 ...
- Codeforces Round #557 题解【更完了】
Codeforces Round #557 题解 掉分快乐 CF1161A Hide and Seek Alice和Bob在玩捉♂迷♂藏,有\(n\)个格子,Bob会检查\(k\)次,第\(i\)次检 ...
- CFEducational Codeforces Round 66题解报告
CFEducational Codeforces Round 66题解报告 感觉丧失了唯一一次能在CF上超过wqy的机会QAQ A 不管 B 不能直接累计乘法打\(tag\),要直接跳 C 考虑二分第 ...
- Google kickstart 2022 Round A题解
Speed Typing 题意概述 给出两个字符串I和P,问能否通过删除P中若干个字符得到I?如果能的话,需要删除字符的个数是多少? 数据规模 \[1≤|I|,|P|≤10^5 \] 双指针 设置两个 ...
随机推荐
- Nginx实战部署常用功能演示(超详细版),绝对给力~~~
前言 上次分享了一些开发过程中常用的功能,但如果到真实环境中,其实还需要一些额外的配置,比如说跨域.缓存.配置SSL证书.高可用等,老规矩,还是挑几个平时比较常用的进行演示分享.上篇详见Nginx超详 ...
- Go语言流程控制02--选择结构之switch
package main import "fmt" /* @星座诊所2(switch) 根据用户输入的出生月份猜测其星座: ·白羊(4) 金牛(5) 双子(6) 巨蟹(7) 狮子( ...
- APA自动泊车系统
APA自动泊车系统 1. 半自动泊车 自动泊车又称为自动泊车入位,它对于新手来说是一项相当便捷的配置,对于老手来说也省了些不少力气.那么自动泊车的原理是什么呢?能想怎么停就怎么停,想停哪儿就停哪儿吗? ...
- Spring源码分析-从@ComponentScan注解配置包扫描路径到IoC容器中的BeanDefinition,经历了什么(一)?
阅前提醒 全文较长,建议沉下心来慢慢阅读,最好是打开Idea,点开Spring源码,跟着下文一步一步阅读,更加便于理解.由于笔者水平优先,编写时间仓促,文中难免会出现一些错误或者不准确的地方,恳请各位 ...
- UE4.22编辑器界面操控设置(4)
视频课程地址:https://i.youku.com/i/UMzE2NDk2OTIw/custom?spm=a2hzp.8244740.0.0&id=32318 -在场景中按住鼠标左键上下移动 ...
- 想自己写框架?不了解Java注解机制可不行
无论是在JDK还是框架中,注解都是很重要的一部分,我们使用过很多注解,但是你有真正去了解过他的实现原理么?你有去自己写过注解么? 概念 注解(Annotation),也叫元数据.一种代码级别的说明.它 ...
- LockSupport中的park()与unpark()
类注释原文:Basic thread blocking primitives for creating locks and other synchronization classes.意思就是Lock ...
- 【题解】逐个击破 luogu2700
题目 题目描述: 现在有N个城市,其中K个被敌方军团占领了,N个城市间有N-1条公路相连,破坏其中某条公路的代价是已知的. 现在,告诉你K个敌方军团所在的城市,以及所有公路破坏的代价,请你算出花费最少 ...
- DOS命令行(11)——更多实用的命令行工具
start 启动另一个窗口运行指定的程序或命令,所有的DOS命令和命令行程序都可以由start命令来调用.该命令不仅能运行程序,还能运行协议对应的程序 命令格式:START ["title& ...
- Golang中的各种时间操作
Golang中的各种时间操作 需求 时间格式的转换比较麻烦,自己写了个工具,可以通过工具中的这些方法相互调用转成自己想要的格式,代码如下,后续有新的函数再添加 实现代码 package utils i ...