首页 > 其他分享 >CF1861C Queries for the Array

CF1861C Queries for the Array

时间:2024-03-24 11:22:43浏览次数:20  
标签:int up down CF1861C 序列 Queries 升序 Array now

CF1861C Queries for the Array

不太一样的写法,感觉比较容易理解一点。码量也比较短。

首先我们要发现:一个序列如果目前是升序的,那么它不管删多少个数(中间不再加数),最终还是升序的;如果目前不是升序,那么不管加多少个数,最终也不是升序。

这启发我们用两个数组 \(up_i\) 和 \(down_i\) 记录当前长度为 \(i\) 的序列是升序还是不是升序。如果存在一个时刻序列长度为 \(i\),并且 \(up_i\) 和 \(down_i\) 都是 \(1\),也就是既是升序也不是升序,那么就不合法。(情况1)

不合法的情况还有一种,就是当序列长度小于等于 \(1\) 时,操作序列说此时不是升序,那么根据题意,也是不合法的。(情况2)

\(up\) 和 \(down\) 的转移非常简单,如果长度 \(now\) 减 \(1\),并且 \(up_{now}=1\),那么 \(up_{now-1}=up_{now}\),同时把 \(up_{now}=down_{now}=0\),表示未知;如果长度 \(now\) 加 \(1\),那么只需要转移 \(down_{now+1}=down_{now}\)。

所以这题我们只需要发现上面的性质就好写了,虽然比别人多个数组来做有点蠢。

AC code:

#include <bits/stdc++.h>
typedef long long ll;
int read() {
	int x = 0, f = 1;
	char c = getchar();
	while(!isdigit(c)) {
		if(c == '-') f = -1;
		c = getchar();
	}
	while(isdigit(c)) {
		x = (x << 3) + (x << 1) + (c - '0');
		c = getchar();
	}
	return x * f;
}
int t;
char a[200010];
int up[200010], down[200010];
void Solve() {
	t = read();
	while(t--) {
		std::cin >> a + 1;
		int n = strlen(a + 1), now = 0;
		bool flg = 0;
		memset(up, 0, sizeof(up));
		memset(down, 0, sizeof(down)); //这样初始化没有 tle 有点神奇。
		for(int i = 1; i <= n; i++) {
			if(a[i] == '+' || a[i] == '-') {
				if(a[i] == '+') {
					down[now + 1] = down[now];
					now++;
				}
				else {
					down[now] = 0;
					if(up[now]) up[now - 1] = up[now]; //注意判断,因为这个调了好久qwq
					up[now] = 0;
					now--;
				}
			}
			else {
				if(now <= 1 && a[i] == '0') flg = 1; //情况2
				if(a[i] == '1') up[now] = 1;
				else down[now] = 1; //根据操作序列更新数组
				if(up[now] && down[now]) flg = 1; //情况1
			}
		}
		if(flg) std::cout << "NO\n";
		else std::cout << "YES\n";
	}
}

int main() {
	
	Solve();

	return 0;
}

标签:int,up,down,CF1861C,序列,Queries,升序,Array,now
From: https://www.cnblogs.com/FireRaku/p/18092166

相关文章

  • CF718C Sasha and Array
    SashaandArray典题,但还是第一次见。首先看到斐波那契数列,可以想到矩阵快速幂。想到这一点之后,很大一部分都解决了。对于修改操作,实际上就是乘以一个矩阵。对于查询,就是矩阵加法。考虑用线段树维护矩阵。首先区间和可以矩阵加法直接做。由于我们需要区间乘,需要考虑如何下传标......
  • Arrays简单的使用方法
    数组packagemethod;importjava.util.Arrays;publicclassArrayDemo04{publicstaticvoidmain(String[]args){int[]a={1,2,15,47,56,22,222,11,4,4455};//Arrays.sort(a);//排序:升序Arrays.fill(a,2,4,0);//从2-4被0填充,fill填充......
  • Java学习笔记:ArrayList集合
    目录为什么要有集合:解决数组自动扩容的问题Java、python数据类型对比Java支持的数据类型主要分为两大类:Python支持多种数据类型,主要包括以下几种:在Java中常见的数据类型实现方式:Java通过使用集合框架来解决一组数据的存储和管理Java集合大致也可分成List、Set、Queue、Map四种接口......
  • ArrayList的扩容机制以及ArrayList与LinkedList的区别
    ArrayList的扩容机制假设采用无参构造器来实列化ArrayList对象ArrayListarrayList=newArrayList();此时,arrayList的初始容量为零,当第一次调用add方法时,会触发扩容机制,容量扩容为10。此后,在调用add方法时,如果容量不足,则容量会扩容为当前容量的1.5倍。capcity=capacity......
  • 【pycharm】作为Array查看出现数据无法显示问题(已解决)
    【pycharm】作为Array查看出现数据无法显示问题(已解决)当我们在调试代码的时候,需要对某个变量进行查看,就如同在matlab中,我们可以直接在工作区对某个变量进行双击查看矩阵变量的具体数值在这里我遇到一个问题:我的pycharm是专业版2023.3.2,在查看变量作为Array查看出现数据......
  • Arrays工具类
    5.Arrays工具类5.1介绍数组操作工具类,专门用于操作数组元素方法名说明publicstaticStringtoString(类型[]a)将数组元素拼接为带有格式的字符串publicstaticbooleanequals(类型[]a,类型[]b)比较两个数组内容是否相同publicstaticintbinarySearch(in......
  • ArrayIndexOutOfBoundException and NegativeArraySizeException in Java
    ArrayIndexOutOfBoundExceptionArrayIndexOutOfBoundsException occurswhenweaccessanarray,ora Collection,thatisbackedbyanarraywithaninvalidindex. Thismeansthattheindexiseitherlessthanzeroorgreaterthanorequaltothesizeofthe......
  • CF817F MEX Queries 题解
    题目链接:CF或者洛谷不是很难的题,但在这里提供一个动态开点线段树怎么卡空间卡过去的极致空间处理技巧全局\(mex\)问题,常见的做法就是维护权值树,然后找第一个没有权值的点,可以维护\(\min\),但本题存在第三个操作,所以不能再去传统地维护\(\min或者\max\)去辅助二分了。观......
  • 巧用Array.prototype.keys()求和
    今天复习基础知识无意中在MDN上找到Array.prototype.keys()一个有意思的用法,在非数组对象上使用keys(),使用call读取this上的length属性,然后生成0~length-1的索引,并且不会实际访问,代码如下:1functionsum(num=0){2constarrayLike={3length:num+14......
  • JavaScript学习笔记5: 对象 - 数组Array
    JS对象-数组Array数组的定义及特性数组定义<script>//数组定义方式1,赋值给变量vararr1=newArray(1,2,3);//数组定义方式2,初始化数组vararr2=[4,5,6];</script>JS数组长度可变<script>vararr2=[4,5,6];//数组初始长度为3......