璟雯院

珺璟如晔,雯华若锦

用户工具

站点工具


icpc:problems:usaco21jan_no_time_to_paint_s
problems
名称No Time to Paint S
题目编号USACO21JAN_S2
题目链接luogu.com.cn/…
来源USACO
算法分类前缀和, 思维
难易程度容易

No Time to Paint S

想法

由于低色彩不能覆盖高色彩,故当出现低色彩时,前面涂过的高色彩是无法延续到该位置后续的,故后续的高色彩需要重新涂。维护一个色彩序列,存储色彩是否可以涂抹到该位置,当可以涂抹时,就不增加画笔个数,当不可以涂抹时,增加画笔个数且比当前颜色高的色彩均失效。

代码实现

#include<iostream>
#include<cstring>
using namespace std;
 
const int N = 1e5+10;
char line[N];
int f[N], e[N];
bool vis[30];
 
int main()
{
	int n, q;
	scanf("%d %d", &n, &q);
	scanf("%s", line);
 
	f[0] = 1;
	memset(vis, false, sizeof(vis));
	vis[line[0] - 'A'] = true;
	for(int i=1; i<n; i++)
	{
		if(line[i] > line[i-1])
			f[i] = f[i-1] + 1;
		else
		{
			if(vis[line[i]-'A'])
				f[i] = f[i-1];
			else
				f[i] = f[i-1] + 1;
			for(int j=26; j>line[i]-'A'; j--)
				vis[j] = false;
		}
		vis[line[i]-'A'] = true;
	}
 
	e[n-1] = 1;
	memset(vis, false, sizeof(vis));
	vis[line[n-1]-'A'] = true;
	for(int i=n-2; i>=0; i--)
	{
		if(line[i] > line[i+1])
			e[i] = e[i+1] + 1;
		else
		{
			if(vis[line[i]-'A'])
				e[i] = e[i+1];
			else
				e[i] = e[i+1] + 1;
			for(int j=26; j>line[i]-'A'; j--)
				vis[j] = false;
		}
		vis[line[i]-'A'] = true;
	} 
 
	while(q--)
	{
		int x, y;
		scanf("%d %d", &x, &y);
		x--; y--;
		cout << (x-1 < 0 ? 0 : f[x-1]) + e[y+1] << '\n';
	}
	return 0;
} 
/app/www/public/data/pages/icpc/problems/usaco21jan_no_time_to_paint_s.txt · 最后更改: 2023/06/03 12:32 由 温婕莺