Mail.Ru Cup 2018 Round 3 Solution
A. Determine Line
Water.
#include <bits/stdc++.h>
using namespace std; int n, vis[]; int main()
{
while (scanf("%d", &n) != EOF)
{
memset(vis, , sizeof vis);
for (int i = , tot, x; i <= n; ++i)
{
scanf("%d", &tot);
while (tot--)
{
scanf("%d", &x);
++vis[x];
}
}
for (int i = ; i <= ; ++i) if (vis[i] == n) printf("%d ", i);
puts("");
}
return ;
}
B. Divide Candies
Solved.
题意:
有$n \cdot n 的网格,每个网格放的糖数是(i^2 + j^2), i, j 表示行列$
求有多少个格子上的糖数是$m的倍数$
思路:
因为$m很小,处理出m的每个余数所对应的数字个数,再加加乘乘就好了$
#include <bits/stdc++.h>
using namespace std; #define ll long long
int n, m;
ll cnt[]; ll calc(ll x, ll y)
{
if (x % m >= y) return x / m + ;
return x / m;
} int main()
{
while (scanf("%d%d", &n, &m) != EOF)
{
memset(cnt, , sizeof cnt);
for (int i = ; i < m; ++i)
cnt[i * i % m] += calc(n, i);
--cnt[]; cnt[m] = cnt[];
ll res = ;
for (int i = ; i < m; ++i) res += cnt[i] * cnt[m - i];
printf("%lld\n", res);
}
return ;
}
C. Pick Heroes
Solved.
题意:
有两支队伍,每支队伍$n个人,每个人要选一个英雄,一共有2 \cdot n 个英雄$
$两支队伍的人轮流选,但是有些英雄有对应关系,也就是说如果某一轮一个人选了其中一个$
$那么在下一轮他的对手将被强制选择另一个,每个英雄最多存在于一个对应关系中$
这里是交互题。
思路:
贪心选即可,注意自己先手的时候,尽量先贪心选有对应关系的大的那只,再从大往小取
后手的时候注意特判,自己可不可以选有对应关系的英雄,如果可以,那么就回到先手状态
#include <bits/stdc++.h>
using namespace std; #define N 2010
#define pii pair <int, int>
int n, m, t;
vector <pii> v, p;
map <int, int> mp;
int vis[N]; int main()
{
while (scanf("%d%d", &n, &m) != EOF)
{
v.clear(); mp.clear(); p.clear();
memset(vis, , sizeof vis);
for (int i = , x; i <= * n; ++i)
{
scanf("%d", &x);
p.emplace_back(x, i);
}
for (int i = , x, y; i <= m; ++i)
{
scanf("%d%d", &x, &y);
mp[x] = y;
mp[y] = x;
v.emplace_back(x, y);
}
scanf("%d", &t);
for (auto &it : v) if (p[it.first - ].first < p[it.second - ].first) swap(it.first, it.second);
sort(p.begin(), p.end(), [](pii a, pii b) { return a.first > b.first; });
if (t == )
{
int x;
for (auto &it : v)
{
printf("%d\n", it.first);
fflush(stdout);
scanf("%d", &x);
vis[it.first] = ;
vis[x] = ;
}
for (int i = v.size() + , r = ; i <= n; ++i)
{
while (vis[p[r].second]) ++r;
printf("%d\n", p[r].second);
fflush(stdout);
scanf("%d", &x);
vis[p[r].second] = ;
vis[x] = ;
}
}
else
{
int x;
for (int i = , r1 = , r2 = ; i <= n; ++i)
{
scanf("%d", &x);
vis[x] = ;
if (mp.find(x) != mp.end() && vis[mp[x]] == )
{
printf("%d\n", mp[x]);
vis[mp[x]] = ;
}
else
{
while (r1 < v.size() && vis[v[r1].first]) ++r1;
if (r1 < v.size())
{
printf("%d\n", v[r1].first);
vis[v[r1].first] = ;
}
else
{
while (vis[p[r2].second]) ++r2;
printf("%d\n", p[r2].second);
vis[p[r2].second] = ;
}
}
fflush(stdout);
}
} }
return ;
}
D. Decorate Apple Tree
Solved.
题意:
有一棵树,每个叶子要有一个颜色。
一个点被定义为好点,是在它的子树中每个叶子的颜色都不同。
求好点个数为$k的时候 k \in [1, n] 所需要的最小的颜色个数$
思路:
先处理出每个点的子树中有多少个叶子,再按从小到大排序,依次输出即可。
#include <bits/stdc++.h>
using namespace std; #define N 100010
int n;
vector <int> G[N]; int sze[N];
void DFS(int u)
{
sze[u] = ;
for (auto v : G[u])
{
DFS(v);
sze[u] += sze[v];
}
if (!sze[u]) sze[u] = ;
} int main()
{
while (scanf("%d", &n) != EOF)
{
for (int i = ; i <= n; ++i) G[i].clear();
for (int u = , v; u <= n; ++u)
{
scanf("%d", &v);
G[v].push_back(u);
} DFS();
sort(sze + , sze + + n);
for (int i = ; i <= n; ++i) printf("%d%c", sze[i], " \n"[i == n]);
}
return ;
}
E. Check Transcription
Unsolved.
题意:
给出一个01串,以及一个字符串,求找出两个小串$A, B$
$使得01串为0的位置填A, 为1的位置填B,最后组成的串为给出的字符串$
求存在多少个$pairs(A, B)$
F. Write The Contest
Unsolved.
G. Take Metro
Unsolved.
H. Detect Robots
Unsolved.
Mail.Ru Cup 2018 Round 3 Solution的更多相关文章
- Mail.Ru Cup 2018 Round 2 Solution
A. Metro Solved. 题意: 有两条铁轨,都是单向的,一条是从左往右,一条是从右往左,Bob要从第一条轨道的第一个位置出发,Alice的位置处于第s个位置,有火车会行驶在铁轨上,一共有n个 ...
- Mail.Ru Cup 2018 Round 3 B. Divide Candies
题目链接 分析一下题意可以得到题目要求的是满足下面这个 公式的不同的i,ji,ji,j的方案数; 即(i2+j2)mod   m=0 (n ≤ ...
- Mail.Ru Cup 2018 Round 3
A:签到 #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> # ...
- Mail.Ru Cup 2018 Round 2
A:阅读理解. #include<iostream> #include<cstdio> #include<cmath> #include<cstdlib> ...
- [codeforces Mail.Ru Cup 2018 Round 3][B Divide Candies ][思维+数学]
https://codeforces.com/contest/1056/problem/B 题意:输入n,m 求((a*a)+(b*b))%m==0的(a,b)种数(1<=a,b<= ...
- [codeforces Mail.Ru Cup 2018 Round 1 D][ xor 操作]
http://codeforces.com/contest/1054/problem/D 题目大意:一个序列a1 a2...an,可以对若干个元素进行取反,使所得的新序列异或和为0的区间个数最多. 题 ...
- Mail.Ru Cup 2018 Round 1
A. Elevator or Stairs? 签. #include <bits/stdc++.h> using namespace std; ]; int main() { while ...
- Mail.Ru Cup 2018 Round 1 virtual participate记
因为睡过了只好vp. A:阅读理解. #include<iostream> #include<cstdio> #include<cmath> #include< ...
- Mail.Ru Cup 2018 Round 2C(__gcd)
#include<bits/stdc++.h>using namespace std;long long mx(long long l1,long long r1,long long l2 ...
随机推荐
- 测试用例和BUG描述规范
欢迎关注我的公众号,了解更多的测试知识:[软件测试经验与教训] 一一BUG描述基础知识 Bug标题中需包含Bug的具体位置并以[]标注 举例:[模块-子模块-页面]XXXXXXXXXXXX Bug标题 ...
- linux 统计命令执行后的行数或者统计目录下文件数目
ls |wc 是统计你这个目录下的文件数目.ls |wc -l是输出第一个结果即31即文件的数目.
- /etc/redhat-release
该文件用于记录 RedHat 的发行版本信息 [root@localhost ~]$ cat /etc/redhat-release CentOS release 6.5 (Final)
- Swift-属性、方法、下标
存储属性和计算属性 类.结构和枚举都能够定义存储属性和计算属性.其中存储属性就是常见的形式,又分为变量属性和常量属性,如: struct Point { var x = 0.0, y = 0.0 } ...
- poj_2286 线段树
题目大意 在墙上贴海报,墙壁是由一排连续的瓷砖铺成,海报贴在墙壁上必须占据连续的几块瓷砖,海报可以互相覆盖,问最后可以看见几张海报(未被完全覆盖). 题目分析 墙壁是由连续的一个区间构成,每个海报占据 ...
- MUI 图片上传剪切预览,可选(拍照+系统相册)
整合网上的例子..麻蛋.没跑通..没办法.自己就拿他们的例子完善了一下..已经可以使用了! 准备工作: 这几个文件要引入.特别是JS 文件!!! <link href="../css/ ...
- 在MacOS上搭建Vulhub漏洞平台环境
一.安装python3和docker brew install python3 brew cask install docker sudo pip3 install docker-compose 二. ...
- 【Android】Android 发送短信和打电话的方法
发送短信的方法 有两种方法可以实现发送短信,其一是使用intent-startActivity,URI数据格式为"smsto:num",调用的action为Intent.ACTIO ...
- Inflater与findViewById()区别
/** * Inflater英文意思是膨胀,在Android中应该是扩展的意思吧. LayoutInflater的作用类似于 * findViewById(),不同点是LayoutInflater是用 ...
- Floyd算法并输出路径
hdu1224 Free DIY Tour Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Ot ...