Codeforces Round #628 (Div. 2)
1325A - EhAb AnD gCd
- 题意:随意找两个数是他们的最大公约数 GCD 与最小公倍数 LCM 之和为所给定的值。
- 思路:找一下规律 ,假设所给的 数位n, 那么我们将n分成 1 ,n-1,这两个数,总是附和我们的答案
- 收获:认真观察所给的条件,自己先构造一下,找找规律
1325B - CopyCopyCopyCopyCopy
- 题意 :给一个有n个元素的数组,将数组中的元素复制 n 次,将n复制结果拼接起来,形成以新的数组,让求严格递增子序列有多少个
- 思路:对给的数组排序去重复,剩下的元素个数即是答案。
1325C - Ehab and Path-etic MEXs
- 题意:给一个n个节点的数,其中数的边权范围[0, n-1], 问我们怎么填 这个数的 n-1的边权,
可以任意两个节点之间的 MEX 最小
(MEX指的是两个节点 所组成的路径上边权没有出现过的最小数) - 思路:对于这个n个节点的数,无论我我们怎么填写 0、1 这两个数,在0和1这件总会以一条路径,这个时候 MEX = 2 或者 MEN > 2 , 我们要想让任意两点之间最小,那么在填写2的时候就不能让 2与 0、1 在同一条路径上,怎么填写
0,1,2
,这三个数才不会出现上述的糟糕情况,思路有两条: - 找到一个有3个度数以上的节点,并把这三个填到这个节点的三条边上,这样就一定保证不会出现最 三个数在同一条路径上了。
- 找到3个度数为1的节点,分别填上0,1,2,就行了,其他点任意填
- 注意如果没有 3个度数的节点\ 没有3个度数为的节点,那么这个数其实就是一个 “长链”。
- 法一:代码:
#include <bits/stdc++.h>
using namespace std;
vector<int> v[100005];
int ans[100005];
int main()
{
int n;
scanf("%d",&n);
for (int i=1;i<n;i++)
{
int a,b;
scanf("%d%d",&a,&b);
v[a].push_back(i);
v[b].push_back(i);
ans[i]=-1;
}
pair<int,int> mx(0,0);
for (int i=1;i<=n;i++)
mx=max(mx,make_pair((int)v[i].size(),i));
int cur=0;
for (int i:v[mx.second])
ans[i]=cur++;
for (int i=1;i<n;i++)
{
if (ans[i]==-1)
ans[i]=cur++;
printf("%d\n",ans[i]);
}
}
- 法二:代码:
#include<iostream>
#include<algorithm>
#include<map>
#include<cstdio>
#define REP(i,first,last) for(int i=first;i<=last;++i)
#define DOW(i,first,last) for(int i=first;i>=last;--i)
using namespace std;
const int MAXN=114514;
int N,M;
int T;
int out[MAXN];//记录度
int p[MAXN];//比较懒,不想存图,所以就只记录一下每个点最后一条出边,反正最后有影响的之后度为1的点,所以没关系
int answer[MAXN];//记录答案
void work()
{
scanf("%d",&N);
int f,t;
REP(i,1,N-1)
{
scanf("%d%d",&f,&t);
out[f]++;
out[t]++;
p[f]=p[t]=i;
}
if(N==2)//注意特判2
{
printf("%d",0);
return;
}
int cnt=0;
REP(i,1,N)
{
if(out[i]==1)//在前三个度为1的点的出边赋值上0,1,2,为了方便处理这里就用了1,2,3
{
answer[p[i]]=++cnt;
if(cnt==3)
{
break;
}
}
}
REP(i,1,N-1)//输出
{
if(answer[i])//如果有答案就输出答案
{
printf("%d\n",answer[i]-1);
}
else//没有反正可以乱输出
{
++cnt;
printf("%d\n",cnt-1);
}
}
}
int main()
{
work();
return 0;
}
1325D - Ehab the Xorcist
题意:给你两个 u,v 把 v任意拆成一个数组
1.使数组元素相互 异或操作之后的结果值为 u
2. 这些元素值之和为v
3. 拆成的这个数组的元素个数尽量少思路:首先我们可根据题目进行特判,如果 u = 0 && v = 0 的直接输出0,u == v的时候答案为 u,u > v 的时候无如何都没法得出答案输出-1.
- 接下来就是根据异或操作的性质来分析了:我们可以把 v 拆分成三个数:
u ^x ^x
= u, 那么要想这样拆分,x = (v-u)/ 2, 那么就要让 (u-v)被2整除,所以如果 u、v不是同奇偶的话是没发这样拆分出来的,直接输入-1,否怎的话是可以拆分的,那么就有了答案u x x
,但是根据样例发现,还有两个数的答案,我们仔细看发现 这两个数的其中一个数为 u+x,另一个为x,为什么能这样呢?,我觉的这里其实要用一点二进制的思想来考虑(还要注意异或操作本来就是对 二进制位进行的操作),我考样例中一组样例 u = 2, v = 4,如果按我们上面的分析的话,我们发现答案为 2,1,1, 但实际上为 3,1,,,这个时候我么考虑 2 的二进制位为:0010
,1的二进制位为:0001
,3的二进制为:0011
,那么3异或1,其实就是异或掉了我们加上的 1 ,而要想满足能异或掉这个相加的值,那么要求这两个相加的数的各个二进制位(如:2 、1),不能同时都是1。
- 接下来就是根据异或操作的性质来分析了:我们可以把 v 拆分成三个数:
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<cstdio>
using namespace std;
#define ll long long
int main()
{
//freopen("A.txt","r",stdin);
ll u,v;
scanf("%lld %lld", &u, &v);
if(u%2 != v%2 || u > v) printf("-1\n");
else if(u == v)
{
if(!u) printf("0\n");
else printf("1\n%lld\n", v);
}
else
{
ll x = (v - u)/2;
if(u&x) printf("3\n%lld %lld %lld\n", u, x, x);
else printf("2\n%lld %lld\n", u^x, x);
}
return 0;
}
Codeforces Round #628 (Div. 2)的更多相关文章
- Codeforces Round #628 (Div. 2) 题解
人闲桂花落,夜静春山空. 月出惊山鸟,时鸣春涧中.--王维 A. EhAb AnD gCd You are given a positive integer x. Find any such 2 po ...
- Codeforces Round #628 (Div. 2) D. Ehab the Xorcist(异或,思维题)
题意: 寻找异或后值为 u,相加后和为 v 的最短数组. 思路: 异或得 u ,则 v 至少应大于等于 u ,且多出来的部分可以等分为两份相消. 即初始数组为 u , (v-u)/2 , (v-u)/ ...
- Codeforces Round #628 (Div. 2) C. Ehab and Path-etic MEXs(树,思维题)
题意: 给有 n 个点的树的 n-1 条边从 0 到 n-2 编号,使得任意两点路径中未出现的最小数最小的方案. 思路: 先给所有度为 1 的点所在边编号,之后其他点可以随意编排. #include ...
- Codeforces Round #628 (Div. 2) B. CopyCopyCopyCopyCopy(Set)
题意: 给你一个数组,可以像题目那样无限拼接,问递增子序列的最大长度(可不连续). 思路: 序列的最大长度即为数组中不同元素的个数. Tips: 一开始不知道back-to-back什么意思,看到题目 ...
- Codeforces Round #628 (Div. 2) A. EhAb AnD gCd(LCM & GCD)
题意: GCD(a,b) + LCM(a,b) = n,已知 n ,求 a,b. 思路: 设 gcd(a, b) = k, a = xk, b = yk , k + ab / k = n xy = n ...
- Codeforces Round #366 (Div. 2) ABC
Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...
- Codeforces Round #354 (Div. 2) ABCD
Codeforces Round #354 (Div. 2) Problems # Name A Nicholas and Permutation standard input/out ...
- Codeforces Round #368 (Div. 2)
直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...
- cf之路,1,Codeforces Round #345 (Div. 2)
cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅..... ...
随机推荐
- AspNetCore3.1源码解析_2_Hsts中间件
title: "AspNetCore3.1源码解析_2_Hsts中间件" date: 2020-03-16T12:40:46+08:00 draft: false --- 概述 在 ...
- Flutter 日期时间DatePicker控件及国际化
注意:无特殊说明,Flutter版本及Dart版本如下: Flutter版本: 1.12.13+hotfix.5 Dart版本: 2.7.0 DatePicker Flutter并没有DatePick ...
- HTML实体符号代码
1. 特色的 © © © 版权标志 | | 竖线,常用作菜单或导航中的分隔符 · · · 圆点,有时被用来作为菜单分隔符 ↑ ↑ ↑ 上箭头,常用作网页“返回页面顶部”标识 € € € 欧元标识 ...
- ubutu 12.04
1.[系统设置]->[外观]->[行为]->[自动隐藏启动器],隐藏左侧边栏后,可以按快捷键[CTRL+a]弹出侧边栏. 2.QtCreator调试,提示[ptrace不允许的操作] ...
- YAML中多行字符串的配置方法
有时候我们会在配置文件中配置一段文字说明,这种时候通常会出现两种需求: 文字中可能出现段落,希望在配置中按段落方式编写,显示打印的时候也能出现段落换行. 文字很长,为方便编辑,可能在配置文件中分段写, ...
- Java抽象类和接口的区别及联系
抽象类 注:先将抽象类中的两种方法解释完,再综合解释抽象类 抽象方法 应用场景:其下所有子类都应该有该方法但是大部分子类具体的执行步骤是有所不同的. 必须重写:也可以说"必须实现" ...
- SpringMVC框架——常用注解
@RequestMapping Spring MVC 通过 @RequestMapping 注解将请求与业务方法进行映射,在方法定义处,在类定义都可以添加该注解. 常用参数: 1.value:指定请求 ...
- IDEA报错:Could not find resource com/liwen/bean/userMapper.xml
主要原因设idea无法识别src路径下的xml文件,要把xml文件建立在resources文件下
- 曹工说Spring Boot源码(27)-- Spring的component-scan,光是include-filter属性的各种配置方式,就够玩半天了.md
写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...
- 强化学习之一:从TensorFlow开始(Start from TensorFlow)
本文是对Tensorflow官方教程的个人(tomqianmaple@outlook.com)中文翻译,供大家学习参考. 官方教程链接 tf的扬帆起航Getting Started With Tens ...