列表

详情


NC229102. 魔法学院(hard version)

描述

本题与easy version唯一的区别在于数据范围不同。

亚可喜欢上了收集不包括空格的可见字符(ASCII码为33~126),在她眼中,一个字符的价值为其ASCII码大小,比如’a’的价值为97。

目前她已经收集了个不包括空格的可见字符,第个字符为。可是她想要把自己收集的个字符的价值和最大化,因此去请求了戴安娜的帮助。

戴安娜有种魔法,第种魔法可以将区间的一个字符替换为。因为戴安娜出色的魔力,所以每种魔法都可以使用无限次。

请问戴安娜使用完若干次魔法后,亚可收集的个字符的最大价值和可以是多少?

输入描述

第一行两个正整数,,其中:,

第二行一个长度为且由不包括空格的可见字符组成的字符串

接下来行,每行两个正整数,和一个不包括空格的可见字符,满足

输出描述

输出使用完若干次魔法后的最大价值和。

示例1

输入:

3 3
aaa
1 3 b
2 3 c
3 3 d

输出:

297

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 579ms, 内存消耗: 217048K, 提交时间: 2021-11-13 12:48:34

#include<bits/stdc++.h>
using namespace std;

vector<pair<int,int>>R[127];
int fa[10000005]={0};
char c,S[10000005];
int find(int a)
{
	if(a==fa[a])return a;
	return fa[a]=find(fa[a]);
}
int main()
{
	int i,j,k,l,r,n,m,ans=0;
	scanf("%d%d%s",&n,&m,S+1);
	for(i=1;i<=n;i++)fa[i]=i;
	while(m--)
	{
		scanf("%d%d %c",&l,&r,&c);
		R[c].push_back({l,r});
	}
	for(i=126;i>=33;i--)
		for(j=0;j<R[i].size();j++)
		{
			l=R[i][j].first,r=R[i][j].second;
			for(k=find(r);k>=l;k=find(k))S[k]=max(S[k],(char)i),fa[k]=find(k-1);
		}
	for(i=1;i<=n;i++)ans+=S[i];
	printf("%d\n",ans);
	return 0;
}

上一题