一起开心集训队第一周训练赛2021/3/14

在这里插入图片描述

文章目录

  • 比赛链接
    • A CodeForces 1481D AB Graph
      • 题意:
      • 题解:
      • 代码:
    • B CodeForces 1481E Sorting Books
      • 题意:
      • 题解:
      • 代码:
    • C CodeForces 1478D Nezzar and Board
      • 题意:
      • 题解:
      • 代码:
    • D CodeForces 1478C Nezzar and Symmetric Array
      • 题意:
      • 题解:
      • 代码:
    • E CodeForces 1478E Nezzar and Binary String
    • F CodeForces 1481C Fence Painting
      • 题意:
      • 题解:
      • 代码:
    • G CodeForces 1477E Nezzar and Tournaments
    • H CodeForces 1481F AB Tree
    • I CodeForces 1478B Nezzar and Lucky Number
      • 题意:
      • 题解:
      • 代码:
    • J CodeForces 1478F Nezzar and Nice Beatmap
    • K CodeForces 1477D Nezzar and Hidden Permutations
    • L CodeForces 1481B New Colony
      • 题意:
      • 题解:
      • 代码:

比赛链接

CF699 div2(没有A题),CF698div2(没有A题),CF698div1

A CodeForces 1481D AB Graph

题意:

一张完全图的每一条有向边上写着a或者b,问能否构造一条边数为m的不间断路线使该路线为回文串

题解:

构造题
对于边数为奇数的回文串,随便找两个点都是可以构造出来的(如果两点间的两条边相同,那么肯定是回文串,如果不相同,形如aba也可以构成回文串)
对于边数为偶数的回文串,如果是偶数,那么中间两个肯定是相同的,我们只要找到连着相同的两条边就可以。而这种情况在三元环之间肯定能形成这种情况(因为一共就两种边,所以肯定有相邻的边是一样的),所以当n >= 3时肯定可以构造出来
当n = 2 的情况,m为奇数讨论过(肯定行),m为偶数的话,两点之间的边必须相同才行(也就是双向边必须一样)

代码:

#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
const int N = 1e6 + 10;
const int M = 5e5 + 10;
const int INF = 0x3f3f3f3f;
const double eps = 1e-4;
const int MOD = 1e9+7;
typedef long long ll;
typedef pair<int, int> PII;
char mp[1005][1005];
int main() {int T; cin >> T;while (T--) {int n, m;cin >> n >> m;for (int i = 1; i <= n; i++) cin >> mp[i] + 1;if (m & 1) {cout << "YES" << endl;for (int i = 1; i <= m+1; i++) cout << i % 2 + 1 << " ";cout << endl;continue;}if (n == 2) {if (mp[1][2] == mp[2][1]) {cout << "YES" << endl;for (int i = 1; i <= m+1; i++) cout << i % 2 + 1 << " ";cout << endl;}else cout << "NO" << endl;} else {cout << "YES" << endl;int flag;if (mp[1][2] == mp[2][3]) flag = 1;else if (mp[3][1] == mp[1][2]) flag = 0;else flag = 2;for (int i = 0; i <= m; i++) cout << (flag + i + m) % 3 + 1 << " ";cout << endl;}}
}

B CodeForces 1481E Sorting Books

题意:

一排书架上有 n 本书排成一排,每本书上有一个颜色ai ,你可以每次将一本书移动到书架的最右端,如果书架上的书,颜色相同的书都排到了一块,我们就认为他是漂亮的,请问将这个书架通过上面的那一种操作排成漂亮的书架,最少需要几次操作?

题解:

代码:

C CodeForces 1478D Nezzar and Board

题意:

n个数组x1 ~ xn,每次可以选择其中两个数x和y,然后将2x-y的值加入到数组中,x和y依旧保留,问通过这系列操作是否能得到数字k

题解:

我们先讲个定理,裴蜀定理:

设a,b是不全为0的整数,则存在整数x,y,使得ax+by = gcd(a,b)

n个整数间的裴蜀定理:

设a1,a2,a3…an为n个整数,d是它们的最大公约数,那么存在整数x1…xn使得x1 * a1+x2 * a2+…xn * an=d

