Codeforces Round #789 (Div. 2)题解
Codeforces Round #789 (Div. 2)题解
A. Tokitsukaze and All Zero Sequence
原题链接
算法标签 贪心 排序
思路
情况一:数组存在零 → \rightarrow →非零数与其进行一次运算 → \rightarrow →答案即为非零个数
情况二:数组不存在零但存在相同数字 → \rightarrow →相同数字进行一次运算产生零 → \rightarrow →非零数与其进行一次运算 → \rightarrow →答案即为情况一+1
情况三:数组不存在零且不存在相同数字 → \rightarrow →不同数字进行一次运算产生相同数字 → \rightarrow →相同数字进行一次运算产生零 → \rightarrow →非零数与其进行一次运算 → \rightarrow →答案即为情况二+1
未初始化b数组,WA了一发
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 105;
int a[N],b[N];
signed main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t;cin>>t;while(t--){int n;cin>>n;int cnt=0,ch=0;memset(b,0, sizeof b);for(int i=0;i<n;++i){cin>>a[i];if(!a[i]){cnt++;}b[a[i]]++;if(b[a[i]]==2){ch=1;}}sort(a,a+n);if(cnt){cout<<n-cnt;}else if(ch){cout<<n;}else{cout<<n+1;}cout<<"\n";}return 0;
}
B1. Tokitsukaze and Good 01-String (easy version
原题链接
算法标签 贪心 模拟
思路
进行字符串模拟,如果当前需处理字符串长度为奇数且该字符与上一个字符不一致,则更改该字符,使其与上一个字符一致。统计更改次数即为答案。
提交滴代码好冗余
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 105;
int a[N],b[N];
// 代码过于冗余
//string check(string s){
// int l=1;
// int left=1;
// int cnt=0;
// for(int i=left;i<s.size();++i){
// if(l%2&&s[i]!=s[i-1]){
// i=left;
// s[i]=s[i-1];
// l=1;
// cnt++;
// left=i+2;
// }
// }
// return s;
//}
//int solve(string s, string s1){
// int cnt=0;
// for(int i=0;i<s.size();++i){
// if(s[i]!=s1[i]){
// cnt++;
// }
// }
// return cnt;
//}
// 稍作简化
int check(string s){int l=1;int left=1;int cnt=0;for(int i=left;i<s.size();++i){if(l%2&&s[i]!=s[i-1]){cnt++;i=left;s[i]=s[i-1];l=1;cnt++;left=i+2;}}return cnt;
}
signed main(){ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int t;cin>>t;
; while(t--){string s;int n;cin>>n;cin>>s;//cout<<solve(check(s),s);//cout<<"\n";cout<<check(s)<<"\n";}return 0;
}
B2. Tokitsukaze and Good 01-String (hard version)
原题链接
算法标签 贪心 模拟 字符串前缀 DP
思路
考虑从前向后的递推,可以发现对于前面已经维护好的前缀一定以"00"或"11"结尾,所以需要将每一个划分出来的
二元组转换成"00"或"11",通过枚举当前二元组变化成"00","11"的代价,在DP的过程中维护改变次数最少的情况
下,尽可能的使得当前串与前缀子段的结尾一致。
不会呀
代码
#include<bits/stdc++.h>
using namespace std;
int main(){int t;cin>>t;while(t--){int n;string s;cin>>n>>s;int ans=0, cnt=0;int L=-1;for(int i=0; i<n; i+=2){if(s[i]!=s[i+1]) ans++;else{if(L!=s[i]) cnt++, L=s[i];}}cout<<ans<<" "<<max(cnt, 1)<<endl;}return 0;
}
C. Tokitsukaze and Strange Inequality
原题链接
题意
给定一个长度为 n(n<=5000) 的数组p ,问有多少个4元组 (a, b, c, d) 满足 p[a]<p[b] 且 p[b]>p[d] 。
算法标签 贪心 模拟
思路
枚举 b,c → \rightarrow →在 [1, b-1] 中小于p[c] 的个数,和在 [c+1, n] 中小于 p[b] 的个数 → \rightarrow →区间小于等于k的个数,离线加树状数组(复杂度为O(n^2logn)) → \rightarrow →预处理出pre[i][j]为区间 [1, i] 中小于等于j的个数。
哎 B2都不会
代码
void slove() {cin >> n;for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)pre[i][j] = 0;for (int i = 1; i <= n; i++)cin >> p[i];for (int i = 1; i <= n; i++) {for (int j = 1; j <= n; j++)pre[i][j] += pre[i - 1][j];for (int j = p[i]; j <= n; j++)pre[i][j]++;}int ans = 0;for (int b = 1; b <= n; b++) {for (int c = b + 1; c <= n; c++) {ans += pre[b - 1][p[c] - 1] * (pre[n][p[b]] - pre[c][p[b]]);}}cout << ans << endl;
}
D. Tokitsukaze and Meeting
原题链接
题意
这里有一个 n*m 的格子,有 [公式] 的同学会从左上角进入,按照下面的方式。
每个同学都有个属性, 0/1 ,每次进入一个学生后,问有多少行和多少列至少包含一个为 1 的学生。
样例
2 2
1100
输出
2 3 4 3
算法标签 思维 枚举
思路
行列分开讨论 → \rightarrow →对于行, row[i] 为第 i 个学生进来时的答案(为了取模方便,学生的下标从0开始,下同row[i] 的答案可以由 row[i-m] 的答案变过来。 → \rightarrow →若最近 m 个学生里面有一个是1,答案加1 → \rightarrow →对于列,当插入一个学生后,等效为, 1, n-1 列向右移动。第 n 列提到前面。 → \rightarrow → col[m] 来记录提到前面来的情况,如果新插入的学生是1且提到前面来的列里面没有1,答案加1。 → \rightarrow →累加求和即为答案
哎 B2都不会
代码
void slove() {cin >> n >> m;vector<int>col(m, 0); vector<int>row(n*m, 0); vector<int>ans(n*m, 0);cin >> s;int t = 0;for (int i = 0; i < n*m; i++) {if (s[i] == '1') {if (col[i%m] == 0) {col[i%m] = 1;t++;}}ans[i] += t;}int last = -1;for (int i = 0; i < n*m; i++) {if (s[i] == '1')last = i;if (i < m) {if (last != -1)row[i] = 1;}else {if (i - last < m)row[i] = row[i - m] + 1;else row[i] = row[i - m];}ans[i] += row[i];}for (int i = 0; i < n*m; i++)cout << ans[i] << " ";cout << endl;
}
E. Tokitsukaze and Two Colorful Tapes
原题链接
题意
给定两个排列 a[], b[] ,你可以构造任意一个排列 p[] ,使得 a[i] = p[a[i]] , b[i] = p[b[i]]。使得 ∑ \sum ∑ |a[i] - b[i]|最大。输出最大值。
算法标签 图论 DFS 贪心 数学
思路
以样例为例
从图的角度, 理解 ∑ \sum ∑ |a[i] - b[i]| 。 → \rightarrow →建图 a[i] ↔ \leftrightarrow ↔b[i], → \rightarrow →答案即为环上相邻两个数差的绝对值之和
哎 B2都不会
注意
如果有环,我们一定可以构造一个 p[] ,使得环变为任意样子。
可理解为 p[] = named[] ,把环上的数进行重命名
只需为所有的环赋值即可。
如果环的长度为1,不会产生任何贡献。
若为偶数环,我们可以按照最大值,最小值交替来给环赋值(贪心,确保差值最大)。
for (int i = 0; i < c.size(); i++) {if (i % 2 == 0)v.push_back(mx--);else v.push_back(mi++);
}
若为奇数环,最后一个点无论如何赋值,不会改变其贡献。故奇数环的最后一个值无需放置,保留最大值和最小值。
因此,环的贡献函数:
int cal() {if (c.size() == 1)return 0;vector<int>v;for (int i = 0; i < c.size() - c.size() % 2; i++) {if (i % 2 == 0)v.push_back(mx--);else v.push_back(mi++);}int res = 0;for (int i = 1; i < v.size(); i++)res += abs(v[i] - v[i - 1]);res += abs(v.back() - v[0]);return res;
}
遍历所有环,累加即为答案。
代码
int n, a[MAXN], b[MAXN], to[MAXN];
bool vis[MAXN];
vector<int>c;
int mi, mx;
void dfs(int u) {if (vis[u])return;vis[u] = 1;c.push_back(u);dfs(to[u]);
}
int cal() {if (c.size() == 1)return 0;vector<int>v;for (int i = 0; i < c.size() - c.size() % 2; i++) {if (i % 2 == 0)v.push_back(mx--);else v.push_back(mi++);}int res = 0;for (int i = 1; i < v.size(); i++)res += abs(v[i] - v[i - 1]);res += abs(v.back() - v[0]);return res;
}
void slove() {cin >> n;for (int i = 1; i <= n; i++)vis[i] = 0;mi = 1, mx = n;for (int i = 1; i <= n; i++)cin >> a[i];for (int i = 1; i <= n; i++)cin >> b[i], to[a[i]] = b[i];int ans = 0;for (int i = 1; i <= n; i++) {if (!vis[i]) {c.clear();dfs(i);ans += cal();}}cout << ans << endl;
}
战绩
战果
呜呜呜 掉了9分
C-E主要借鉴该知乎
原创不易 转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈
Codeforces Round #789 (Div. 2)题解相关推荐
- Codeforces Round #514 (Div. 2)题解
Codeforces Round #514 (Div. 2)题解 A 喵,直接模拟. B 枚举所有盖章时的,合法的,左上角的位置.能盖的话就盖一下.最后check一下图案是否相等即可 C 一轮一轮的扔 ...
- Codeforces Round #182 (Div. 1)题解【ABCD】
Codeforces Round #182 (Div. 1)题解 A题:Yaroslav and Sequence1 题意: 给你\(2*n+1\)个元素,你每次可以进行无数种操作,每次操作必须选择其 ...
- 【算法题解】Codeforces Round #817 (Div. 4)题解
文章目录 Codeforces Round #817 (Div. 4)题解 A. Spell Check B. Colourblindness C. Word Game D. Line E. Coun ...
- Codeforces Round #747 (Div. 2)题解
Codeforces Round #747 (Div. 2)题解 (本博客将持续更新以后每场CF div2的题解,喜欢ACM.OI的小伙伴记得点个关注哟) 昨天夜晚刷网络流刷入迷了,渐渐就忘记了我还要 ...
- Codeforces Round #748 (Div. 3) 题解 完整A~G
Codeforces Round #748 (Div. 3) 题解 A. Elections 题意 已知竞选中三个候选人的当前得票数 a , b , c a,b,c a,b,c,现在可以增加任何一个人 ...
- Codeforces Round #533 (Div. 2)题解
link orz olinr AK Codeforces Round #533 (Div. 2) 中文水平和英文水平都太渣..翻译不准确见谅 T1.给定n<=1000个整数,你需要钦定一个值t, ...
- Codeforces Round #734 (Div. 3) 题解
Hello大家好,今天给大家带来的是 Codeforces Round #734 (Div. 3) 的全题目讲解. 本文链接:https://www.lanqiao.cn/questions/2040 ...
- Codeforces Round #462 (Div. 2)题解
Codeforces Round #462 (Div. 2) B题--我固执的认为1e18是18位数,导致被hack,花了20分钟才检查出这个错误,很僵硬 Codeforces 934C 题意 给定一 ...
- Codeforces Round #441 Div. 2题解
A.直接判断相邻的边是不是最短边 是就来回走 不然就走一条第二的然后再来回走 #include<cstdio> #include<cstring> #include<al ...
最新文章
- BZOJ 2337: [HNOI2011]XOR和路径( 高斯消元 )
- cmakelist 定义变量
- 啊啊啊...每次需求评审总被boss虐成狗?解药来了
- Java-二分查找算法
- 单片机点灯不难,但你会网页点灯吗?
- Python:递归输出斐波那契数列
- 虚拟机下ubuntu10.04挂载NFS
- Glib2:error: Installed (but unpackaged) files found(七)
- Go打印函数名/文件名/行号
- iOS简单实现查看更多/收起的效果
- 【优化求解】基于matalb改进的遗传算法求解IGA城市交通信号优化问题【含Matlab源码 215期】
- matlab 数字全息图,基于MATLAB的数字全息成像仿真研究
- 软件项目运维内容 软件系统运维工作内容
- 【shell】数值加减乘除|字符串转换成数字|提取数字字母小数
- 计算机毕设(附源码)JAVA-SSM基于java学科竞赛管理系统
- Pyecharts--第一个培训数据dashboard(不太完美)
- 数学:它的内容、方法、意义的目录
- iris鸢尾花数据集最全数据分析写在前面本文介绍数据预处理
- shell一键生成密钥脚本
- 【Qt】Qt 官方下载网址
热门文章
- 畅想 Serverless 新托管时代,2020 年迎来哪些新机会?
- win7 / win10 装Ubuntu16.04双系统
- 如何引爆用户增长:驱动用户增长的7大战略要素
- 数据分析项目实战之淘宝女装店铺销售分析(一)数据获取篇
- 即构SDK支持对焦、变焦、曝光调整,让直播细节清晰呈现
- DesignPattern - 装饰器模式【结构型】
- 仲裁法院开庭:质证思路与如何进行开庭
- 芯片|紫光国微拟对参股子公司紫光同创增资 后者从事商用FPGA相关业务
- 视频截图Failed to execute ‘toDataURL‘ on ‘HTMLCanvasElement‘: Tainted canvas处理
- Delphi调用腾讯云最新签名方法v3 TC3-HMAC-SHA256发送短信