Solutions


A. Choose Two Numbers

题意:
给出\(A,B\)两个集合,\(A,B\) 集合分别选一个数\(a,b\) ,使得\(a+b\notin\ A,B\)
思路:
每个集合选出最大值,必定满足条件。emmmmm比赛的时候傻了。

//#define DEBUG
#include<bits/stdc++.h>
using namespace std;
#define lson (rt<<1)
#define rson (rt<<1|1)
const int N=100010;
const int inf=0X3f3f3f3f;
const long long INF = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-6;
const double pi = acos(-1.0);
const int mod = 1000000007;
typedef long long ll;int a[110];
int main() {#ifdef DEBUGfreopen("in.txt","r",stdin);#endifint n,m,ans1,ans2;scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&a[i]);ans1=*max_element(a+1,a+n+1);scanf("%d",&m);for(int i=1;i<=m;i++) scanf("%d",&a[i]);ans2=*max_element(a+1,a+m+1);printf("%d %d\n",ans1,ans2);
}

B. Make Product Equal One

题意:
给出\(a_1,a_2,\dots,a_n\),可以进行任意次操作:选择其中任意一个数\(+1,-1\),使得最后\(a_1{\ast}a_2{\ast}\dots{\ast}a_n=1\)。
思路:
负数就变为\(-1\),整数就变为\(1\),但是若负数个数为奇数,则需要有一个变为\(1\),但是存在\(0\)的话,则不需要。

//#define DEBUG
#include<bits/stdc++.h>
using namespace std;
#define lson (rt<<1)
#define rson (rt<<1|1)
const int N=100010;
const int inf=0X3f3f3f3f;
const long long INF = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-6;
const double pi = acos(-1.0);
const int mod = 1000000007;
typedef long long ll;int main() {#ifdef DEBUGfreopen("in.txt","r",stdin);#endifint n;scanf("%d",&n);ll ans=0,ok=0,res=1;for(int i=1;i<=n;i++) {int x;scanf("%d",&x);if(x>=1) ans+=x-1;else if(x<0) ans+=-1-x,res*=-1;else if(!x) ans+=1,ok=1;}if(ok||res==1) printf("%lld\n",ans);else printf("%lld\n",ans+2);
}

C. Almost Equal

题意:
给出数字\(n\),你需要安排的数为\(1\sim2n\),组成一个环。每连续\(n\)个数求一次和\(sum_i\),输出一个合法的序列,使得\({\forall}i,j,\ {\mid}sum_i-sum_j{\mid}{\leq}1\)
思路:
比赛时我构造出序列,然后队友写出\(check\) 代码,构造时发现分为两部分,右边最上面写一个最大的,左边最下面写次大的,然后左边再写次次大的,右边再写次次次大的,交替进行。可以理解为右边为先手,然后左边变为先手。构造完以后,用数组模拟成环,然后前缀和搞一搞模拟\(check\) 即可。
正解:
我们定义\(s_i=a_i+a_{i+1}+a_{i+2}+{\dots}+a_{i+n-1}\),
\(S_{i+1}-S_{i}=\left(a_{i+1}+a_{i+2}+a_{i+3}+\cdots+a_{i+n}\right)-\left(a_{i}+a_{i+1}+a_{i+2}+\cdots+a_{i+n-1}\right)=a_{i+n}-a_{i}\) 根据题意有\({\mid}a_{i+n}-a_i{\mid}{\leq}1\),因为\(a\)数组都是不同的,所以\({\mid}a_{i+n}-a_i{\mid}=1\)
则根据题意有:\(a_{i+n}-a_i,a_{i+n+1}-a_{i+1}\) 有相反的符号。 证:若他们都等于\(1\),则\(S_{i+2}-S_i=(S_{i+2}-S_{i+1})+(S_{i+1}-S_{i})=(a_{i+n+1}-a_{i+1})+(a_{i+n}-a_i)=2\),若都为\(-1\)也一样。因此,对于\(a_{i+n}-a_i\),他们是交替的\(1,-1,1,\dots\)。

  • 如果\(n\)为偶数,存在矛盾\(a_{i+n}-a_i=-(a_{(i+n)+n}-a_{i+n})\),但是由于交替,所以他们应该是相等的
  • 如果\(n\)为奇数,\(i:1{\sim}n\)
    • 若\(i\)为奇数,\(a_i=2i,a_{i+n}=2i-1\)
    • 若\(i\)为偶数,\(a_i=2i-1,a_{i+n}=2i\)
