contest 1169(div 2)
Posted baihualiaoluan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了contest 1169(div 2)相关的知识,希望对你有一定的参考价值。
B. Pairs
题面描述:
给你m对数,每一个数都在1和n之间,问是否存在两个数x和y,对于每一对数来说,至少存在一个数与x或y相等。如果存在输出 “YES”,否则输出“NO”
思路:
首先,第一对数中至少存在x或y中的一个,分别赋值给a和b,同时,x,y中的另一个数可能是a , b 中的另一个,也可能是与第一对数完全不同的一对数中的一个,将这对数赋值给c,d,那么x,y如果存在,一定在a,b,c,d这四个数之间,枚举所有可能,查看是否符合条件即可。
AC代码:
#include<bits/stdc++.h> using namespace std; const int maxn = 3e5+5; pair< int ,int > pa[maxn]; int n,m; bool check(int a,int b) for(int i = 0;i < m;i++) if(pa[i].first != a && pa[i].first != b && pa[i].second != a && pa[i].second != b) return false; return true; int main() cin >> n >> m; int a,b,c = 0,d = 0; for(int i = 0;i < m;i++) scanf("%d %d",&pa[i].first,&pa[i].second); if(i == 0) a = pa[i].first,b = pa[i].second; if(a != pa[i].first && a != pa[i].second && b != pa[i].first && b != pa[i].second) c = pa[i].first,d = pa[i].second; bool flag = false; if(check(a,b)||check(a,c)||check(a,d)||check(b,c)||check(b,d) ) flag = true; if(flag) cout << "YES" << endl; else cout << "NO" << endl; return 0;
C. Increasing by Modulo
题目描述
给你一个数组,数组中每一个元素都在0和n-1之间,定义一种操作,你选取数组中j个数,将每个数都执行+1然后mod m的操作,输出将该数组改变为非递减数组的最小步数。
思路:
二分答案,判断二分出的答案是否符合条件,不断更新最小值。设当前数组的最大值为last,假如第一个数在进行x操作的过程中可以等于零,我们可以直接让last等于零,否则,应该让他等于num[0],这样可以方便讨论。接下来,对于数组中的每一个数,如果它进行完x次操作以后还是不能比前面最大的值大,则一定不符合条件,直接返回false,接下来,就应该考虑如何更新last的值了,如果num[i[在进行x次操作中能等于last,那就保持last不变即可,接下来,如果num[i]+x大于last但是小于m或者mod m以后依然小于last,本着最小化last的想法,我们应该让last直接等于num[i],还有一种情况就是 (num[i]+x) 大于m且mod m以后大于last,那么就应该维持last保持不变,集体实现请参照下列代码。
AC代码:
#include <bits/stdc++.h> using namespace std; const int maxn = 3e5+5; int n,m; int num[maxn]; bool check(int x) int last = -1; if(num[1]+x>=m) last = 0; else last = max(last,num[1]); for(int i = 2;i<=n;i++) if(num[i]+x>=last) if(num[i]<=last) continue; else if(num[i]+x<m) last = num[i]; else if((num[i]+x)%m<last) last = num[i]; else last =last; else return false; return true; int main() cin >> n >> m; for(int i = 1;i<=n;i++) cin >> num[i]; int l = 0,r = m,res = m; while(l<=r) int mid = (l+r)/2; //cout << mid << ": " << check(mid) << endl; if(check(mid)) r = mid-1; res = min(mid,res); else l = mid+1; cout << res << endl; return 0;
————————————————————————————————————————————————————————
事实已经是这样了,但生活还要继续啊,虽然无论你做什么,她都回不来了。
以上是关于contest 1169(div 2)的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #562 (Div. 2) A题 Circle Metro
[Codeforces Round #522 (Div. 2, based on Technocup 2019 Elimination Round 3)][C. Playing Piano](代码片段
CodeforcesCodeforces Round #491 (Div. 2) (Contest 991)
CodeforcesCodeforces Round #492 (Div. 2) [Thanks, uDebug!] (Contest 996)
Harbour.Space Scholarship Contest 2021-2022 (open for everyone, rated, Div. 1 + Div. 2) D题解