比赛链接:Dashboard - Codeforces Round #829 (Div. 2) - Codeforces

目录

A. Technical Support

B. Kevin and Permutation

C1. Make Nonzero Sum (easy version)

C2. Make Nonzero Sum (hard version)

D. Factorial Divisibility


A. Technical Support

题意:给定一个由QA组成的字符串,Q表示问题,A表示回答,要求每一个Q后面都能对应至少一个A。

思路:从后往前遍历,遇到‘Q’的时候判断‘A’的个数是否大于‘Q’,若不是则输出NO。

#define _CRT_SECURE_NO_WARNINGS 1
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include<map>
#include<queue>
#include<stack>
#include<set>
#include<math.h>
#define FOR(a,b) for(int i=a;i<=b;i++)
#define ROF(a,b) for(int i=a;i>=b;i--)
#define FORj(a,b) for(int j=a;j<=b;j++)
#define ROFj(a,b) for(int j=a;j>=b;j--)
#define FORk(a,b) for(int k=a;k<=b;k++)
#define ROFk(a,b) for(int k=a;k>=b;k--)
#define mem(i,a) memset(i,a,sizeof(i))
#define ll long long
#define inf 0x3f3f3f3f
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define int  long long
#define yes cout<<"YES"<<endl
#define no cout<<"NO"<<endl
#define pi acos(-1.0)
#define endl '\n'
using namespace std;
const int maxn = 5e6 + 5;
void solve() {int n,A=0,Q=0;string s;cin >> n >> s;ROF(n - 1, 0) {if (s[i] == 'A')A++;else Q++;if (s[i] == 'Q' && A < Q) {no;return;}}yes;
}
signed main() {cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);int _;cin >> _;while (_--)solve();return 0;
}

B. Kevin and Permutation

题意:给定数组长度n,请构造一个排列使得两个相邻元素差的最小值最大。

思路:我们可以俩俩一组构造,像n/2+1, 1, n/2 + 2, 2......这样子,若数组长度为奇数,我们只用将n放到数组最后即可。

#define _CRT_SECURE_NO_WARNINGS 1
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include<map>
#include<queue>
#include<stack>
#include<set>
#include<math.h>
#define FOR(a,b) for(int i=a;i<=b;i++)
#define ROF(a,b) for(int i=a;i>=b;i--)
#define FORj(a,b) for(int j=a;j<=b;j++)
#define ROFj(a,b) for(int j=a;j>=b;j--)
#define FORk(a,b) for(int k=a;k<=b;k++)
#define ROFk(a,b) for(int k=a;k>=b;k--)
#define mem(i,a) memset(i,a,sizeof(i))
#define ll long long
#define inf 0x3f3f3f3f
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define int long long
#define yes cout<<"YES"<<endl
#define no cout<<"NO"<<endl
#define pi acos(-1.0)
#define endl '\n'
using namespace std;
const int maxn = 2e5 + 5;
void solve() {int n;cin >> n;FOR(1,n/2)  cout << i + n / 2 <<" " << i << " ";if(n%2)cout<<n;cout<<endl;
}
signed main() {cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);int _;cin >> _;while (_--)solve();return 0;
}

C1. Make Nonzero Sum (easy version)

题意:给定一个[-1, 1]组成的数组,将该数组拆分成若干区间,每一个区间的价值为a[l]-a[l+1]+a[l+2]-a[l+3]......a[r]。需要我们构造一个划分区间的方法使得总价值为0。

思路:若1和-1的总数目为奇数则构造不了使得总价值为0的方法,因为划分区间在本质上只是能吧一些-1变成1,把一些1变成-1,或者不变。所以每次总价值只会-2或者+2,若n为奇数那么初始的总价值也为奇数,改变区间对应改变的总价值也只会是偶数,那么总价值永远到不了0。

当n为偶数时,我们可以两两分组,每组选择两次长度为1的区间,或一次长度为2的区间,若选择两次长度为1的区间会使得总价值不变,选择一次长度为2的区间会使得总价值-2或者总价值+2,我们最多选择n/2组,所以当n为偶数的时候必有解。

ps:C题我写的代码比较乱,建议看别人的代码或者自己写。

