Codeforces Round #696

Codeforces Round #696

文章目录

    • CF1474A Puzzle From the Future
      • 题意:
      • 题解:
      • 代码:
    • CF1474B Different Divisors
      • 题意:
      • 题解:
      • 代码:
    • CF1474C Array Destruction
      • 题意:
      • 题解:
      • 代码:
    • CF1474D Cleaning
      • 题意:
      • 题解:
      • 代码:
    • CF1474E What Is It?
      • 题意:
      • 题解:
      • 代码:
    • CF1474F 1 2 3 4 ..
      • 题意:
      • 题解:
      • 代码:

CF1474A Puzzle From the Future

题意:

在2022年,Mike发现了两个长度为n的二进制整数a和b(它们都只由前导有0的数字(和1)表示)。为了不忘记它们,他想用以下方式构造整数d:

他将a和b按位加和而不进行进位转换,从而得到一个整数c,所以c可能有一个或多个2。例如,0110和1101按位求和的结果是1211,011000和011000按位加和的结果是022000;
之后,Mike将c中相等的连续数字折叠为1位,因此得到d。经过这个操作,1211变成121,022000变成020(所以,d不会有相等的连续数字)。
不幸的是,迈克在自己计算d之前就失去了整数a。现在,为了让他高兴起来,你要找到一个长度为n的二进制整数a,使d成为最大的可能的整数。

最大可能的整数的意思是102>21,012<101,021=21,以此类推。

题解:

规律题,找到规律就行
我们发现a的第一位肯定是1(从左往右数),为了让d更大,我们要让a加b更大,且不能存在一样的数,所以从第二位开始,如果a和b的第i-1位 等于 b的第i位+1,说明第a位就不能取1,只能取0,反之可取1

代码:

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w;
}
int main()
{int t;cin>>t;while(t--){int n;cin>>n;string s;cin>>s;string b="1";for(int i=1;i<n;i++){int w=s[i]-'0';int x,y;x=s[i-1]-'0';y=b[i-1]-'0';if(w+1==x+y)b+='0';else b+='1';}cout<<b<<endl;}return 0;
}

CF1474B Different Divisors

题意:

求一个数,这个数至少有4个除数,且每个除数的差至少是d。

题解:

根据题意多举例子就能发现:
第一位肯定是1,最后一位肯定是中间所有数的乘积,然后第二位比第1位大d,且我们要保证除了第一位和最后一位,其他位的数都必须是质数,这样可以保证最后一位最小
所以我们每次找大于前一位+d的质数

代码:

#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
inline int read(){int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);return s*w;
}
const int maxn=1e7+9;
int tag[maxn],prime[maxn];
int cnt=0;
void Prime(int N)
{memset(tag,0,sizeof(tag));tag[0]=tag[1]=1;for(int i=2;i<N;i++){if(!tag[i])prime[cnt++]=i;for(int j=0;j<cnt&&prime[j]*i<N;j++){tag[i*prime[j]]=1;if(i%prime[j]==0)break;}}
}
int main()
{Prime(1000000);int t;cin>>t;while(t--){int d;cin>>d;int x=1;x+=d;x=lower_bound(prime,prime+cnt,x)-prime;int y=prime[x];y+=d;y=lower_bound(prime,prime+cnt,y)-prime;cout<<prime[x]*prime[y]<<endl;}
}

CF1474C Array Destruction

题意:

题目给出一个长度为2n的正整数序列,现在问你是否存在一个x使得可以不断的进行如下操作,直到这个序列变为空:
从序列中找到两个数字a1,a2,使得a1+a2==x,然后从序列中删掉这两个数字,x的值也被更新,x=max(a1,a+2)。

题解:

因为n的范围并不大,所以x可以暴力枚举
因为x是单调递增的,所以第一个x必然是最大的那个数加上另一个数,最大的数是确定的,另一个数可以枚举
所以一开始枚举2n-1个另一个数,和最大的那个数一起组成最初的x,然后接下来每一步都知道x是谁,且知道最大值是谁,那么x-最大值直接二分查找。一直进行下去,如果中间有二分找不到的数,就从头枚举另一个数重新来
复杂度:O(n2logn)
这题主要看你set用的熟不熟练了

