首页 > 其他分享 >Codeforces Round 918 (Div. 4)赛后总结(前缀和)(set部分用法)

Codeforces Round 918 (Div. 4)赛后总结(前缀和)(set部分用法)

时间:2023-12-29 20:56:40浏览次数:31  
标签:set 前缀 int Codeforces 判断 数组 include Round

Codeforces Round 918 (Div. 4)赛后总结

a,b题没啥好说的
c题典中典

没开long long 一回事,还有判断数a是否为完全平方数直接用sqrt(a)\(^2\)=a的判断就可以

d题经典字符串问题

首先,我们以一个字符数组的形式存数据。再根据已知cv,cvc两种形式,我们只需要判断c的时候看v是否有用过(可以给一个变量赋值再判断变量值来判断),有用过就判断它的下一个是c还是v,是c就先输出c再输出'.',是v就先输出'.'在输出c。(注意更新判断是否为v的值)。其他直接输出就可以秒。

#include <iostream>
#include <string>
#include <math.h>
#include <algorithm>
#include <iomanip>
using namespace std;
char a[200001];

int main() {
	int t;
	cin >> t;
	for (int i = 1; i <= t; i++) {
		int n;
		cin >> n;
		int num = 0;
		for (int j = 1; j <= n; j++) {
			cin >> a[j];
		}

		for (int j = 1; j <= n - 1; j++) {
			if (a[j] == 'a' || a[j] == 'e') {
				num = 1;
				cout << a[j];
			} else {
				if (num == 1) {
					if (a[j + 1] == 'a' || a[j + 1] == 'e') {
						cout << "." << a[j];
						num = 0;
					} else {
						cout << a[j] << ".";
						num = 0;
					}
				} else {
					cout << a[j];
				}
			}

		}
		cout << a[ n] << endl;
	}
}

E题典型前缀和问题

前缀和

对于给定数组a,我们另建数组s,s数组表示的是从a数组初下标到目标下标下的求和。

实现

s[i]=s[i-1]+a[i]

对于给定区间和

通过这种方法,我们可以用s[l]-s[r-1] (l>r)表示从下标l到下标r的值的求和。

如何判断区间和为0

如果我们具体知道区间范围和下标直接用上面给的方式判断s[l]-s[r-1]为0.
那如果要判断是否有区间和为0,就可以前缀和数组做判断,如果前缀和数组中的数有重复,那就代表着有部分区间的和为0.

set

意义

set就是集合的意思,集合的特点就是不会出现重复的内容。一般用来作查重去重操作。

定义

set<数据类型>变量名

set成员函数

insert()//插入元素
count()//判断容器中是否存在某个元素
size()//返回容器的尺寸,也可以元素的个数
erase()//删除集合中某个元素
clear()//清空集合
empty()//判断是否为空
begin()//返回第一个节点的迭代器
end()//返回最后一个节点加1的迭代器
rbegin()//反向迭代器
rend()//反向迭代器

解题思路

题目本质就是对于区间是否有子区间和为0的判断

那么我们便可以用到上面所说的方法:用前缀和数组是否用重复来判断。
同时这里可以用set来做查重的操作。

具体

由于题目判断区间奇数和是否等于偶数和。
那么我们可以将每两个数做差为一组再用前缀和思想再判断是否有重复的。(由于划分的不一定是偶数,这里可能有多出来的一个数,我们再对其做单独判断)
同理,我们需要对初始为1和2分别重新遍历。
代码如下

#include <iostream>
#include <string>
#include <math.h>
#include <algorithm>
#include <iomanip>
#include <set>
#define ll long long
using namespace std;
long long a[200005];

int main() {
	int t;
	cin >> t;

	for (int i = 1; i <= t; i++) {

		int n;
		cin >> n;
		bool flag = false;//通过这个来判断是否成立
		ll pre;
		set<ll> s;
		s.insert(0);//0是需要提前插入的,(前缀和可能存在为0情况符合条件但不重复)
		pre = 0;//用前缀和思想遍历数组的值
		for (int j = 1; j <= n; j++) {//以1为初始遍历
			cin >> a[j];
		}
		for (int j = 1; j + 1 <= n; j += 2) {//记得j+1<=n,不然会越界
			pre += a[j] - a[j + 1];
			if (s.count(pre) || j <= n - 2 && s.count(pre + a[j + 2])) {//由于两个为一组,所以对于可能多出来的奇数用j+2判定。
				flag = true;
			}
			s.insert(pre);
		}
		s.clear();//记得清空
		s.insert(0);
		pre = 0;
		for (int j = 2; j + 1 <= n; j += 2) {//以2为初始遍历
			pre += a[j] - a[j + 1];
			if (s.count(pre) || j <= n - 2 && s.count(pre + a[j + 2])) {
				flag = true;
			}
			s.insert(pre);
		}
		if (flag) {
			cout << "YES" << endl;
		} else {
			cout << "NO" << endl;
		}
		s.clear();
	}
}