#define _CRT_SECURE_NO_WARNINGS 1
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include<map>
#include<queue>
#include<stack>
#include<set>
#include<math.h>
#define FOR(a,b) for(int i=a;i<=b;i++)
#define ROF(a,b) for(int i=a;i>=b;i--)
#define FORj(a,b) for(int j=a;j<=b;j++)
#define ROFj(a,b) for(int j=a;j>=b;j--)
#define FORk(a,b) for(int k=a;k<=b;k++)
#define ROFk(a,b) for(int k=a;k>=b;k--)
#define mem(i,a) memset(i,a,sizeof(i))
#define ll long long
#define inf 0x3f3f3f3f
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define int long long
#define yes cout<<"YES"<<endl
#define no cout<<"NO"<<endl
#define pi acos(-1.0)
#define endl '\n'
using namespace std;
const int maxn = 2e5 + 5;
int a[maxn];
pair<int, int>b[maxn];
void solve() {int n, z = 0, f = 0, k = 0;cin >> n;FOR(1, n) {cin >> a[i];if (a[i] == 1)z++;else f++;}if (z == f) {cout << n << endl;FOR(1, n)cout << i << " " << i << endl;return;}if (n % 2) {cout << -1 << endl;return;}if (z > f) {FOR(1, n - 1) {if (a[i + 1] == 1) {b[++k].first = i, b[k].second = i + 1;z--;f++;i++;} else   b[++k].first = i, b[k].second = i;if (z == f)break;}} else {FOR(1, n - 1) {if (a[i + 1] == -1) {b[++k].first = i, b[k].second = i + 1;f--;z++;i++;} else  b[++k].first = i, b[k].second = i;if (z == f)break;}}cout << k + n - b[k].second << endl;FOR(1, k)cout << b[i].first << " " << b[i].second << endl;FOR(b[k].second + 1, n)cout << i << " " << i << endl;
}
signed main() {cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);int _;cin >> _;while (_--)solve();return 0;
}

C2. Make Nonzero Sum (hard version)

题意:给定一个[-1, 0,1]组成的数组,将该数组拆分成若干区间,每一个区间的价值为a[l]-a[l+1]+a[l+2]-a[l+3]......a[r]。需要我们构造一个划分区间的方法使得总价值为0。(和C1相比就是数组中除了1和-1多了0)

思路:和C1大同小异,也是两个不为0的数组两个为一组,我们需要先获取两个不为0的数字的下标,就可以构造出每组中第二个数字取反的区间方法了,同样每次操作能使总价值+2或者-2。