代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 2020;
int T, n, a[maxn], ans;
multiset<int> st;
vector<pair<int, int> > vec;bool _check(int ii) {st.clear();for (int i = 0; i < 2*n-1; i ++) {if (i == ii) continue;st.insert(a[i]);}vec.clear();vec.push_back({a[2*n-1], a[ii]});ans = a[2*n-1] + a[ii];int tmp = a[2*n-1];for (int i = 1; i < n; i ++) {multiset<int>::iterator it = st.end(), it2;it --;int x = *it;st.erase(it);it2 = st.lower_bound(tmp - x);if (it2 == st.end()) return false;int y = *it2;if (x + y != tmp) return false;vec.push_back({x, y});tmp = max(x, y);st.erase(it2);}return true;
}bool check() {for (int i = 0; i < 2*n-1; i ++) if (_check(i)) return true;return false;
}int main() {scanf("%d", &T);while (T --) {scanf("%d", &n);for (int i = 0; i < 2*n; i ++) scanf("%d", a+i);sort(a, a+2*n);if (check()) {puts("YES");printf("%d\n", ans);for (auto x : vec) printf("%d %d\n", x.first, x.second);}else puts("NO");}return 0;
}

CF1474D Cleaning

题意:

每次拿走两个相邻位置的一个石头(可以拿多次),且有且只有一次交换两个相邻位置的机会,问能不能将所有石头拿走

题解:

如果有后一个数字大于前一个数字,我们从前往后就会出现后一个为0,前一个还不为0的情况,所以一定不可能。同理从后往前删除是一样的情况
我们用pre预先处理从前往后的差分
suf预处理从后往前的差分
如果pre与suf数组存在同一位置相等,说明就可以全部拿走
因为还有一次交换的机会,所以直接暴力交换i和i+1两个位置,然后求出当前位置新的pre和和suf,用于判断是否相等