(证明略)
题目给的是2x-y,我们将其拆开x+(x-y),相当于x加上x与y的差值,其实就是本身加上本身与其他数的差值,我们可以处理出所有的差值,但是O(n2)肯定不行(数据范围是1e5),其实不用求出所有差值,因为我们求出a1和a2的差值,a2和a3的差值,也就相当于求出a3和a1的差值(a3-a2+a2-a1=a3-a1),也就是求出a[i]与a[i+1]的差值(O(n),共n-1个
然后我们开始思考裴蜀定理,我们现在有n-1个差值(我们设为a1…an-1),gcd是他们的最大公约数,那么存在整数x1,…xn-1,使得x1 * a1+x2 * a2+…xn-1 * an-1=gcd
我们要求的数是k,我们已经有了每个数a[i],我们需要的是改变值k-a[i],也就是只要n-1个差值能表示出k-a[i]即可,现在n-1个差值可以表达出gcd,那么k-a[i]只要是gcd的倍数就可以被表示,如果不是则不行

代码:

#include <bits/stdc++.h>
using namespace std;
//#define ACM_LOCAL
typedef long long ll;
typedef pair<int, int> PII;
const int N = 2e5 + 10;
const int M = 1e6 + 10;
const ll INF = 1e18;
const double eps = 1e-4;
ll d[N];void solve() {int T; cin >> T;while (T--) {ll n, k;cin >> n >> k;for (int i = 1; i <= n; i++) cin >> d[i];ll gcd_ = 0;for (int i = 2; i <= n; i++) gcd_ = __gcd(d[i]-d[i-1], gcd_);int f = 0;for (int i = 1; i <= n; i++) {if ((k - d[i]) % gcd_ == 0) f = 1;}if (f) cout << "YES" << endl;else cout << "NO" << endl;}
}int main() {solve();return 0;
}

D CodeForces 1478C Nezzar and Symmetric Array

题意:

在这里插入图片描述

给定一个长度为2n的序列d,问能否通过上述公式得到a序列,输出“YES”/“NO”, a序列中必须成对出现相反数,ai = - aj ,而且不能相同

题解:

这个讲的很详细
这个方法也可以
构造题,题目给了d和a的关系,a数组是成对出现的相反数,且均不相同
我们通过a的性质进行反推,推出数组d 应该有哪些性质
(这里直接将结论,具体推导过程在上面的链接中有写)
d数组满足:
条件一:d是 成对出现
条件二:d都为偶数
条件三:计算过程中的数都是正整数

原始数组a为±2、±7、±9
差值和d为 36 36 46 54 46 54
去重排序除以2(用really数组保存)18 23 27
27/3=9,所以原始数组中最大的数就是9
(23-9)/2=7,所以原始数组中还有一个正数7
(18-9-7)/1=2,所以原始数组中还有一个正数2

所以原始数组为±2、±7、±9,输出YES

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll really[100010]; // Really 记录真正需要处理的数(表格二左边的1/2)
int main()
{int N;cin >> N;while (N--){int n;scanf("%d", &n);bool buxing = 0; //不行的拼音map<ll, int> ma; //用map记录出现了几次(条件一)for (int i = 0; i < 2 * n; i++){ll t;scanf("%lld", &t);if (t % 2) //差值和是否为偶数(条件二)buxing = 1;ma[t]++;}int sum = 1;ll realOriSum = 0;  // 已经得出的原来的数,上文样例中便是 9  7  3if (buxing){puts("NO");}else{for (map<ll, int>::iterator it = ma.begin(); it != ma.end(); it++){if (it->second != 2) // 差值和是否都出现了两处(条件一)buxing = 1;really[sum++] = (it->first) / 2;}if (buxing){puts("NO");}else{for (sum--; sum > 0; sum--){ll all = really[sum] - realOriSum;  //减去原来的数if (all % sum)  //是否可以整除buxing = 1;ll thisReal = all / sum;//除以当前really数组内数的数量realOriSum += thisReal;//对已求出的数组a求和if (thisReal <= 0)//检验计算过程中的数是否都是正整数buxing = 1;}if (buxing){puts("NO");}elseputs("YES");}}}return 0;
}

E CodeForces 1478E Nezzar and Binary String

F CodeForces 1481C Fence Painting

题意:

有一个围栏,每一块上都有颜色,用A数组来表示,Bob觉得太单调了,他想涂成B数组的颜色。这时候有m个粉刷匠,每个粉刷匠能且只能粉刷一次围栏,问你通过这m个人的粉刷能否达到Bob的要求。如果可以输出YES,并把每个粉刷匠粉刷的下标输出,否则输出NO。

题解:

因为颜色会覆盖,所以如果让后来的工匠染了某块木板,前面的工匠选择这块木板染色便没有影响,所以我们先把需要进行染色的木板按颜色分类存下来,从后往前扫每位工匠,如果有需要染对应颜色则染,否则选择之后会有人染的木板,或者选择相应颜色的不需要染色的木板染上,颜色不会发生变化

代码:

#include<bits/stdc++.h>
#define MAXN 100005
using namespace std;
int t,n,m,a[MAXN],b[MAXN],c[MAXN];
queue<int> ve1[MAXN],ve2[MAXN];
int xx,ans[MAXN];
int main()
{scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);//a是原本,b是需求,m是改变 for(int i = 1;i <= n;++i){while(!ve1[i].empty())ve1[i].pop();while(!ve2[i].empty())ve2[i].pop();}xx = 0;for(int i = 1;i <= n;++i)scanf("%d",&a[i]);for(int i =1;i <= n;++i){scanf("%d",&b[i]);if(b[i] == a[i])ve1[a[i]].push(i);//已经涂好 elseve2[b[i]].push(i);//需要该颜色 }for(int i = 1;i <= m;++i)scanf("%d",&c[i]);int f = 1;for(int i = m;i >= 1;--i){//xx是可以被涂的地方 if(ve2[c[i]].empty()==0)//即需要该颜色 {int tmp = ve2[c[i]].front();//需要颜色的位置 ans[i] = tmp;xx = tmp;//因为这个地方最后会被改回颜色,所以之前可以涂 ve2[c[i]].pop();}else if(xx)//如果存在可以多涂的地方 {ans[i] = xx;}else if(ve1[c[i]].empty()==0)//涂在该地方没有影响(相当于在本来是1的地方涂1) {ans[i] = ve1[c[i]].front();xx = ans[i];}	else{f = 0;break;}}for(int i = 1;i <= n;++i){if(ve2[i].empty()==0)//如果存在地方改变不了颜色 {f = 0;break;}}if(f){printf("YES\n");for(int i = 1;i <= m;++i)printf("%d ",ans[i]);printf("\n");}elseprintf("NO\n");}return 0;
}

G CodeForces 1477E Nezzar and Tournaments

H CodeForces 1481F AB Tree

I CodeForces 1478B Nezzar and Lucky Number

题意:

我们定义一个数字x为最喜欢的数(0<x<9),只要是出现了x的数都是幸运树,另外如果一个数可以由多个幸运树相加得到,该数也为幸运数
现给q个数,判断是否为幸运数

题解:

我的思路是:如果x是最喜欢的数,给数w,先查看w的各位是否有x存在,然后将w减去x,得到z,然后再看z的各位是否存在x,然后再减想,依次循环,直到小于x位置或者确定为幸运数为止
我是这样想的,如果w的各位不存在x,那么w可能是由幸运数相加得到,每次减去最小幸运数x
至于证明,我也讲不明白,当时做的时候是举例子推出来的,下面看这个详细证明
详细证明

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=5e5+8;
int a[maxn];
int q,d;
bool f(int x)
{if(x<d)return 0;int ans=x;bool flag=0;while(ans){if(ans%10==d){flag=1;break;}ans/=10;}if(flag==1)return 1;if(f(x-d))return 1;return 0;
}
int main()
{int t;cin>>t;while(t--){cin>>q>>d;for(int i=1;i<=q;i++){int x;cin>>x;if(f(x))cout<<"YES"<<endl;else cout<<"NO"<<endl;}}return 0;}

J CodeForces 1478F Nezzar and Nice Beatmap

K CodeForces 1477D Nezzar and Hidden Permutations

L CodeForces 1481B New Colony

题意:

从山顶有石头滚下来,有n个山,山的高度分别是hi
如果hi >= hi+1 ,石头就会滚到下一个山
如果hi < hi+1,石头会停止滚动(停在hi),hi的高度会加一
问第k次滚石会停到什么位置,会不会滚出所有山?

题解:

本题按照题意直接暴力即可
循环k次,记录每次石头滚到的位置,如果石头没有停下来(说明所有的i都满足a[i]>=a[i+1]),说明石头滚出所有山,此时输出-1

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=5e5+8;
int a[maxn];
int main()
{int t;cin>>t;while(t--){int n,k;cin>>n>>k;memset(a,0,sizeof(a));for(int i=1;i<=n;i++)cin>>a[i];int ans=0;while(ans!=k){int i;bool f=0;for(i=1;i<n;i++){if(a[i]>=a[i+1])continue;else {f=1;a[i]++;ans++;break;}}if(f==0){cout<<-1<<endl;break;}if(ans==k){cout<<i<<endl;break;}}}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/317940.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Azure DevOps持续集成GitHub项目

点击蓝字关注我微软的Azure DevOps是一款软件开发管理工具&#xff0c;整合了需求、代码、编译、测试、发布等所有功能于一身。今天我们就来看看如何用Azure DevOps对自己GitHub上的项目做持续集成&#xff0c;并能在GitHub显示最新编译状态。其实在不久之前&#xff0c;Azure …

[BZOJ 3811]玛里苟斯(线性基)尽量理解的题解

文章目录titlesolutioncodetitle 魔法之龙玛里苟斯最近在为加基森拍卖师的削弱而感到伤心&#xff0c;于是他想了一道数学题。 S 是一个可重集合&#xff0c;S{a1,a2,…,an}。 等概率随机取 S 的一个子集 A{ai1,…,aim}。 计算出 A 中所有元素异或和&#xff0c;记为 x, 求 x^…

CF464E The Classic Problem(线段树 最短路)

CF464E The Classic Problem \(\bigstar\texttt{Hint}\)&#xff1a;发现没有什么好的突破口&#xff1f;为什么不想想怎样才能实现题目中 \(2^x\) 的加减法呢&#xff1f; 可见每次加减法&#xff0c;我们要做的是将添加的 \(1\) 和右边的连续的 \(1\) 合并为一整段&#xff0…

C. Longest Simple Cycle

C. Longest Simple Cycle 题意&#xff1a; 有n条链&#xff0c;第i条链上有c[i]个点&#xff0c;a[i]为第i条链的顶点与第i-1条链的连接点&#xff0c;b[i]为第i条链的最后一个点与第i-1条链的连接点。通过上面的方法连接链会产生很多的环&#xff0c;问这些环的最大长度。 …

【CF813F】Bipartite Checking(线段树分治+可删除并查集)

文章目录titlesolutioncodetitle You are given an undirected graph consisting of n vertices. Initially there are no edges in the graph. Also you are given q queries, each query either adds one undirected edge to the graph or removes it. After each query you…

在.Net Core WebAPI下给Swagger增加导出离线文档功能

一丶前言最近刚接触到Swagger&#xff0c;在github上下载了它的源码和demo学习了一遍&#xff0c;发现这个组件非常好用&#xff0c;不过不足的是它没有导出离线文档的功能&#xff0c;于是乎我就想给它加一个导出功能Swagger Github开源地址二丶思路其实说白了api文档就是一个…

YBTOJ洛谷P4331:数字序列(左偏树)

文章目录题目描述数据范围解析代码题目描述 数据范围 n<1e6n<1e6n<1e6 解析 先考虑简单情况 如果原数列是单调递增的&#xff0c;显然应该使biaib_ia_ibi​ai​ 如果单调递减&#xff0c;应该取中位数 那么原数列如果分成单调递减的几段&#xff0c;那么每一段都取中…

P8441 旭日东升(二维数点经典套路)

P8441 旭日东升 维护一个不可重集合的序列 \(a\)&#xff0c;长度为 \(n\)。支持以下两种操作&#xff1a; l r x 对于每个 \(l\le i\le r\)&#xff0c;将 \(x\) 并入 \(a_i\)。l r 设 \(S\) 把每个 \(l\le i\le r\) 的 \(a_i\) 并在一起的集合&#xff0c;输出 \(S\) 中所有元…

深搜、广搜、搜索剪枝

搜索与回溯讲解 文章目录深搜方向向量&#xff1a;DFS代码&#xff1a;题目讲解&#xff1a;八皇后问题字符序列自然数的拆分广搜BFS代码&#xff1a;题目讲解&#xff1a;瓷砖关系网络bfs与dfs的用途与区别搜索剪枝可行性剪枝最优性剪枝记忆化搜索搜索顺序剪枝题目&#xff1a…

使用logdashboard查看可视化日志

logdashboard日志面板是我在Github写的一个开源项目&#xff0c;旨在让查看日志变的方便快捷。在线预览现在功能有日志检索、趋势图、异常堆栈快速查看、日志详情等logdashboard支持自定义日志模型可以记录更多自定义的属性。logdashboard支持的日志来源有以下两种&#xff0c;…

数论分块专题复习(余数求和+模积和+Ice Rain+The Fool)

文章目录前提知识复习T1&#xff1a;余数求和titlesolutioncodeT2&#xff1a;Ice RaintitlesolutioncodeT3&#xff1a;The FooltitlesolutioncodeT4&#xff1a;模积和titlesolutioncode前提知识复习 整除分块是用于快速处理形似下列式子的方法&#xff0c;是解决莫比乌斯反…

领域驱动设计,让程序员心中有码(六)

领域驱动设计-聚合&#xff0c;一种极简的思维模式引言作为IT技术产业飞速发展的产物&#xff0c;软件工程学已经成为当今时代非常重要的一个学科。作为一名资深的软件开发从业者&#xff0c;我们需要学习的东西实际上已经远远超出了原本在大学教育阶段所接受的知识深度和广度&…

hdu 5094 Maze

题意&#xff1a; n*m大的迷宫 &#xff0c;有p种钥匙。钥匙最多有10种。 然后一个k&#xff0c;然后k行表示 (x1,y1),(x2,y2)直接有门或者墙。 如果g0 &#xff0c;就是有墙&#xff0c; 如果g>0 表示有门&#xff0c;且门需要第g把钥匙才能开。 然后下来一个s&#xff…

数论分块练习([CF830 C]Bamboo Partition + [hdu 6395]Sequence )

文章目录T1&#xff1a;SequencetitlesolutionT2&#xff1a;Bamboo PartitiontitlesolutioncodeT1&#xff1a;Sequence title 传送 solution 一眼就是很裸的矩阵加速 ⌊pl⌋\lfloor\frac{p}{l}\rfloor⌊lp​⌋分块矩阵加速就可以了 [BA1][DC⌊pl⌋010001]\begin{bmatrix}…

YBTOJ:染颜色(KDtree)

文章目录题目描述数据范围解析代码题目描述 数据范围 n≤105,T≤5n\le10^5,T\le5n≤105,T≤5 解析 关键是对问题的转化 考虑一次修改&#xff0c;一个点需要满足哪些条件才可以满足 1.与x的距离不超过lll 2.在x的子树内 这两个条件可以转化为对深度的限制和对dfs序的限制 这样…

Kubernetes初探[1]:部署你的第一个ASP.NET Core应用到k8s集群

Kubernetes简介Kubernetes是Google基于Borg开源的容器编排调度引擎&#xff0c;作为CNCF&#xff08;Cloud Native Computing Foundation&#xff09;最重要的组件之一&#xff0c;它的目标不仅仅是一个编排系统&#xff0c;而是提供一个规范&#xff0c;可以让你来描述集群的架…

01分数规划

参考文章 01分数规划 什么是01分数规划&#xff1a; 给定n个a[i]和b[i]&#xff0c;a[i]和b[i]绑定在一起要选同时选&#xff0c;求sum(a[i]) 除以 sum(b[i]) 的最大值&#xff0c;sum为求和函数 对于这种问题我们可以多定义一个数组x[1…n]&#xff0c;x为bool型只取0或者1,…

CF1156D 0-1-Tree(换根DP)

牛犇犇titlesolutioncodetitle 戳一戳 solution 直接设dp[i][k]dp[i][k]dp[i][k]表示以iii为根时&#xff0c;子树内&#xff0c;边权为kkk时的答案 &#xff08;定义写得好复杂&#xff0c;可略过&#xff09; 考虑对于点uuu&#xff0c;vvv是他的一个儿子&#xff0c;两点…

Entity Framework 6.3 和 EF Core 3.0 路线图

尽管脱离了 .NET Core 发布循环&#xff0c;但是 EF Core 正在开发其 3.0 路线图。除此之外&#xff0c;还对原来的 Entity Framework 进行了一些重要的变更。更多服务器端的查询将 LINQ 查询转换为对应的 SQL 查询通常是比较困难的&#xff0c;甚至是不可能的。许多 QRM 只能在…

EFCore+Mysql仓储层建设(分页、多字段排序、部分字段更新)

前沿园子里已有挺多博文介绍了EFCoreMysql/MSSql如何进行使用&#xff0c;但实际开发不会把EF层放在Web层混合起来&#xff0c;需要多个项目配合结构清晰的进行分层工作&#xff0c;本文根据个人实践经验总结将各个项目进行分层&#xff0c;仅供想自己搭建,包含数据仓储以及分页…