Codeforces Round #789 (Div. 2)
A. Tokitsukaze and All Zero Sequence
题意
Tokitsukaze 有一个长度为 n 的序列 a。 对于每个操作,她选择两个数字 ai 和 aj (i≠j; 1≤i,j≤n)。
如果 ai=aj,则将其中之一更改为 0,否则将它们都更改为 min(ai,aj)。
Tokitsukaze 想知道将序列中的所有数字变为 0 的最小操作次数。可以证明答案总是存在的。
思路
由题意可知
如果 a 中含有 0 只要把所以非零数和 0 进行比较就可以了,需要操作的次数为非 0 数的个数。
如果 a 中没有 0 但是有两个相同的数,操作数为 n
如果 a 中没有相同的数,操作数为 n+1
代码
#include <bits/stdc++.h>
using namespace std; void solve()
{
int n;
cin >> n;
map<int, int> ma;
for (int i = 1; i <= n; i++)
{
int a;
cin >> a;
ma[a]++;
}
if (ma[0] > 0)
{
cout << n - ma[0] << endl;
return;
}
for (auto x : ma)
{
if (x.second >= 2)
{
cout << n << endl;
return ;
}
}
cout << n + 1 << endl;
} int main()
{
int t;
cin >> t;
while (t--)
{
solve();
}
return 0;
}
B1. Tokitsukaze and Good 01-String (easy version)
题意
这是问题的简单版本。两个版本之间的唯一区别是,较难的版本额外要求最小数量的子段。
Tokitsukaze 有一个二进制字符串s长度n,仅由0和1组成,n是偶数。
现在Tokitsukaze s成最小数量的连续子段,并且对于每个子段,每个子段中的所有数都是相同的。之后,s如果所有子段的长度都是偶数,则认为是好的。
例如,如果ss为“ 11001111 ”,将分为“ 11 ”、“ 00 ”和“ 1111 ”。它们的长度是2,2,4分别是偶数,所以“ 11001111 ”是好的。
另一个例子,如果s为“ 1110011000 ”,将分为“ 111 ”、“ 00 ”、“ 11 ”和“ 000 ”,它们的长度分别为3,2,2,3. 显然,“ 1110011000 ”不好。
Tokitsukaze 想使s改变一些位置的值. 具体来说,她可以执行任意次数的操作:改变 si 为“ 0 ”或“ 1 ”(1≤i≤n)。
你能告诉她最少的修改次数吗?
思路
因为字段长度都为偶数,因此我们可以每次判断2位,这2位必须为相同的数。
我们只要记录有几个不同的就是要修改的次数。
代码
#include <bits/stdc++.h>
using namespace std; void solve()
{
int n;
string s;
cin >> n >> s;
int cnt = 0;
for (int i = 0; i < n; i = i + 2)
{
if (s[i] != s[i + 1])
cnt++;
}
cout << cnt << endl;
} int main()
{
int t;
cin >> t;
while (t--)
{
solve();
}
return 0;
}
B2. Tokitsukaze and Good 01-String (hard version)
题意
这是问题的困难版本。两个版本之间的唯一区别是,较难的版本额外要求最小数量的子段。
Tokitsukaze 有一个二进制字符串s长度n,仅由0和1组成,n是偶数。
现在Tokitsukaze s成最小数量的连续子段,并且对于每个子段,每个子段中的所有数都是相同的。之后,s如果所有子段的长度都是偶数,则认为是好的。
例如,如果ss为“ 11001111 ”,将分为“ 11 ”、“ 00 ”和“ 1111 ”。它们的长度是2,2,4分别是偶数,所以“ 11001111 ”是好的。
另一个例子,如果s为“ 1110011000 ”,将分为“ 111 ”、“ 00 ”、“ 11 ”和“ 000 ”,它们的长度分别为3,2,2,3. 显然,“ 1110011000 ”不好。
Tokitsukaze 想使s改变一些位置的值. 具体来说,她可以执行任意次数的操作:改变 si 为“ 0 ”或“ 1 ”(1≤i≤n)。
你能告诉她最少的修改次数吗?同时,她还想知道最小的子段数s可以在所有操作数最少的解决方案中进行划分。
思路
计算次数的方法同上。
我们可以在每次判断2个数不同时对其进行修改,每次都修改成和左边相同。
然后在遍历求字段数。
需要注意的是当开头的两个数不同时我们可以把它们都赋值为1 或 0 ,分别求出子段数再输出最小值。
代码
#include <bits/stdc++.h>
using namespace std; void solve()
{
int n;
string s;
cin >> n >> s;
int cnt = 0;
string s1 = s, s2 = s;
if (s[0] != s[1])
{
cnt = 1;
s1[0] = '0';
s1[1] = '0';
s2[0] = '1';
s2[1] = '1';
for (int i = 2; i < n - 1; i = i + 2)
{
if (s[i] != s[i + 1])
{
cnt++;
if (s1[i - 1] == '1')
{
s1[i] = '1';
s1[i + 1] = '1';
}
else
{
s1[i] = '0';
s1[i + 1] = '0';
}
if (s2[i - 1] == '1')
{
s2[i] = '1';
s2[i + 1] = '1';
}
else
{
s2[i] = '0';
s2[i + 1] = '0';
}
}
}
int a = 0, b = 0;
for (int i = 1; i < n; i++)
{
if (s1[i] != s1[i - 1])
a++;
if (s2[i] != s2[i - 1])
b++;
}
cout << cnt << " " << min(a, b) + 1 << endl;
return;
}
for (int i = 2; i < n - 1; i = i + 2)
{
if (s[i] != s[i + 1])
{
cnt++;
if (s[i - 1] == '1')
{
s[i] = '1';
s[i + 1] = '1';
}
else
{
s[i] = '0';
s[i + 1] = '0';
}
}
}
int a = 0;
for (int i = 1; i < n; i++)
{
if (s[i] != s[i - 1])
a++;
}
cout << cnt << " " << a + 1 << endl;
} int main()
{
int t;
cin >> t;
while (t--)
{
solve();
}
return 0;
}
C. Tokitsukaze and Strange Inequality
题意
给定一个序列 s ,找出 [a,b,c,d](1<=a<b<c<d<=n),满足 的数量。
思路
固定 b 和 c。
每次只需找到 [1,b−1]中小于 的值的数量以及 [c+1,n] 中小于
的数量,相乘之后累加就是答案。
预处理一个前缀和数组 dp[i][j],表示前 i 个中小于等于 j 的数量有多少个。
代码
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 5010;
int T, n, s[N], dp[N][N];
void solve()
{
int n;
cin >> n;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
dp[i][j] = 0;
for (int i = 1; i <= n; i++)
{
cin >> s[i];
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
dp[i][j] += dp[i - 1][j];
}
for (int j = s[i]; j <= n; j++)
dp[i][j]++;
}
ll ans = 0;
for (int i = 2; i <= n - 2; i++)
{
for (int j = i + 1; j <= n - 1; j++)
{
ll a = dp[i - 1][s[j]];
ll b = dp[n][s[i]] - dp[j][s[i]];
ans += a * b;
}
}
cout << ans << endl;
;
}
int main()
{
ios::sync_with_stdio(0);
cin >> T;
while (T--)
{
solve();
}
return 0;
}
Codeforces Round #789 (Div. 2)的更多相关文章
- Codeforces Round #789 (Div. 2) A-C
Codeforces Round #789 (Div. 2) A-C A 题目 https://codeforces.com/problemset/problem/1677/A 题解 思路 知识点:模 ...
- Codeforces Round #366 (Div. 2) ABC
Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...
- Codeforces Round #354 (Div. 2) ABCD
Codeforces Round #354 (Div. 2) Problems # Name A Nicholas and Permutation standard input/out ...
- Codeforces Round #368 (Div. 2)
直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...
- cf之路,1,Codeforces Round #345 (Div. 2)
cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅..... ...
- Codeforces Round #279 (Div. 2) ABCDE
Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems # Name A Team Olympiad standard input/outpu ...
- Codeforces Round #262 (Div. 2) 1003
Codeforces Round #262 (Div. 2) 1003 C. Present time limit per test 2 seconds memory limit per test 2 ...
- Codeforces Round #262 (Div. 2) 1004
Codeforces Round #262 (Div. 2) 1004 D. Little Victor and Set time limit per test 1 second memory lim ...
- Codeforces Round #371 (Div. 1)
A: 题目大意: 在一个multiset中要求支持3种操作: 1.增加一个数 2.删去一个数 3.给出一个01序列,问multiset中有多少这样的数,把它的十进制表示中的奇数改成1,偶数改成0后和给 ...
随机推荐
- python基础练习题(题目 矩阵对角线之和)
day25 --------------------------------------------------------------- 实例038:矩阵对角线之和 题目 求一个3*3矩阵主对角线元 ...
- 关于python中selenium一些知识点
selenium几种元素操纵方法 切换iframe层 #切换至xx iframe层 driver.switch_to.frame("name and id") # 切回主HTML层 ...
- 02稀疏数组(java版本)
1 package com.aixuexi.contact; 2 3 public class SpareArray { 4 public static void main(String[] args ...
- Java多线程——实现
"java多线程的实现--几乎都要和java.lang.Thread打交道" 方式一:继承于Thread类 1.创建一个继承于Thread类的子类 2.重写Thread类的run( ...
- mybatis通用功能代码生成工具
mybatis操作数据库的过程中,如果只考虑单表操作,mapper和dao层基本80%的都是固定的,故而可以使用工具进行生成,文末提供自己编写的工具(基于mysql存储过程):作者其实就是使用(myb ...
- 最新 x86_64 系统调用入口分析 (基于 5.7.0)
最新 x86_64 系统调用入口分析 (基于5.7.0) 整体概览 最近的工作涉及系统调用入口,但网上的一些分析都比较老了,这里把自己的分析过程记录一下,仅供参考. x86_64位系统调用使用 SYS ...
- 1.6 为什么要学Linux,它比Windows好在哪里?
早在 20 世纪 70 年代,UNIX 系统是开源而且免费的,但是在 1979 年时,AT&T 公司宣布了对 UNIX 系统的商业化计划,随之开源软件业转变成了版权式软件产业,源代码被当作商业 ...
- 《Mybatis 手撸专栏》第7章:SQL执行器的定义和实现
作者:小傅哥 博客:https://bugstack.cn - <手写Mybatis系列> 一.前言 为什么,要读框架源码? 因为手里的业务工程代码太拉胯了!通常作为业务研发,所开发出来的 ...
- Java SPI 和 API,傻傻分不清?
最近新写了一个中间件「运行时动态日志等级开关」,其中使用Java SPI机制实现了自定义配置中心,保证良好的扩展性. 项目地址,走过路过可以点个star :)https://github.com/sa ...
- Docker容器的安装和使用
Docker容器的安装和使用 安装: curl -fsSL https://get.docker.com | bash -s docker --mirror Aliyun 或国内:curl -sSL ...