代码:

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdio>
using namespace std ;
const int maxn = 2e5 + 10 ;
typedef long long ll ;
ll a[maxn] , pre[maxn] , suf[maxn] ;
const ll inf = 1e18 ;int main(){int t ;cin >> t ;while(t--){ll n ;cin >> n ;memset(pre , 0 , sizeof(pre)) ;memset(suf , 0 , sizeof(suf)) ;for(ll i = 1 ; i <= n ; i++)	cin >> a[i] ;for(ll i = 1 ; i <= n ; i++){if(a[i] >= pre[i-1])	pre[i] = a[i] - pre[i-1] ;else	pre[i] = inf / 2 ; // 预处理pre,当有不符合情况的时候,pre数组从此往后全为inf/2}for(ll i = n ; i >= 1 ; i--){if(a[i] >= suf[i+1])	suf[i] = a[i] - suf[i+1] ;else	suf[i] = inf ;// 从后往前,如果有不符合,那么全为inf}bool flag = 1 ;for(ll i = 1 ; i <= n - 1 ; i++){if(pre[i] == suf[i+1]){ // 如果可以接上的话直接输出yes就行flag = 0 ;break ;}else{ll tmp1 = a[i] ; // 如果接不上,那么交换a[i]与a[i+1] 然后实现pre[i] 和 suf[i+1] 如果接的上输出yesll tmp2 = a[i+1] ;if(tmp1 >= suf[i+2] && tmp2 >= pre[i-1]){tmp1 -= suf[i+2] ;tmp2 -= pre[i-1] ;if(tmp1 == tmp2){flag = 0 ;break ;}}}}if(!flag)	cout << "YES" << endl ;else		cout << "NO" << endl ;}return 0 ;
} 

CF1474E What Is It?

题意:

一个排列,你可以选择i , j ( i ≠ j ) ,满足a [ j ] = i , 然后交换a[i],a[j],交换收益为 (i-j)2
让你构造一个长度为n的排列,使得交换过程所得收益最大。

题解:

我们不难发现我们每次交换,都会使得至少一个数归位(也就是a[i]=i),当所有位置归位时我们将无法再交换,所以最多交换n-1次
我们再考虑距离为n-1的对数最多是多少?只有一对,就是(1,n),除此之外没有了
我们再考虑n-2的对数最多是多少?最多是两对,就是(1,n-1)和(2,n),(当然其他考虑也是一样的),最多只有两对
当距离为n-3的也只有两对
那么最大收益就是(n-1)2 + 2*(n-2)2 + 2*(n-3)2+…
这样收益就算出来了
至于步骤我们可以你想考虑,也就是一开始数组a都是归位的,然后先弄(n-1)对,再弄(n-2)对,这样就得到最后的排列和交换过程

代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>using namespace std;typedef long long ll;const int INF = 0x3f3f3f3f;
const int maxn = 2e5 + 7;
int a[maxn];
int main() {int T;scanf("%d",&T);while(T--) {int n;scanf("%d",&n);for(int i = 1;i <= n;i++) {a[i] = i;}vector<pair<int,int> >vec;ll ans = 0;int cnt = n - 1;for(int i = n - 1;;i--) { //交换两点的距离swap(a[i + 1],a[1]);vec.push_back({i + 1,1});ans += 1ll * i * i;cnt--;if(cnt == 0) break;if(i == n - 1) continue;swap(a[n - i],a[n]);vec.push_back({n - i,n});ans += 1ll * i * i;cnt--;if(cnt == 0) break;}printf("%lld\n",ans);for(int i = 1;i <= n;i++) {printf("%d ",a[i]);}printf("\n");printf("%d\n",n - 1);for(int i = vec.size() - 1;i >= 0;i--) {printf("%d %d\n",vec[i].first,vec[i].second);}}return 0;
}

CF1474F 1 2 3 4 …

题意:

题解:

代码:

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

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

相关文章

YBTOJ洛谷P4068:数字配对(网络流)

文章目录题目描述解析代码题目描述 有n种数字&#xff0c;第 i 种数字是 ai&#xff0c;有 bi个&#xff0c;权值是 ci。 若两个数字 ai,aj 满足&#xff0c; ai 是 aj 的倍数&#xff0c;且 ai/aj 是一个质数&#xff0c;那么这两个数字可以配对&#xff0c;并获得 ci*cj 的…

Comet OJ(Contest #14)-飞翔的小鸟【tarjan】

正题 题目链接:https://www.cometoj.com/contest/73/problem/E?problem_id4124 题目大意 给出nnn个点mmm条边的一张有向图&#xff0c;边有边权&#xff0c;qqq次询问从点111走到点xxx的所有路径&#xff08;可以重复经过任何点包括点xxx&#xff09;中极差最大是多少。 1≤…

[TJOI2019]唱、跳、rap和篮球(指数型生成函数+NTT+卷积)

文章目录题目题解code1&#xff08;NTT&#xff09;code2&#xff08;EGF卷积&#xff09;题目 大中锋的学院要组织学生参观博物馆&#xff0c;要求学生们在博物馆中排成一队进行参观。他的同学可以分为四类&#xff1a;一部分最喜欢唱、一部分最喜欢跳、一部分最喜欢rap&…

数数题(计数类 DP)做题记录

数数题(计数类 DP)做题记录 CF1657E Star MST 我们称张无向完全图是美丽的当且仅当&#xff1a;所有和 \(1\) 相连的边的边权之和等于这张完全图的最小生成树的边权之和。 完全图点数为 \(n\)&#xff0c;边权 \(\in[1,k]\)&#xff0c;\(1\le n,k\le 250\)。 发现所有和 \(1\)…

Sum of Paths CodeForces - 1467D

Sum of Paths CodeForces - 1467D Tagscombinatorics dp math *2200 题意&#xff1a; 定义一条好的路径&#xff0c;当且仅当从任意点出发之后恰好经过了 k 次移动&#xff0c;定义这条路径的权值为经过点权值的总和(可重)&#xff0c;进行 q 次修改&#xff0c;每次将ak 改…

[矩阵乘法/快速幂专题]Arc of Dream,Recursive sequence,233 Matrix,Training little cats

矩阵快速幂习题复习矩阵乘法及快速幂模板乘法模板快速幂模板T1&#xff1a;Arc of Dream题目题解codeT2&#xff1a;Recursive sequence题目题解codeT3&#xff1a;233 Matrix题目题解codeT4&#xff1a;Training little cats题目题解code做题的时候后悔没有保存过模板&#xf…

P3639-[APIO2013]道路费用【最小生成树】

正题 题目链接:https://www.luogu.com.cn/problem/P3639 题目大意 给出nnn个点mmm条有边权的无向图&#xff0c;然后再给出kkk条边权未定义的边&#xff0c;然后每个点有一个人数pip_ipi​。 现在要你给未确定的边权的边确定边权然后选出图的一棵最小生成树&#xff0c;之后…

你准备好了在云中工作吗?

前几天写了一篇文章 《云时代的.NET》&#xff0c;今天继续这个话题聊下云时代的技能。无服务器计算&#xff0c;容器化&#xff0c;云原生应用&#xff0c;DevOps&#xff0c;人工智能&#xff0c;机器学习以及混合云和多云解决方案等IT趋势正在成为主流或“新常态”。所有大小…

珂朵莉树(ODT)

珂朵莉树 ODT 主要内容 珂朵莉树是基于数据随机且有整体赋值操作而对序列操作的乱搞算法。 它的主要思想是用 set 维护若干个数值上相同的区间&#xff0c;并暴力处理其他询问。 建立 在 set 中&#xff0c;我们需要用结构体记录每个区间的信息&#xff1a; struct NODE {int l…

最长公共上升子序列(LCIS)

题意&#xff1a; 求最长公共上升子序列 题解&#xff1a; 最长公共上升子序列 最长公共子序列&#xff08;LCS&#xff09;与最长上升子序列&#xff08;LIS&#xff09; LCS核心代码&#xff1a; for(int i1;i<n;i){for(int j1;j<m;j){if(a[i]b[j])dp[i][j]max(dp[…

YBTOJ洛谷P1407:稳定婚姻(强连通分量)

文章目录题目描述解析代码题目描述 我们已知n对夫妻的婚姻状况&#xff0c;称第 i 对夫妻的男方为 Bi &#xff0c;女方为 Gi。 若某男 Bi 与某女 Gi 曾经交往过( i!j )&#xff0c;则当某方与其配偶&#xff08;即 Bi 与 Gi 或 Bj 与 Gj&#xff09;感情出现问题时&#xff…

[高斯消元及理论]线性方程组整数/浮点数,模线性方程组,异或方程组模板

文章目录理论线性方程组整数类型解线性方程组浮点类型解模线性方程组异或方程组高斯约旦消元约旦消元无解无穷解唯一解理论 高斯消元法&#xff0c;是线性代数规划中的一个算法&#xff0c;可用来为线性方程组求解。但其算法十分复杂&#xff0c;不常用于加减消元法&#xff0c…

eShopOnContainers 知多少[7]:Basket microservice

引言Basket microservice&#xff08;购物车微服务&#xff09;主要用于处理购物车的业务逻辑&#xff0c;包括&#xff1a;购物车商品的CRUD订阅商品价格更新事件&#xff0c;进行购物车商品同步处理购物车结算事件发布订阅订单成功创建事件&#xff0c;进行购物车的清空操作架…

P6805-[CEOI2020]春季大扫除【贪心,树链剖分,线段树】

正题 题目链接:https://www.luogu.com.cn/problem/P6805 题目大意 给出nnn个点的一棵树&#xff0c;qqq次独立的询问。每次询问会在一些节点上新增一些子节点&#xff0c;然后你每次可以选择两个为选择过的叶子节点然后覆盖它们的路径&#xff0c;要求在覆盖所有边的情况下使…

后缀数组 SA

后缀数组 SA 后缀树组(SA&#xff0c;suffix array)&#xff0c;用于处理字符串子串形成的结构。 处理子串的结构主要方式有&#xff1a;后缀数组 SA&#xff0c;后缀自动机 SAM&#xff0c;后缀树 ST。 后缀树和后缀自动机暂时决定咕咕咕&#xff0c;以后学习可以参考ix35 的字…

导弹防御系统

导弹防御系统 题意&#xff1a; 最少可以找到一直 严格单调 上升或者一直 严格单调 下降 题解&#xff1a; 第一反应是LIS&#xff0c;但是本题要求找一直上升或者一直下降的&#xff0c;LIS不能实现 但是我们还是从LIS下手&#xff0c;LIS中最核心的思想是能否将一个元素加…

STL:bitset用法详解

文章目录前言声明输入输出访问与修改位运算所谓bitset&#xff0c;就是bit组成的set &#xff08;逃&#xff09; 前言 bitset的诸多好处&#xff1a; 1.节约空间 2.增加一些新的功能 3.几乎没有副作用 4.有了123还不够吗&#xff01;&#xff1f; 当然&#xff0c;还有一个决…

微软热门开源项目及代码库地址

点击蓝字关注我这几年来&#xff0c;微软在开源与社区方向的努力与成就是全世界有目共睹的。微软的开源项目超过2000多个&#xff0c;挑了一些比较火热的给大家整理了一下。欢迎补充~Visual Studio Code非常流行的跨平台代码编辑器&#xff0c;提供全面的编辑和调试支持、可扩展…

P6846-[CEOI2019]Amusement Park【状压dp,FWT】

正题 题目链接:https://www.luogu.com.cn/problem/P6846 题目大意 给出nnn个点mmm条边的一张有向图&#xff0c;保证两个点之间最多只有一条边。现在你可以取反一些边使得图变为一张DAGDAGDAG&#xff0c;求所有方案的取反的边数和。 1≤n≤181\leq n\leq 181≤n≤18 解题思路…

CDQ 分治与整体二分

CDQ 分治与整体二分 CDQ 分治 主要是一种分治思想&#xff0c;常用于解决偏序问题。 例如三维偏序问题&#xff0c;我们采用的方法是先处理以第一关键字为区分的左区间、右区间内的答案&#xff0c;再处理左右区间互不干涉的答案。 四维偏序呢&#xff1f; 咕咕咕 整体二分 主要…