HZNU Winter Trainning 7 补题 - Zeoy
CodeForces - 1660C
题目传送门:https://vjudge.net/contest/535955#problem/C
题意:询问一个字符串最少删去几个字符,能够把这个字符串变成aabbccdd这种两两相同的字符串
题解:我们来一个样例:aabbdabbdccc,就这个样例我们可以从前往后遍历,如果map发现一个字符出现了两次,那就说明这个字符我们不需要删去,我们只需要删去map中除了这个字符的所有字符即可,或者我们可以倒着想,我们用字符串长度ans减去2即可,最后的ans一定代表现在需要删去的字符数量,我们能够去实践出这种删除方法一定是最贪的,就这个样例而言,ans=12,aa ans-=2;bb ans-=2;dabb ans-=2;dcc ans-=2;c;最终ans=4。
点击查看代码
#include <bits/stdc++.h>
#define Zeoy std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0)
#define all(x) (x).begin(), (x).end()
#define endl '\n'
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
const int inf = 0x3f3f3f3f;
map<char, int> mp;
int main(void)
{
Zeoy;
int t;
cin >> t;
while (t--)
{
mp.clear();
string s;
cin >> s;
int n = s.length();
s = "*" + s;
int ans = n;
for (int i = 1; i <= n; ++i)
{
if (mp[s[i]] == 0)
mp[s[i]]++;
else
{
ans -= 2;
mp.clear();
}
}
cout << ans << endl;
}
return 0;
}
CodeForces - 1660D
题目传送门:https://vjudge.net/contest/535955#problem/D
题意:给你一个数组a,里面的元素ai∈[-2,2],让你求数组首尾各删掉多少个元素,能够得到最大的数组各元素之积,并规定空数组值为1
题解:我们可以想一想对于一个数组中的0来说,我们去乘0没有意义,不管怎么都还是0,所以实际上0其实是分界线,我们把一个数组通过0分成几段,然后我们对每段进行处理,但是注意n的范围:1≤n≤2e5,说明如果我们把乘积乘出来一定会爆long long,所以我们决定把幂次记录,因为只有±1和±2的存在,对于每段数组大小我们用±2的数量记录,同时我们也要去记录元素<0的数量,所以一定会出现两种情况:
1.这一段积本身>0:也就是说小于0的元素的个数是偶数,那么这就是答案,我们不需要处理,再怎么处理,积的大小只会减小;
2.这一段积本身<0:也就是说小于0的元素的个数是奇数,那么我们需要找到从左边找的第一个负数和从右边找起的第一个负数,比较删去哪一个会使积更大
每一次求出来的积,我们还需要和ans比较,取大者,并记录左区间l和右区间r,最后输出即可。
`
点击查看代码
#include <bits/stdc++.h>
#define Zeoy std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0)
#define all(x) (x).begin(), (x).end()
#define endl '\n'
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
const int inf = 0x3f3f3f3f;
int main(void)
{
Zeoy;
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
vector<int> a(n + 2), pre1(n + 2), pre2(n + 2);
for (int i = 1; i <= n; ++i)
{
cin >> a[i];
pre1[i] = pre1[i - 1] + (abs(a[i]) == 2); //前缀和记录±2的个数
pre2[i] = pre2[i - 1] + (a[i] < 0); //前缀和记录负数的个数
}
a.push_back(0); //保证最后一段能够被处理
vector<int> v;
int ans = -inf; //代表区间中±2最多的个数,即幂次
int l, r;
for (int i = 1; i <= n + 1; ++i)
{
if (a[i] != 0) //将各段分割在v中
v.push_back(i); //一个细节:将下标存在v中
else
{
int k = v.size();
if (k == 0)
continue;
int cnt = pre2[v[k - 1]] - pre2[v[0] - 1]; //求负数的个数
// cout << cnt << endl;
if (cnt % 2 == 0) //负数个数是偶数的情况,本身就是答案
{
if (pre1[v[k - 1]] - pre1[v[0] - 1] > ans)
{
ans = pre1[v[k - 1]] - pre1[v[0] - 1];
l = v[0];
r = v[k - 1];
}
}
else //负数个数是奇数的情况,我们找左边和右边第一个负数
{
int ii = -1, jj = -1;
for (int i = 0; i < k; ++i)
{
if (a[v[i]] < 0)
{
ii = i;
break;
}
}
for (int i = k - 1; i >= 0; --i)
{
if (a[v[i]] < 0)
{
jj = i;
break;
}
}
if (pre1[v[k - 1]] - pre1[v[ii]] > ans)
{
ans = pre1[v[k - 1]] - pre1[v[ii]];
l = v[ii] + 1;
r = v[k - 1];
}
if (pre1[v[jj] - 1] - pre1[v[0] - 1] > ans)
{
ans = pre1[v[jj] - 1] - pre1[v[0] - 1];
l = v[0];
r = v[jj] - 1;
}
}
v.clear(); //别忘记清空容器
}
}
if (ans < 1) //别忘记空数组=1,如果没有±2,我们直接将数组删完
{
cout << "0 " << n << endl;
}
else
{
cout << l - 1 << " " << n - r << endl;
}
}
return 0;
}
`
CodeForces - 1660E
题目传送门:https://vjudge.net/contest/535955#problem/E
题意:给你一个只有0和1的矩阵,你可以进行两种操作,一种是将矩阵上下左右滚动,类似环,这种操作没有花费;另一种是可以将任意元素反转,
1->0,0->1,这种操作每一花费为1,让你用最小花费将矩阵变为单位阵。
题解:我们很容易能求出将矩阵变为单位阵的花费:矩阵所有元素个数-对角线上1的个数-非对角线上0的个数=nn-n-num0-2y,y代表对角线上1的个数,我们发现想要使得花费最小,因为n和num0是一定的,所以我们只要使得对角线上的1最多即可,那么对于这一个可以滚动的类似环的操作我们该怎么去求

