首页 > 其他分享 >Queries for the Array 题解

Queries for the Array 题解

时间:2023-12-19 12:35:56浏览次数:30  
标签:cnt unfinishsort int 题解 Queries finishsort 序列 Array define

前言

这场 CF 是我赛后打的,vp 赛时没做出来,后来发现是有个地方理解错了,有一些细节没有考虑到。现在换了一种思路来写,感觉更清晰了。

做法

首先需要动态维护三个变量,\(cnt\) 和 \(finishsort\) 和 \(unfinishsort\)。这三个变量分别表示当前数字的个数,已经排好序的最后一个位置,和没有排好序的最前一个位置。首先我们知道如果序列要从有序的变为无序的,那么我们一定会贪心地将序列的最后一个位置变为无序的,因为这样才能更快地变回有序的,证明显然。接下来看四种操作:

  • 在末尾新添加一个数

这时直接让 \(cnt\) 加一就可以了,其它的变量的值都不需要改变。因为此时我们还不能判断出当前这个数应该排序还是不排序,需要参考之后的询问来判断。

  • 删去末尾的一个数

首先要让 \(cnt\) 减一。其次还要计算删去的这个数对整个序列的贡献,如果删去这个数之后 \(finishsort > cnt\),那么要将 \(finishsort\) 变为 \(cnt\);如果 \(unfinishsort > cnt\),即整个序列已经全部有序,那么直接将 \(unfinishsort\) 变为 \(0\)。

  • 判断这个序列无序

如果 \(finishsort=cnt\) 或者 \(cnt<2\),即整个序列有序,那么直接判断为不合法。否则如果 \(unfinishsort\) 等于 \(0\),就将 \(unfinishsort\) 设置为当前位置。

  • 判断这个序列有序

如果 \(unfinishsort\) 不等于 \(0\) 的话,那么一定是不合法的。否则将 \(finishsort\) 设置为当前位置。

Code

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define inf 0x3f
#define re register
#define inf_db 127
#define ls id << 1
#define rs id << 1 | 1
#define endl '\n'
typedef pair <int,int> pii;
const int MAXN = 2e5 + 10;
int T,n,cnt,unfinish_sort,finish_sort;
char c[MAXN];
signed main()
{
	cin >> T;
	while(T--)
	{
		cin >> (c + 1);
		int len = strlen(c + 1),flag = true;
		cnt = finish_sort = unfinish_sort = 0;
		for(int i = 1;i <= len;i++)
		{
			if(c[i] == '0')
			{
				if(cnt == finish_sort || cnt < 2){flag = false;break;} 
				if(!unfinish_sort) unfinish_sort = cnt;
			}
			if(c[i] == '1')
			{
				if(unfinish_sort != 0){flag = false;break;}
				finish_sort = cnt;
			}
			if(c[i] == '+') cnt++;
			if(c[i] == '-') 
			{
				cnt--;
				if(cnt < unfinish_sort) unfinish_sort = 0;
				if(cnt < finish_sort) finish_sort = cnt;
			}
		}
		if(flag == true) puts("YES");
		else puts("NO");
	}
	return 0;
}

标签:cnt,unfinishsort,int,题解,Queries,finishsort,序列,Array,define
From: https://www.cnblogs.com/Creeperl/p/17913447.html

相关文章

  • poker 题解
    原题链接:poker赛时只有\(40\)分,改完之后感觉是一道好题,于是就来写篇题解。题意有\(k\)张扑克牌,\(n\)种数字,每张牌都有两面,每一面分别写了一个数字,你可以选择打出这张牌的任意一面,但是不能两面同时打,也可以选择不打这张牌。有\(q\)个询问,每个询问给定\(l\)和\(r\),判断......
  • P3694 邦邦的大合唱站队 题解
    原题链接:P3694思路状态设计因为这道题\(m\)的范围非常小,所以可以用\(m\)来作为状态。设\(dp_{i}\)表示\(m\)支队伍的状态为\(i\)时最少让多少偶像出列。预处理在转移之前,我们先要预处理出序列的前缀和\(sum_{i,j}\)表示第\(i\)个数之前有多少个值为\(j\)......
  • [AGC054C] Roughly Sorted 题解
    题意定义一种操作为交换\(a_{i}\)和\(a_{i-1}\)。对于一个长度为\(n\)的排列,你需要操作若干次,使这个序列变合法,一个序列合法指:满足对于每一个\(1\lei\len\),都满足包含\(a_i\)的逆序对的个数不超过\(k\),并且要求最小化操作次数。现在给定一个操作后的序列,询问原序列可......
  • P2391 白雪皑皑 题解
    原题链接:P2391。并查集好题。首先我们知道,并查集在一个无向图中可以维护两点之间的连通性,判断条件为:\(find(u)==find(v)\)。而对于这道题来说,我们可以用并查集来维护一个序列区间的重叠性或者说区间的连通性。因为题目上说了后面的操作会覆盖前面的操作,所以我们可以考虑倒序进行......
  • [ABC239Ex] Dice Product 2 题解
    原题链接:ABC239Ex。题意不多赘述。看到求期望值,我们想到可以用期望DP。设\(dp_{i}\)表示最终结果大于等于\(i\)时的操作次数的期望值。那么我们可以得到一个基本的状态转移方程:\(dp_{i}=\frac{1}{n}\times\sum_{j=1}^{n}dp_{\left\lceil\frac{i}{j}\right\rceil}+......
  • Prefix Purchase 题解
    题意给定一个长度为\(n\)的序列\(ans\),初始值全部为\(0\)。你一共有\(k\)个硬币,你可以选择花\(a_{i}\)个硬币来使\(ans_{1}\)到\(ans_{i}\)中的所有数加一。求最终能得到的\(ans\)序列中字典序最大的一个。思路首先我们可以发现一个很显然的性质:如果满足\(a_{i}......
  • Sum of XOR Functions 题解
    题意给定一个数\(n\)和一个包含\(n\)个数的序列\(a\),求出以下式子模\(998244353\)的值:\(\sum_{i=1}^{n}\sum_{j=i}^{n}f(i,j)\times(j-i+1)\)。其中\(f(i,j)\)的值为\(a_{i}\oplusa_{i+1}\oplusa_{i+2}\oplus...\oplusa_{j}\)。思路首先我们可以考虑这道题的......
  • Candy Party (Hard Version) 题解
    原题链接:CF1868B2,简单版:CF1868B1。题意有\(n\)个人,第\(i\)个人手上最初有\(a_{i}\)颗糖。现在每个人可以把自己手中的糖选一些给不多于一个人,同时每个人也只能接受不多于一个人的糖,选出的糖的数量必须是二的次幂。问能否能让每个人最终手上的糖的数量相等。思路首先,这......
  • 【0909 B组】切蛋糕 题解
    原题链接:切蛋糕。题意给定一个\(n\)行\(m\)列的蛋糕,问横着切\(i\)刀,竖着切\(j\)刀后美味度最小的蛋糕的美味度尽可能大。一块蛋糕的美味度为它所含有的小块的美味度之和。数据范围:\(1\len,m\le14\)。思路看到数据范围,我们可以考虑一种类似于状态压缩的思想,先枚举......
  • Cyclic Operations 题解
    前言看这道题有好多巨佬都是用Tarjan来做的,在这里讲一个自认为比较简单的做法,(不到\(30\)行)。题意题意比较难讲,建议自己去看一下翻译,在这里不多赘述。思路首先看到题目中间给的一个每一次操作的式子:\(a_{l_{i}}=l_{(i\modk)+1}\)。仔细观察这个式子后会发现,其实每一次......