#define _CRT_SECURE_NO_WARNINGS 1
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include<map>
#include<queue>
#include<stack>
#include<set>
#include<math.h>
#define FOR(a,b) for(int i=a;i<=b;i++)
#define ROF(a,b) for(int i=a;i>=b;i--)
#define FORj(a,b) for(int j=a;j<=b;j++)
#define ROFj(a,b) for(int j=a;j>=b;j--)
#define FORk(a,b) for(int k=a;k<=b;k++)
#define ROFk(a,b) for(int k=a;k>=b;k--)
#define mem(i,a) memset(i,a,sizeof(i))
#define ll long long
#define inf 0x3f3f3f3f
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define int long long
#define yes cout<<"YES"<<endl
#define no cout<<"NO"<<endl
#define pi acos(-1.0)
#define endl '\n'
using namespace std;
const int maxn = 2e5 + 5;
int a[maxn];
pair<int, int>b[maxn];
void solve() {int n, z = 0, f = 0, k = 0;cin >> n;FOR(1, n) {cin >> a[i];if (a[i] == 1)z++;else if(a[i]==-1)f++;}if (z == f) {cout << n << endl;FOR(1, n)cout << i << " " << i << endl;return;}if ((z+f)% 2) {cout << -1 << endl;return;}int p1= 1,p2=2;if (z > f) {while(p2<=n) {while (!a[p2] && p2 <= n)p2++;if (a[p2] == 1) {if ((p2 - p1) % 2)b[++k].first = p1, b[k].second = p2;else {b[++k].first = p1, b[k].second = p1;b[++k].first = p1 + 1, b[k].second = p2;}z--, f++;} else {if ((p2 - p1) % 2) {b[++k].first = p1, b[k].second = p1;b[++k].first = p1 + 1, b[k].second = p2;} else {b[++k].first = p1, b[k].second = p2;}}if (z == f)break;p1 = p2 + 1;p2=p1+1;}} else {while (p2 <= n) {while (!a[p2] && p2 <= n)p2++;
//           cout<<p1<<" "<<p2<<" "<<a[p1]<<" "<<a[p2]<<endl;if (a[p2] == -1) {if ((p2 - p1) % 2)b[++k].first = p1, b[k].second = p2;else {b[++k].first = p1, b[k].second = p1;b[++k].first = p1 + 1, b[k].second = p2;}z++, f--;} else {if ((p2 - p1) % 2) {b[++k].first = p1, b[k].second = p1;b[++k].first = p1 + 1, b[k].second = p2;} else {b[++k].first = p1, b[k].second = p2;}}if (z == f)break;p1 = p2 + 1;p2=p1+1;}}cout << k + n - b[k].second << endl;FOR(1, k)cout << b[i].first << " " << b[i].second << endl;FOR(b[k].second + 1, n)cout << i << " " << i << endl;}
signed main() {cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);int _;cin >> _;while (_--)solve();return 0;
}

D. Factorial Divisibility

题意:给定一个长度为n的数组和k,判断!k是否整除(!a1 + !a2 + !a3 + !a4... + !an)。

思路:我们可以发现一个规律:1!+1!=2!,2!+2!+2!=3!,3!+3!+3!+3!=4!......

所以可得出n个x!可以转化为n/(x+1)个(x+1)!,所以我们从低位到高位累加,利用mp[i] % (i + 1)是否等于0,来判断每位能不能将数字全部转化,若不能被全部转化就说明了不能被整除。

#define _CRT_SECURE_NO_WARNINGS 1
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include<map>
#include<queue>
#include<stack>
#include<set>
#include<math.h>
#define FOR(a,b) for(int i=a;i<=b;i++)
#define ROF(a,b) for(int i=a;i>=b;i--)
#define FORj(a,b) for(int j=a;j<=b;j++)
#define ROFj(a,b) for(int j=a;j>=b;j--)
#define FORk(a,b) for(int k=a;k<=b;k++)
#define ROFk(a,b) for(int k=a;k>=b;k--)
#define mem(i,a) memset(i,a,sizeof(i))
#define ll long long
#define inf 0x3f3f3f3f
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define int unsigned long long
#define yes cout<<"YES"<<endl
#define no cout<<"NO"<<endl
#define pi acos(-1.0)
#define endl '\n'
using namespace std;
const int maxn = 5e6 + 5;
map<int, int>a;
void solve() {int n, k;cin >> n >> k;FOR(1, n) {int x;cin >> x;a[x]++;}FOR(1, k-1) {if (a[i] % (i + 1)) {no;return;}a[i + 1] += a[i] / (i + 1);}yes;
}
signed main() {cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);//    int _;//    cin >> _;//   while (_--)solve();return 0;
}

Codeforces Round #829 (Div. 2) A~D相关推荐

  1. C1. Make Nonzero Sum (easy version)【Codeforces Round #829 (Div. 2】

    Codeforces Round #829 (Div. 2)中C1题目 Codeforces比赛记录 文章目录 题目链接: 一.C1. Make Nonzero Sum (easy version) ...

  2. Codeforces Round #829 (Div. 2)

    A. Technical Support         题目大意:                 每次一个问题Q,和一个回答A.要求每个问题Q后面都有A与之对应,问给出的字符串是不是满足这个条件 ...

  3. Codeforces Round #829 (Div. 2)题解

    文章目录 A B C1 C2 D A 题意:给我们一个字符串,Q代表问题A代表答案,问题可能会一直提,答案可能会晚些回复.问我们能不能保证一个问题后面至少会跟着一个回答. 思路:我们边遍历边看就行. ...

  4. Codeforces Round #506 (Div. 3)

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

  5. 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 ...

  6. 构造 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 的例子可以 ...

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

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

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

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

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

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

最新文章

  1. mysql主主复制、主从复制、半同步的实现
  2. python坐标轴刻度为经纬度_python各类经纬度转换
  3. 【转】sql server开启全文索引方法
  4. Introduction mybatis
  5. python与正则表达式(part1)--元字符
  6. [C++11]可调用对象绑定器
  7. 【数据结构与算法】【算法思想】【算法应用】【排序查找搜索】并行
  8. python经典实例-python经典实例
  9. MySQL 主主同步配置和主从配置步骤
  10. jetbrain秘密路径
  11. 有理数域上lamada矩阵(方阵)化标准形的实现
  12. android viewpager标题,ViewPager顶部导航栏联动效果(标题栏条目多)
  13. python文本分类算法_基于Naive Bayes算法的文本分类
  14. 区块链知识系列 - 区块链大事记
  15. CV基础(图像预处理)
  16. (蓝桥杯嵌入式)LED模块
  17. 小飞鱼 通达OA二次开发网络课程 系列视频课程在CSDN发布
  18. MBA-day10数学-浓度问题
  19. java代码中如何嵌入c语言,Android中Java代码与C的互相调用(JNI的简单使用)
  20. Linux Shell脚本攻略-玩转xargs

热门文章

  1. 【Kubernetes】Pod数据存储
  2. [050] 微信公众平台开发入门视频教程已发布
  3. android 动画格式下载,安卓p过渡动画文件下载
  4. html5调用摄像头录制视频,HTML5——利用navigator+Video调用摄像头进行录像
  5. 体验Linux USB 驱动
  6. office安装时显示已有32位的,无法安装64位
  7. linux怎么验证tacacs认证,使用TACACS(Cisco ACS)验证Linux sshd
  8. springboot中使用模板⽅法设计模式-设计模块(六)
  9. 调用webapi接口的实现
  10. C#winform调用接口实例