首页 > 其他分享 >P3514题解

P3514题解

时间:2022-11-30 23:00:25浏览次数:35  
标签:val int 题解 dfs else ans pos2 P3514

给一个只有1和2的序列,每次询问有没有一个子串的和为x

SPJ对于格式的要求较为严格。对于每个询问后,应紧跟一个换行符。在最后一次输出你的答案以及一个换行符后不应有任何输出。

由zhouyonglong提供SPJ

题解

首先因为元素只能为1/2,所以我们可以思考如何利用上这个性质,可以发现如下重要性质

若存在一个和为\(k\)的区间,则一定有一个和为\(k-2\)的区间

证明:设这个区间为\([l,r]\),则对\(l,r\)两个位置上的权值分类讨论,若二者其中至少有一个权值为2,那么就把那个端点删去就得到了一个和为\(k-2\)的区间,而若二者的权值都为1,从两端删去即可

那么我们就可以考虑将一个足够大的区间往回缩,不断递归,可以得到与此区间的和的奇偶性相同且小于的所有值所对区间

到了这里,做法就很显然了,先找到最大奇数段和最大偶数段,然后递归预处理每个值的答案区间即可,复杂度只有\(O(N)\)

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define N 2000050
#define scanf scanf_s
struct node {
	int l, r;
}ans[N];
int val[N], n, m, q, s1[N], s2[N], pos1, pos2;
void dfs(int l, int r, int k) {
	if (ans[k].l)return;
	if (l > r)return;
	ans[k] = { l,r };
	if (val[l] == 2) {
		dfs(l + 1, r, k - 2);
	}
	else if (val[r] == 2) {
		dfs(l, r - 1, k - 2);
	}
	else dfs(l + 1, r - 1, k - 2);
}
void init() {
	memset(ans, 0, sizeof ans);
	scanf("%d%d", &n, &m);
	for (int i = 1; i <= n; i++) {
		char x;
		cin >> x;
		if (x == 'T')val[i] = 2;
		else val[i] = 1;
	}
	for (int i = 1; i <= n; i++)s1[i] = s1[i - 1] + val[i];
	for (int i = n; i >= 1; --i)s2[i] = s2[i + 1] + val[i];
	for (int i = 1; i <= n; i++)if (val[i] == 1) { pos1 = i + 1; break; }
	for (int i = n; i > 0; --i)if (val[i] == 1) { pos2 = i - 1; break; }
	if (s2[pos1] > s1[pos2]) { dfs(pos1, n, s2[pos1]); }
	else { dfs(1, pos2, s1[pos2]); }
	dfs(1, n, s1[n]);
}
int main() {
	init();
	while (m--) {
		int k;
		scanf("%d", &k);
		if (ans[k].l == 0)puts("NIE");
		else printf("%d %d\n", ans[k].l, ans[k].r);
	}
	return 0;
}

标签:val,int,题解,dfs,else,ans,pos2,P3514
From: https://www.cnblogs.com/oierpyt/p/16940106.html

相关文章

  • 道路游戏——题解
    单调队列优化-道路游戏[NOIP2009普及组]道路游戏题目描述小新正在玩一个简单的电脑游戏。游戏中有一条环形马路,马路上有\(n\)个机器人工厂,两个相邻机器人工厂之间......
  • 题解——红黑树
    进制运算-红黑树题目描述红黑树是一类特殊的二叉搜索树,其中每个结点被染成红色或黑色。若将二叉搜索树结点中的空指针看作是指向一个空结点,则称这类空结点为二叉搜索树的......
  • 题解——GCD
    给定正整数\(n\),求\(1\lex,y\len\)且\(\gcd(x,y)\)为素数的数对\((x,y)\)有多少对。\(n\le10^7\)题解做法1题意即为求\(S=\sum_{质数p|n}\sum_{i=1}^n\sum_{......
  • 题解——阿狸与桃子的游戏
    边权均分-巧妙的阿狸和桃子的游戏[国家集训队]阿狸和桃子的游戏题目描述阿狸和桃子正在玩一个游戏,游戏是在一个带权图G=(V,E)上进行的,设节点权值为w(v),边权为c(e)。游......
  • 分组——题解
    分组题目背景大样例可在页面底部「附件」中下载。题目描述小C在了解了她所需要的信息之后,让兔子们调整到了恰当的位置。小C准备给兔子们分成若干个小组来喂恰当的......
  • KDOI-3还原数据题解
    「KDOI-03」还原数据题目描述小E正在做一道经典题:给定一个长度为\(n\)的序列\(a\)和\(q\)个操作,操作共有\(2\)种类型:\(\tt{1~l~r~x}\):对于所有\(l\lei\le......
  • 题解——星之界
    题解考虑化简这个可恶的式子\[\prod\limits_{i=l}^{r}C_{\sum_{j=l}^{i}a_j}^{a_i}\]拆开,设\(S\)为前缀和数组\[=\prod^r_{i=l}\frac{(S_i-S_{l-1})!}{a_i!(S_i-S......
  • P8858题解
    折线题目描述平面直角坐标系的第一象限内有一块左下角为\((0,0)\)右上角为\((10^{100},10^{100})\)的矩形区域,区域内有正偶数个整点,试求出这样一条从\((0,0)\)出发......
  • 题解 P1902 刺杀大使
    题解P1902刺杀大使首先注意到,只需要到达一个开关,就可以开启所有开关(打开所有门)所以我们就可以想到,我们要寻找一条从任意\(1-m\)开关(因为访问一个开关就可以开启所有......
  • 你必须要知道的JavaScript数据结构与面试题解答
    英文原文|https://dev.to/educative/7-javascript-data-structures-you-must-know-4k0m原文作者|RyanThelin和AmandaFawcett译文翻译|web前端开发(web_qdkf)解决编码......