//#define DEBUG
#include<bits/stdc++.h>
using namespace std;
#define lson (rt<<1)
#define rson (rt<<1|1)
const int N=100010;
const int inf=0X3f3f3f3f;
const long long INF = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-6;
const double pi = acos(-1.0);
const int mod = 1000000007;
typedef long long ll;int a[N],b[N],c[4*N];
ll ans[4*N];
int main() {#ifdef DEBUGfreopen("in.txt","r",stdin);#endifint n;scanf("%d",&n);bool flag=true;int cura=0,curb=0;int x=2*n;while(x) {if(flag) {b[++curb]=x--;a[++cura]=x--;} else {a[++cura]=x--;b[++curb]=x--;}flag=!flag;}int cur=0;for(int i=cura;i>=1;i--) c[++cur]=a[i];for(int i=curb;i>=1;i--) c[++cur]=b[i];int len=cur;for(int i=1;i<=len;i++) c[++cur]=c[i];//for(int i=1;i<=cur;i++) printf("%d\n",c[i]);set<ll> s;for(int i=1;i<=n;i++)ans[i]=ans[i-1]+c[i];s.insert(ans[n]);for(int i=n+1;i<=3*n;i++){ans[i]=ans[i-1]-c[i-n]+c[i];s.insert(ans[i]);}if(s.size()>2)puts("NO");else if(s.size()==2){set<ll>::iterator it=s.begin();ll s1,s2;s1=*it;it++;s2=*it;if(abs(s1-s2)!=1)puts("NO");else {puts("YES");for(int i=1;i<=2*n;i++)printf("%d%c",c[i],i==2*n?'\n':' ');}}else {puts("YES");for(int i=1;i<=2*n;i++)printf("%d%c",c[i],i==2*n?'\n':' ');}
}
//#define DEBUG
#include<bits/stdc++.h>
using namespace std;
#define lson (rt<<1)
#define rson (rt<<1|1)
const int N=100010;
const int inf=0X3f3f3f3f;
const long long INF = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-6;
const double pi = acos(-1.0);
const int mod = 1000000007;
typedef long long ll;int a[2*N];
int main() {#ifdef DEBUGfreopen("in.txt","r",stdin);#endifint n;scanf("%d",&n);if(n%2==0) {puts("NO");return 0;}puts("YES");for(int i=1;i<=n;i++) {if(i&1) a[i]=2*i,a[i+n]=2*i-1;else a[i]=2*i-1,a[i+n]=2*i;}for(int i=1;i<=2*n;i++) printf("%d%c",a[i],i==2*n?'\n':' ');
}

D. Shortest Cycle

题意:
给出\(a_1,a_2,{\dots},a_n\),当作图中的\(n\)个点,对于\({\forall}i,j(i{\neq}j),a_i\&a_j{\neq}0\),\(a_i\)和\(a_j\)连一条边,然后求最小环。
思路:
比赛时队友考虑二进制,都把\(60\)个位置画出来了。我也准备好\(floyd\)最小环了。但是沙雕了,感觉每个位置都连边,复杂度太大emmmmmm。其实二进制对应位置\(1\)的个数大于\(2\),那么最小环就是\(3\),然后最多\(120\)个点\(60\)条边(可能不确切),然后\(floyd\)跑最小环即可。
\(floyd\)求最小环:\(d[i][j]\)为\(i\)到\(j\)不包含\(k\)点的最短距离。所以对于当前\(k\),我们已经求得\(1{\sim}k-1\)的\(d[i][j]\),然后枚举\(1{\sim}k-1\)的\(d[i][j]\),然后更新答案,\(ans=min(ans,a[i][k]+a[k][j]+d[i][j])\),表示包含\(k\)的环,其中\(a\)数组为最初距离。

//#define DEBUG
#include<bits/stdc++.h>
using namespace std;
const int N=100010;
const int inf=0X3f3f3f3f;
const long long INF = 0x3f3f3f3f3f3f3f3f;
const double eps = 1e-6;
const double pi = acos(-1.0);
const int mod = 1000000007;
typedef long long ll;int ans=60;
ll b[N],a[150][150],d[150][150];
int tot;int main() {#ifdef DEBUGfreopen("in.txt","r",stdin);#endifint n;scanf("%d",&n);ll x;for(int i=1;i<=n;i++) {scanf("%lld",&x);if(x) b[++tot]=x;}for(int i=0;i<=60;i++) {int cnt=0;for(int j=1;j<=tot;j++) {if(b[j]&(1ll<<i)) ++cnt;}if(cnt>=3) {puts("3");return 0;}}for(int i=1;i<=tot;i++) {for(int j=1;j<=tot;j++)if(i==j) d[i][j]=a[i][j]=0;else d[i][j]=a[i][j]=inf;}for(int i=1;i<=tot;i++) {for(int j=1;j<=tot;j++) {if(i==j) continue;if(b[i]&b[j]) a[i][j]=d[i][j]=1;}}//memcpy(d,a,sizeof(a));for(int k=1;k<=tot;k++) {for(int i=1;i<=k-1;i++) {for(int j=1;j<=k-1;j++)if(i!=j&&a[i][k]+a[k][j]+d[i][j]<ans)ans=a[i][k]+a[k][j]+d[i][j];}for(int i=1;i<=tot;i++) {for(int j=1;j<=tot;j++)if(d[i][j]>d[i][k]+d[k][j])d[i][j]=d[i][k]+d[k][j];}}if(ans==60) puts("-1");else printf("%d\n",ans);
}

