Codeforces Round #417 (Div. 2)——ABCE
题面有点长需耐心读题。
A.一个人行道上的人被撞有4种情况
1.所在车道有车驶出
2.右边车道有左转车
3.左边车道有右转车
4.对面车道有直行车
#include <bits/stdc++.h>
#define rep(i, j, k) for(int i = j;i <= k;i ++)
#define rev(i, j, k) for(int i = j;i >= k;i --)
using namespace std;
typedef long long ll;
int a[][];
int main() {
ios::sync_with_stdio(false);
rep(i, , ) rep(j, , ) cin >> a[i][j];
rep(i, , ) {
if(a[i][]) {
rep(j, , )
if(a[i][j]) {
puts("YES");
return ;
}
if(a[(i + ) % ][] | a[(i + ) % ][] | a[(i + ) % ][]) {
puts("YES");
return ;
}
}
}
puts("NO");
return ;
}
B.从下往上,每层楼有两种选择——
左边结束 or 右边结束
所以有 2^n 种决策
坑点( Pretest 里有):如果第 k + 1 层到第 n 层楼都已关灯
那么到第 k 层楼结束就好了
#include <bits/stdc++.h>
#define rep(i, j, k) for(int i = j;i <= k;i ++)
#define rev(i, j, k) for(int i = j;i >= k;i --)
using namespace std;
typedef long long ll;
int n, m, ans = ;
char s[][];
void dfs(int k, int d, int c) {
if(k >= n) {
if(d) {
int t = m;
rev(i, m - , )
if(s[k][i] == '') t = i;
ans = min(ans, c + m - t);
}
else {
int t = ;
rep(i, , m)
if(s[k][i] == '') t = i;
ans = min(ans, c + t - );
}
}
else {
if(d) {
int t = m;
rev(i, m - , )
if(s[k][i] == '') t = i;
dfs(k + , , c + * (m - t) + );
dfs(k + , , c + m);
}
else {
int t = ;
rep(i, , m)
if(s[k][i] == '') t = i;
dfs(k + , , c + * (t - ) + );
dfs(k + , , c + m);
}
}
}
int main() {
ios::sync_with_stdio(false);
cin >> n >> m, m += ;
rep(i, , n) cin >> (s[n + - i] + );
rev(i, n, ) {
int flag = ;
rep(j, , m) {
if(s[i][j] == '') {
flag = ;
break;
}
}
if(flag) n --;
else break;
}
if(!n) cout << "";
else dfs(, , ), cout << ans;
return ;
}
C.显然 T 随 k 单调递增
所以直接二分 k 就好了 (蠢了多写了个cmp
O(nlog^2n) cf 的评测机还是很稳的
#include <bits/stdc++.h>
#define rep(i, j, k) for(int i = j;i <= k;i ++)
#define rev(i, j, k) for(int i = j;i >= k;i --)
using namespace std;
typedef long long ll;
int n, m, ans = ;
char s[][];
void dfs(int k, int d, int c) {
if(k >= n) {
if(d) {
int t = m;
rev(i, m - , )
if(s[k][i] == '') t = i;
ans = min(ans, c + m - t);
}
else {
int t = ;
rep(i, , m)
if(s[k][i] == '') t = i;
ans = min(ans, c + t - );
}
}
else {
if(d) {
int t = m;
rev(i, m - , )
if(s[k][i] == '') t = i;
dfs(k + , , c + * (m - t) + );
dfs(k + , , c + m);
}
else {
int t = ;
rep(i, , m)
if(s[k][i] == '') t = i;
dfs(k + , , c + * (t - ) + );
dfs(k + , , c + m);
}
}
}
int main() {
ios::sync_with_stdio(false);
cin >> n >> m, m += ;
rep(i, , n) cin >> (s[n + - i] + );
rev(i, n, ) {
int flag = ;
rep(j, , m) {
if(s[i][j] == '') {
flag = ;
break;
}
}
if(flag) n --;
else break;
}
if(!n) cout << "";
else dfs(, , ), cout << ans;
return ;
}
E.(题解说的比较清楚了其实,学习了已一发题解)
我们很熟悉最基础的求异或和的Nim游戏
现在我们添加一条规则,对于当前将要操作的玩家
他任选一堆除了拿走正数数量的石子外
他还可以在这堆上添加正数数量的石子
对于这个变种游戏,可以考虑它可以直接转化为最基础的Nim游戏
因为原来的胜者在对方选择添加石子的操作后
他可以再把对方添加的石子拿走...
各操作一轮下来相当于啥也没干...
把这些啥也没干的过程去掉就是原始的Nim游戏
我们考虑这个E题
把所有叶子节点染成蓝色
蓝点的父亲染红,红点的父亲染蓝
(为防止矛盾所以保证了所有叶节点与树根距离同奇偶)
我们可以发现,蓝点就是我们的Nim游戏
而红点可以传递苹果给蓝点
就是我们上面新加的不影响结果的规则
(也可以考虑为,红点的苹果传递到叶子节点需要奇数次传递
然后再被后手玩家一次吃光,总共经历了偶数步,不影响结果
而对于蓝色的叶子节点,就只有被拿走的选择
蓝色的非叶子节点,传递给下面的红点等价于被拿走,因为那不再影响结果
所以这已经是Nim游戏,每个蓝色节点即为一堆)
这样我们计算蓝点的异或和 sum
sum = 0,初始局面后手稳赢
那他就随便蓝蓝互换,红红互换
红蓝互换当且仅当两个节点苹果数相同
sum != 0,需交换蓝 u 和红 v
当且仅当 sum ^ apple[u] ^ apple[v] = 0
#include <bits/stdc++.h>
#define rep(i, j, k) for(int i = j;i < (k + 1);i ++)
using namespace std;
long long ans, c0, c1;
int n, md, ret, d[], a[], f[], c[];
vector <int> e[];
void dfs(int u, int dep) {
d[u] = dep, md = max(md, dep);
rep(i, , e[u].size() - )
dfs(e[u][i], dep + );
}
int main() {
ios::sync_with_stdio(false);
cin >> n;
rep(i, , n) cin >> a[i];
rep(i, , n) cin >> f[i], e[f[i]].push_back(i);
dfs(, );
rep(i, , n) {
if((md - d[i]) & ) c1 ++;
else c0 ++, c[a[i]] ++, ret ^= a[i];
}
if(ret) {
rep(i, , n)
if(((md - d[i]) & ) && (ret ^ a[i]) <= )
ans += c[ret ^ a[i]];
}
else {
ans = c0 * (c0 - ) + c1 * (c1 - ), ans >>= ;
rep(i, , n)
if((md - d[i]) & )
ans += c[a[i]];
}
cout << ans;
return ;
}
Codeforces Round #417 (Div. 2)——ABCE的更多相关文章
- Codeforces Round #417 (Div. 2) D. Sagheer and Kindergarten(树中判祖先)
http://codeforces.com/contest/812/problem/D 题意: 现在有n个孩子,m个玩具,每次输入x y,表示x孩子想要y玩具,如果y玩具没人玩,那么x就可以去玩,如果 ...
- Codeforces Round #417 (Div. 2) B. Sagheer, the Hausmeister
http://codeforces.com/contest/812/problem/B 题意: 有n层楼,每层楼有m个房间,1表示灯开着,0表示灯关了.最两侧的是楼梯. 现在每从一个房间移动到另一个房 ...
- Codeforces Round #417 (Div. 2) B. Sagheer, the Hausmeister —— DP
题目链接:http://codeforces.com/problemset/problem/812/B B. Sagheer, the Hausmeister time limit per test ...
- [Codeforces Round#417 Div.2]
来自FallDream的博客,未经允许,请勿转载,谢谢. 有毒的一场div2 找了个1300的小号,结果B题题目看错没交 D题题目剧毒 E题差了10秒钟没交上去. 233 ------- A.Sag ...
- Codeforces Round #417 (Div. 2)-A. Sagheer and Crossroad
[题意概述] 在一个十字路口 ,给定红绿灯的情况, 按逆时针方向一次给出各个路口的左转,直行,右转,以及行人车道,判断汽车是否有可能撞到行人 [题目分析] 需要在逻辑上清晰,只需要把所有情况列出来即可 ...
- Codeforces Round #417 (Div. 2) C. Sagheer and Nubian Market
time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...
- Codeforces Round #417 (Div. 2)A B C E 模拟 枚举 二分 阶梯博弈
A. Sagheer and Crossroads time limit per test 1 second memory limit per test 256 megabytes input sta ...
- 【二分】Codeforces Round #417 (Div. 2) C. Sagheer and Nubian Market
傻逼二分 #include<cstdio> #include<algorithm> using namespace std; typedef long long ll; ll ...
- 【动态规划】Codeforces Round #417 (Div. 2) B. Sagheer, the Hausmeister
预处理每一层最左侧的1的位置,以及最右侧的1的位置. f(i,0)表示第i层,从左侧上来的最小值.f(i,1)表示从右侧上来. 转移方程请看代码. #include<cstdio> #in ...
随机推荐
- YTU 2715: 函数---判断某年某月某日是这一年中的第几天
2715: 函数---判断某年某月某日是这一年中的第几天 时间限制: 1 Sec 内存限制: 128 MB 提交: 380 解决: 155 题目描述 在主程序(main)中输入某年某月某日,例如2 ...
- 第四周 Leetcode 124. Binary Tree Maximum Path Sum (HARD)
124. Binary Tree Maximum Path Sum 题意:给定一个二叉树,每个节点有一个权值,寻找任意一个路径,使得权值和最大,只需返回权值和. 思路:对于每一个节点 首先考虑以这个节 ...
- 洛谷 P1498 南蛮图腾 —— 模拟
题目:https://www.luogu.org/problemnew/show/P1498 大约一年前该做的题...现在来填一下坑: 然而不怎么会模拟!还滚去看TJ了: 就是翻倍复制: \ 这个符号 ...
- openstack instance resize to
Icehouse resize No valid host was found Hi all!! We're currently experimenting an error that's it's ...
- ngRoute (angular-route.js) 和 ui-router (angular-ui-router.js) 模块有什么不同呢?
ngRoute (angular-route.js) 和 ui-router (angular-ui-router.js) 模块有什么不同呢? 很多文章中都有说道:当时ngRoute在路由配置时用$r ...
- Python3基础复习
目录 基本语法 运算符 输出格式 数据类型 数据结构 函数 面向对象 补充 异常 模块和包 文件 时间 线程和进程 基本语法 基本语法只列举与Java不一样的. 运算符 and, or而非 & ...
- [Swift通天遁地]八、媒体与动画-(6)使用开源类库快速实现滑入动画
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- git配置用户信息
git配置用户信息 一.在本地配置用户信息 配置内容:user.name 和 user.email 配置目的:Git用来记录谁做了什么事 配置方法:windows下打开Git Bash进行操作 gi ...
- flask 中的模板语法 jinja2及render_template的深度用法
是时候开始写个前端了,Flask中默认的模板语言是Jinja2 现在我们来一步一步的学习一下 Jinja2 捎带手把 render_template 中留下的疑问解决一下 首先我们要在后端定义几个字符 ...
- mongodb分片集群安装教程
mongodb 集群包含副本集群,主从集群以及分片集群,分片集群比较复杂,这里测试我采用了三台机器,交差部署 blog地址:http://www.cnblogs.com/caoguo 一 .环境:#m ...