或者我们再拼三个一样的矩阵

本质没有区别
点击查看代码
#include <bits/stdc++.h>
#define Zeoy std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0)
#define all(x) (x).begin(), (x).end()
#define endl '\n'
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
const int inf = 0x3f3f3f3f;
char g[2010][2010] = {0};
int main(void)
{
Zeoy;
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
ll cnt0 = 0;
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= n; ++j)
{
cin >> g[i][j];
if (g[i][j] == '0')
cnt0++;
}
}
int ans = 0;
for (int k = 1; k <= n; ++k)
{
int sum = 0;
int j = k;
for (int i = 1; i <= n; ++i)
{
sum += g[i][j] - '0';
j = j % n + 1;
}
ans = max(sum, ans);
}
cout << n * n - ans - (cnt0 - (n - ans)) << endl;
}
return 0;
}
点击查看代码
#include <bits/stdc++.h>
#define Zeoy std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0)
#define all(x) (x).begin(), (x).end()
#define endl '\n'
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
const int inf = 0x3f3f3f3f;
char g[4025][4025] = {0};
int main(void)
{
Zeoy;
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
int num0 = 0;
for (int i = 1; i <= n; ++i)
{
for (int j = 1; j <= n; ++j)
{
cin >> g[i][j];
g[i + n][j] = g[i][j];
g[i][j + n] = g[i][j];
g[i + n][j + n] = g[i][j];
if (g[i][j] == '0')
num0++;
}
}
int y = 0;
for (int k = 1; k <= n; ++k)
{
int cnt = 0;
int j = k;
for (int i = 1; i <= n; ++i)
{
if (g[i][j] == '1')
cnt++;
j++;
}
y = max(cnt, y);
}
cout << n * n + n - num0 - 2 * y << endl;
}
return 0;
}
CodeForces - 1660F1
题目传送门:https://vjudge.net/contest/535955#problem/F
题意:一个字符串只由+-号组成,长度为n,定义+和-数量相同的字符串叫做平衡字符串,先给你一个字符串,你可以进行这样的操作:将相邻两个-变为+,操作数量不限,让你求这个字符串中有多少个子集,能够通过这样的操作变为平衡字符串。1≤n≤3000,1<=t<=500
题解:直接给出规律,y代表-的个数,x代表+的个数,如果(y-x)%3==0 && y>=x,就代表它可以构成平衡字符串,因为n<3000,我们直接前缀和O(n*n)枚举
点击查看代码
#include <bits/stdc++.h>
#define Zeoy std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0)
#define all(x) (x).begin(), (x).end()
#define endl '\n'
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int mod = 1e9 + 7;
const int N = 2e5 + 10;
const int inf = 0x3f3f3f3f;
int prez[3010] = {0};
int pref[3010] = {0};
int main(void)
{
Zeoy;
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
string s;
cin >> s;
s = "*" + s;
for (int i = 1; i <= n; ++i)
{
prez[i] = prez[i - 1] + (s[i] == '+');
pref[i] = pref[i - 1] + (s[i] == '-');
}
int ans = 0;
for (int i = n; i >= 2; --i)
{
for (int j = 0; j < i; ++j)
{
int x = prez[i] - prez[j];
int y = pref[i] - pref[j];
if ((y - x) % 3 == 0 && y >= x)
{
ans++;
}
}
}
cout << ans << endl;
}
return 0;
}
CodeForces - 1660F2
题目传送门:https://vjudge.net/contest/535955#problem/G
题意:上题hard版,1≤n≤2e5,1≤t≤1e4
题解:待补
HZNU Winter Trainning 7 补题 - Zeoy的更多相关文章
- hdu5017:补题系列之西安网络赛1011
补题系列之西安网络赛1011 题目大意:给定一个椭球: 求它到原点的最短距离. 思路: 对于一个椭球的标准方程 x^2/a^2 + y^2/b^2 +z^2/c^2=1 来说,它到原点的最短距离即为m ...
- 2017河工大校赛补题CGH and 赛后小结
网页设计课上实在无聊,便开始补题,发现比赛时候僵着的东西突然相通了不少 首先,"追妹"这题,两个队友讨论半天,分好多种情况最后放弃(可是我连题目都没看啊),今天看了之后试试是不是直 ...
- 2018 HDU多校第四场赛后补题
2018 HDU多校第四场赛后补题 自己学校出的毒瘤场..吃枣药丸 hdu中的题号是6332 - 6343. K. Expression in Memories 题意: 判断一个简化版的算术表达式是否 ...
- 2018 HDU多校第三场赛后补题
2018 HDU多校第三场赛后补题 从易到难来写吧,其中题意有些直接摘了Claris的,数据范围是就不标了. 如果需要可以去hdu题库里找.题号是6319 - 6331. L. Visual Cube ...
- [数]补题ver.
上次补题好像把两次训练混在一起了,总之先按时间顺序补完这一次|ू・ω・` ) HDU-6301 不会的东西不能逃避.jpg 红小豆非常讨厌构造题,因为非常不会,并且非常逃避学习这类题,因为总也搞不清楚 ...
- 4.30-5.1cf补题
//yy:拒绝转载!!! 悄悄告诉你,做题累了,去打两把斗地主就能恢复了喔~~~ //yy:可是我不会斗地主吖("'▽'") ~~~那就听两遍小苹果嘛~~~ 五一假期除了花时间建模 ...
- ICPC南京补题
由于缺的题目比较多,竟然高达3题,所以再写一篇补题的博客 Lpl and Energy-saving Lamps During tea-drinking, princess, amongst othe ...
- 2018 CCPC 桂林站(upc复现赛)补题
2018 CCPC 桂林站(upc复现赛)补题 G.Greatest Common Divisor(思维) 求相邻数的差值的gcd,对gcd分解素因子,对所有的素因子做一次遍历,找出最小答案. 几个样 ...
- 【cf补题记录】Codeforces Round #608 (Div. 2)
比赛传送门 再次改下写博客的格式,以锻炼自己码字能力 A. Suits 题意:有四种材料,第一套西装需要 \(a\).\(d\) 各一件,卖 \(e\) 块:第二套西装需要 \(b\).\(c\).\ ...
- 【cf补题记录】Codeforces Round #607 (Div. 2)
比赛传送门 这里推荐一位dalao的博客-- https://www.cnblogs.com/KisekiPurin2019/ A:字符串 B:贪心 A // https://codeforces.c ...
随机推荐
- InfoTS: 具有信息感知增强的时间序列对比学习《Time Series Contrastive Learning with Information-Aware Augmentations》(对比学习、信息感知增强、高保真、多样性、信息论-信息瓶颈、元学习器)(没看懂,还需要再回顾)
现在是2024年5月23日,14:30,开始看论文. 论文:Time Series Contrastive Learning with Information-Aware Augmentations ...
- C++面试题整理 2
8. C++11新特性又哪些 自动类型推导auto,智能指指针(share_ptr,unique_ptr等),for循环简化,线程相关的(std::thread/std::mutex),空指针null ...
- Kubernetes Deployment控制器(二十)
前面我们学习了 ReplicaSet 控制器,了解到该控制器是用来维护集群中运行的 Pod 数量的,但是往往在实际操作的时候,我们反而不会去直接使用 RS,而是会使用更上层的控制器,比如我们今天要学习 ...
- SURF (Speeded Up Robust Features,加速稳健特征)
本篇文章来自wikipedia,如果需要阅读英文,可以去看一下. SURF (Speeded Up Robust Features, 加速稳健特征) 是一个稳健的图像识别和描述算法,首先于2006年发 ...
- 墨天轮专访星环科技刘熙:“向量热”背后的冷思考,Hippo如何打造“先发”优势?
导读: 深耕技术研发数十载,坚持自主可控发展路.星环科技一路砥砺前行.坚持创新为先,建设了全面的产品矩阵,并于2022年作为首个独立基础软件产品公司成功上市.星环科技在今年的向星力•未来技术大会上发布 ...
- 从浏览器输入url到回车发生了什么
1. 域名解析,即把域名解析成以为唯一的ip ps:ip是每个网站的对应的一个key,域名是为了语义化,方便使用而设计的 : ps:第一次域名解析需要花费较长的时间,所以一般第一次解析就会把DNS解析 ...
- go frame资源管理打包失败
最近有个需求,需要使用golang做一个小工具,然后我就想既然是小工具,那就把前后端放在一个二进制文件中.恰好使用的项目架构是go frame,它已经提供了这样的能力,但是没想到碰到了一鼻子灰... ...
- NOI 2024
Day1 T1 集合(set) 容易发现两个序列等价当且仅当,所有数字在序列中出现位置的集合构成集族相等. 考虑哈希,对于一个集合 \(S\),令它的哈希值为 \(f(S) = (\sum\limit ...
- OpenGL RHI优化
前言 随着Vulkan的普及,OpenGL已经在被慢慢淘汰,更轻的API调用可以节省不少性能,尤其是在移动平台上,可以减少CPU开销,进而减少功耗.看起来很完美,但是问题是目前移动平台Vulkan驱动 ...
- 云原生周刊:OpenTofu Registry 获得用户界面和 API|2024.9.9
开源项目推荐 kubectl trace kubectl trace 是一个 kubectl 插件,它允许你在 Kubernetes 集群中调度执行 bpftrace 程序. Kondense Kon ...