Codeforces Round #615 (Div. 3) 题解
题意:
给你四个数a,b,c,d,n.问你是否能将n拆成三个数A,B,C,使得A+a=B+b=C+c。
思路:
先计算三个数的差值的绝对值abs,如果abs大于n则肯定不行,如果小于n,还需判断(n-abs)%3是否为0,不为0则不行。
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
ll max(ll a,ll b) {if(a>b) return a;return b;}
int main()
{
int t;
scanf("%d",&t);
while(t--){
int a[],n;
scanf("%d%d%d%d",&a[],&a[],&a[],&n);
sort(a,a+);
int x=(a[]-a[])*+a[]-a[];
if(x>n) cout<<"NO"<<endl;
else{
if((n-x)%) cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}
}
return ;
}
B - Collecting Packages
题意:
给出直角坐标系中的一些坐标,你只能向上('U')或向右('R')走,问你能否走完这些坐标,如果能请输出字典序最小的行进路线
思路:
直接按x坐标排序,如果有一个点的纵坐标在上一个点的纵坐标下方,则无法走。输出顺序只需要从上一个点先走R再走U走到下一个点即可
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<vector>
#include<stack>
#include<queue>
#include<map>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
ll max(ll a,ll b) {if(a>b) return a;return b;}
const int maxn=;
struct node{
int x,y;
}a[maxn];
int cmp(node a,node b)
{
if(a.x==b.x) return a.y<b.y;
return a.x<b.x;
}
int main()
{
int t,n;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=;i<n;i++) scanf("%d%d",&a[i].x,&a[i].y);
sort(a,a+n,cmp);
int flag=;
for(int i=;i<n;i++){
if(a[i].y<a[i-].y){
cout<<"NO"<<endl;
flag=;
break;
}
}
if(!flag){
cout<<"YES"<<endl;
for(int i=;i<a[].x;i++) cout<<"R";
for(int i=;i<a[].y;i++) cout<<"U";
for(int i=;i<n;i++){
for(int j=a[i-].x;j<a[i].x;j++) cout<<"R";
for(int j=a[i-].y;j<a[i].y;j++) cout<<"U";
}
cout<<endl;
}
}
return ;
}
C - Product of Three Numbers
题意:
给你一个数n,问你是否能将n分解成三个不同的数相乘,可以的话则输出任一解
思路:
只需要将遍历从2到,如果i为n的因子,就将i记录,并将n除以i。这样的操作执行三次之后,就可以跳出循环。
如果此时的x不等于1或者循环结束后x不为1,则将x放入数组的尾部,或者将数组的最后一个元素乘上x。
如果最后数组的元素小于3那么则不行,如果等于3的话还需判断一下,三个因数是否相同。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
vector<int> a;
typedef long long ll;
int main()
{
int n,t;
scanf("%d",&t);
while(t--){
int cnt=;
a.clear();
scanf("%d",&n);
for(ll i=;i*i<=n;i++){
if(n%i==){
a.push_back(i);
cnt++;
n/=i;
}
if(cnt==) break;
}
if(n!=){
if(a.size()==) a.back()*=n;
else a.push_back(n);
}
if(a.size()<) cout<<"NO"<<endl;
else{
if(a[]==a[]||a[]==a[]||a[]==a[]) cout<<"NO"<<endl;
else cout<<"YES"<<endl,cout<<a[]<<" "<<a[]<<" "<<a[]<<endl;
}
}
return ;
}
D - MEX maximizing
题意:
首先定义MEX为不属于数组的最小正整数,对于数组[0,0,1,0,2],MEX为3,。对于数组[1,2,3,4]MEX为0.现在给你一个空数组,每次将一个数插入到数组中,插入后可以对数组中的任意数进行任意次+x与-x操作,求每次插入操作后的MEX。
思路:
先将题意转化:就是求每次插入操作与若干次修改操作后,能覆盖[0...k]的最长长度。
我们定义a[i] 表示此次询问时,若干个区间一共有a[i] 个 i 可以填到若干个区间中的 i 位置上(为了满足题目要求,我们从第一个区间的第i个位置开始填,然后再填第二个区间第i个位置)
然后我们从第一个区间开始检查。若到当前位置时a[i] != 0,则我们让a[i] --(表示我们拿一个i填在这个位置上),同时往下一个位置跳,直到遇到一个没有数可填的位置——a[pos] = 0
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=4e5+;
int a[maxn];
int main()
{
int n,x,tem,t=;
scanf("%d%d",&n,&x);
while(n--){
int tem;
scanf("%d",&tem);
a[tem%x]++;
while(a[t%x]){
a[t%x]--;
t++;
}
cout<<t<<endl;
}
return ;
}
E. - Obtain a Permutation
题意:
一个无序的n*m的矩阵,有两种操作①讲某一个位置的数改成任意数②将一整列元素上移一格(最上方元素到最下方),问需要最少多少次操作才能使任意a[i][j]元素变成(n-1)*i+j。
思路:
由于每次操作都只会使一列元素发生变化,所以我们只需要分别计算出每列元素回到正常位置需要的操作数累加即可。
我们首先假设cnt[i]为某列以第i行作为起点,所有元素回到正确位置需要的操作数,并将其初始化为最坏情况i+n。
之后只需要将该列元素遍历,判断a[i][j]元素是否在以某个元素为起点的正确位置上,之后将cnt[x]--,然后遍历得到该列的最小值即可,再将每一列累加即为答案.
#include<iostream>
#include<algorithm>
#include<cstring>
#define inf 0x3f3f3f3f
#include<vector>
using namespace std;
typedef long long ll;
const int maxn1=2e4+;
const int maxn=2e5+;
int cnt[maxn],ans=;
vector<int> a[maxn];
int main()
{
int n,m,x;
scanf("%d%d",&n,&m);
for(int i=;i<n;i++)
for(int j=;j<m;j++)
scanf("%d",&x),a[i].push_back(--x);
for(int i=;i<m;i++){
for(int j=;j<n;j++) cnt[j]=n+j;
for(int j=;j<n;j++){
if(a[j][i]%m==i&&a[j][i]/m<n){
int tmp=a[j][i]/m;
cnt[((j+n-tmp)%n)]--;
}
}
int num=inf;
for(int j=;j<n;j++) num=min(num,cnt[j]);
ans+=num;
}
cout<<ans<<endl;
}
F - Three Paths on a Tree
题意:
给一棵树,找到三个顶点,使三个顶点两两之间路径的并集最大
思路:
必定会有一组最优解,使得 a,b是树直径上的端点。
证明:
假设某个答案取连接点x。x最远的树到达的点是s,根据树的直径算法,s是树的某个直径a的端点。假设x的最远和第二远的点组成的链是b,b就会和a有一段公共部分。我们取a和b相交部分距离s最远的那个点y。那么取这个链上点y的答案一定比x更优
用两次BFS可以求出直径的两个端点,在这个过程中还能顺便求出一个端点到树上每一点的距离。之后再用一次BFS求得另一个端点到树上每一点的距离。
再枚举第三个顶点c就可以求出这三个顶点了
最终距离为:[dis(a,b)+dis(b,c)+dis(a,c)]/2
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
const int maxn=2e5+;
vector<int> a[maxn];
int n,vis[maxn],dis1[maxn],dis2[maxn],dis[maxn],pos;
void bfs(int x)
{
memset(vis,,sizeof(vis));
memset(dis,,sizeof(dis));
pos=x;
vis[x]=,dis[x]=;
queue<int> q;
q.push(x);
while(!q.empty()){
int u=q.front();q.pop();
for(int i=;i<a[u].size();i++){
if(!vis[a[u][i]]){
vis[a[u][i]]=;
dis[a[u][i]]=dis[u]+;
q.push(a[u][i]);
if(dis[a[u][i]]>dis[pos]) pos=a[u][i];
}
}
}
}
int main()
{
scanf("%d",&n);
int u,v;
for(int i=;i<n;i++){
scanf("%d%d",&u,&v);
a[u].push_back(v);
a[v].push_back(u);
}
int a,b,c;
bfs(),a=pos;
bfs(pos),b=pos;
for(int i=;i<=n;i++) dis1[i]=dis[i];
bfs(pos);
for(int i=;i<=n;i++) dis2[i]=dis[i];
c=;
for(int i=;i<=n;i++)
if(dis1[i]+dis2[i]>dis1[c]+dis2[c]&&i!=a&&i!=b) c=i;
int ans=(dis1[b]+dis1[c]+dis2[c])/;
cout<<ans<<endl<<a<<" "<<b<<" "<<c;
return ;
}
Codeforces Round #615 (Div. 3) 题解的更多相关文章
- Codeforces Round #182 (Div. 1)题解【ABCD】
Codeforces Round #182 (Div. 1)题解 A题:Yaroslav and Sequence1 题意: 给你\(2*n+1\)个元素,你每次可以进行无数种操作,每次操作必须选择其 ...
- Codeforces Round #608 (Div. 2) 题解
目录 Codeforces Round #608 (Div. 2) 题解 前言 A. Suits 题意 做法 程序 B. Blocks 题意 做法 程序 C. Shawarma Tent 题意 做法 ...
- Codeforces Round #525 (Div. 2)题解
Codeforces Round #525 (Div. 2)题解 题解 CF1088A [Ehab and another construction problem] 依据题意枚举即可 # inclu ...
- Codeforces Round #528 (Div. 2)题解
Codeforces Round #528 (Div. 2)题解 A. Right-Left Cipher 很明显这道题按题意逆序解码即可 Code: # include <bits/stdc+ ...
- Codeforces Round #466 (Div. 2) 题解940A 940B 940C 940D 940E 940F
Codeforces Round #466 (Div. 2) 题解 A.Points on the line 题目大意: 给你一个数列,定义数列的权值为最大值减去最小值,问最少删除几个数,使得数列的权 ...
- Codeforces Round #677 (Div. 3) 题解
Codeforces Round #677 (Div. 3) 题解 A. Boring Apartments 题目 题解 简单签到题,直接数,小于这个数的\(+10\). 代码 #include &l ...
- Codeforces Round #665 (Div. 2) 题解
Codeforces Round #665 (Div. 2) 题解 写得有点晚了,估计都官方题解看完切掉了,没人看我的了qaq. 目录 Codeforces Round #665 (Div. 2) 题 ...
- Codeforces Round #160 (Div. 1) 题解【ABCD】
Codeforces Round #160 (Div. 1) A - Maxim and Discounts 题意 给你n个折扣,m个物品,每个折扣都可以使用无限次,每次你使用第i个折扣的时候,你必须 ...
- Codeforces Round #383 (Div. 2) 题解【ABCDE】
Codeforces Round #383 (Div. 2) A. Arpa's hard exam and Mehrdad's naive cheat 题意 求1378^n mod 10 题解 直接 ...
随机推荐
- linux 在 1 MB 之下的 ISA 内存
一个最著名的 I/O 内存区是在个人计算机上的 ISA 范围. 这是在 640 KB(0xA0000)和 1 MB(0x100000)之间的内存范围. 因此, 它正好出现于常规内存 RAM 中间. 这 ...
- Linux 标准 C 类型的使用
尽管大部分程序员习惯自由使用标准类型, 如 int 和 long, 编写设备驱动需要一些小心 来避免类型冲突和模糊的 bug. 这个问题是你不能使用标准类型, 当你需要"一个 2-字节 填充 ...
- Vue组件中的父子传值
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- vue-learning:12-1- HTML5的<template>内容模板元素
HTML5的<template>内容模板元素 HTML内容模板<template>元素将它其中的内容存储在页面文档中,以供后续使用,该内容的DOM结构在加载页面时会被解析器处理 ...
- 【49.23%】【hdu 1828】Picture
Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...
- 研发环境容器化实施过程(docker + docker-compose + jenkins)
目录 背景介绍 改造思路 容器构建 基础准备 中间件容器 外部依赖容器 业务应用容器 容器整合 自动构建容器 Maven相关 非Maven项目 总结 背景介绍 目前公司内部系统(代号GMS)研发团队, ...
- 0007 表单标签(form、select)
目标: 能写出最常用的注册类表单 能说出input表单常见属性 现实中的表单,类似我们去银行办理信用卡填写的单子. 如下图 作用: 表单目的是为了收集用户信息. 在我们网页中, 我们也需要跟用户进行交 ...
- Joomla 3.9.13 二次注入分析(CVE-2019-19846)
目录 前言 分析 更好的注入 利用 总结 补丁分析 前言 这一个需要管理员权限的二次SQL注入,利用起来比较鸡肋.这里仅分享一下挖洞时的思路,不包含具体的poc. 分析 漏洞触发点在component ...
- Kafka学习笔记(四)—— API使用
Kafka学习笔记(四)-- API使用 1.Producer API 1.1 消息发送流程 Kafka的Producer发送消息采用的是异步发送的方式.在消息发送的过程中,涉及到了两个线程--mai ...
- 微服务Dubbo和SpringCloud架构设计、优劣势比较
本文主要围绕微服务的技术选型.通讯协议.服务依赖模式.开始模式.运行模式等几方面来综合比较Dubbo和Spring Cloud 这2种开发框架.架构师可以根据公司的技术实力并结合项目的特点来选择某个合 ...