标签:set,前缀,int,Codeforces,判断,数组,include,Round
From: https://www.cnblogs.com/sdlypsck/p/17935597.html

相关文章

  • Codeforces Round 887 (Div. 1)
    CodeforcesRound887(Div.1)A先来个二分。注意到这样一件事:考虑是\(a_i\)失效的最小时间\(t_i\),发现\(t\)有单调性。所以从大到小考虑\(a\),每次相当于将二分的值减去一个值,复杂度\(O(\sumn(\logn+\logk))\)。codeconstintN=2e5+10;intn;llk;lla......
  • bitset优化传递闭包
    bitset优化传递闭包时间复杂度\(O(\frac{n^3}{w})\)#include<bits/stdc++.h>#defineF(i,l,r)for(inti=l;i<=r;++i)#defineG(i,r,l)for(inti=r;i>=l;--i)#definelllonglongusingnamespacestd;constintN=1005;bitset<N>f[N];intn;intmain......
  • Codeforces Round #843 (Div. 2)
    安利一个叫codeforcesbetter的插件  https://greasyfork.org/zh-CN/scripts/465777-codeforces-better今天装了后使用cf体验非常舒适=====A.GardenerandtheCapybaras(easyversion)问字符串s能否切分成3个字符串a、b、c,且满足a<=b&&c<=b或者b>=a&&b>=cs长度<=100,暴力......
  • 整数除法:floor、ceil、round——《初学C语言第42天》
    //////整数除法——舍小数,取整数//1.floor()头文件<math.h>//功能:把一个小数向下取整,即如果被计算的数是2.2,那向下取整的结果就为2.000000//原型:doublefloor(doubex);//x:是需要计算的数//返回值://   成功:返回一个double类型的数,此数默认有6位小数//   ......
  • P9994 [Ynoi Easy Round 2024] TEST_132 题解
    题解怎么都是用暴力日过去的啊。思路考虑根号分治,设阈值为\(B\)。对于第二维出现次数超过\(B\)的,我们可以在修改时暴力更改,这部分复杂度为\(O(\frac{nm}{B})\)。对于第二维出现次数小于\(B\)的,我们可以在修改是打标记,查询时遍历一遍,这部分的复杂度为\(O(mb)\)。大多数......
  • [Codeforces] CF1538F Interesting Function
    CF1538FInterestingFunction题目传送门题意给定两个正整数\(l,r\)(\(l<r\)),将\(l\)不断加\(1\)直到\(l=r\),求出这一过程中\(l\)发生变化的位数总数。位数变化指:\(l=909\),将\(l+1\)后有\(2\)位数字发生变化。\(l=9\),将\(l+1\)后也有\(2\)位数字发生变......
  • P9991 [Ynoi Easy Round 2023] TEST_107 题解
    思路题目即要求删除区间中的一个或多个颜色。考虑假如枚举删除颜色\(k\)。那么在\(l,r\)中的答案为:\[\max_{i=1}^{m+1}a_i-a_{i-1}\]其中\(a_i\)为颜色\(k\)在\(l\simr\)中的出现位置,\(a_{0}=l,a_{m+1}=r\)。可以分类讨论。答案为\(a_1-l\),那么只需要维护\(......
  • 在 PyCharm 中编写 Vue 项目,你可以按照以下步骤进行: 1. **安装 Vue.js 插件**:在 PyCh
    在PyCharm中编写Vue项目,你可以按照以下步骤进行:1.**安装Vue.js插件**:在PyCharm中,选择`File->Settings…->Plugins`,搜索Vue并点击安装,安装后重启PyCharm¹²。2.**设置JavaScript**:支持Vue语法,选择`File->Settings…->Languages&Frameworks->JavaSc......
  • [python] 基于Dataset库操作数据库
    dataset库是Python中一个用于操作数据库的简单库,它提供了一种简洁的方式与各种关系型数据库进行交互,例如SQLite、MySQL、PostgreSQL等。你可以使用dataset库来执行查询、插入、更新和删除操作,而无需编写复杂的SQL语句。dataset库适用于小规模的数据存储和查询场景,相比csv和json文......
  • codeforces比赛(1):codeforces 918_div4
    A、OddOneOut跳转原题点击此:A题地址1、题目大意  给你三个数,其中两个是相等的,问你还有一个不相等的数是多少。2、题目解析  直接暴力枚举即可,只要找到两个数相等,那么答案就是另一个数。#include<bits/stdc++.h>usingnamespacestd;intT;inta,b,c;voidsol......