转载于:https://www.cnblogs.com/ACMerszl/p/11396093.html

Codeforces Round #580 (Div. 2)相关推荐

  1. Codeforces Round #506 (Div. 3)

    Codeforces Round #506 (Div. 3) 实习期间事不多,对div3 面向题解和数据编程了一波 A. Many Equal Substrings 题目链接 A题就是找后缀和前缀重合 ...

  2. Codeforces Round #563 (Div. 2)/CF1174

    Codeforces Round #563 (Div. 2)/CF1174 CF1174A Ehab Fails to Be Thanos 其实就是要\(\sum\limits_{i=1}^n a_i ...

  3. 构造 Codeforces Round #302 (Div. 2) B Sea and Islands

    题目传送门 1 /* 2 题意:在n^n的海洋里是否有k块陆地 3 构造算法:按奇偶性来判断,k小于等于所有点数的一半,交叉输出L/S 4 输出完k个L后,之后全部输出S:) 5 5 10 的例子可以 ...

  4. Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解(每日训练 Day.16 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #696 (Div. 2) (A ~ E)超高质量题解 比赛链接:h ...

  5. Codeforces Round #712 Div.2(A ~ F) 超高质量题解(每日训练 Day.15 )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #712 Div.2(A ~ F) 题解 比赛链接:https:// ...

  6. Codeforces Round #701 (Div. 2) A ~ F ,6题全,超高质量良心题解【每日亿题】2021/2/13

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A - Add and Divide B - Replace and Keep Sorted C ...

  7. Codeforces Round #700 (Div. 2) D2 Painting the Array II(最通俗易懂的贪心策略讲解)看不懂来打我 ~

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 整场比赛的A ~ E 6题全,全部题目超高质量题解链接: Codeforces Round #700 ...

  8. Codeforces Round #699 (Div. 2) F - AB Tree(贪心、树上DP)超级清晰,良心题解,看不懂来打我 ~

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #699 (Div. 2) F - AB Tree Problem ...

  9. Codeforces Round #699 (Div. 2) (A ~ F)6题全,超高质量良心题解【每日亿题】2021/2/6

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Codeforces Round #699 (Div. 2) (A.B.C)[每日亿题]2021/2/ ...

最新文章

  1. 【渣硕的数学笔记】数值分析
  2. 用lisp编写串口助手源代码_实战用python来写个串口助手--界面篇
  3. php中address,address.php
  4. 远程仓库与 fetch 命令——Git 学习笔记 20
  5. python pip全称_“ pip install”和“ pip install”之间有什么区别和“ python -m pip install”?...
  6. .NET 5 中的正则引擎性能改进(翻译)
  7. Java设计模式笔记(7)适配器模式
  8. 服务器添加管理员隐藏账号,绝招:隐藏管理员账号 三分钟搞定
  9. appium移动自动化测试-安装2
  10. dosbox使用教程
  11. 利用Q-learning解决Cliff-walking问题
  12. 安卓开发实现俄罗斯方块游戏
  13. Java中线程基础-线程间的共享-volatile
  14. Windows游戏开发感想一个完整的Windows窗口程序
  15. win10怎么将计算机放桌面壁纸,win10电脑系统怎么改变桌面壁纸的大小
  16. python版本的判断、选择指南
  17. Java 数据类型(基本数据类型、引用数据类型)
  18. 数字信号处理知识点总结(四):快速傅里叶变换(FFT)
  19. 人生时间计算器_人生时钟,你现在几点?
  20. 搜索引擎UA和对应的蜘蛛IP段,百度,搜狗,so,360搜索,神马

热门文章

  1. php 累,php 记录进行累结果
  2. 自己的总结(你必须知道的C 495个问题)
  3. 经典的 Fork 炸弹解析
  4. 每天一道LeetCode-----寻找给定字符串中重复出现的子串
  5. Mysql:Access denied for user ‘root@localhost‘ (using password:NO)
  6. 合并区间—leetcode56
  7. Linux信号量之用户态信号量(Posix信号量->无名信号量)
  8. php pdo预处理查询,关于php:从PDO预处理语句中获取原始SQL查询字符串
  9. oracle rac 中的ocr,11g rac中 ocr和 votingdisk疑问
  10. java怎样实现自定义过滤关键词_SpringSecurity学习之自定义过滤器的实现代码