SDUT 校赛 B题 从零开始的异世界生活


从零开始的异世界生活

Time Limit: 1000MS  Memory Limit: 65536KB

Problem Description

486作为有史以来最悲惨的男主,我们知道他需要经历一些无限次的死亡和轮回才能进行下一个关卡。

3915-1

现在给你n个连续的时间点,每个时间点i上都会有一个心理伤害值hurt[i],然后告诉你m个死亡时间点deth[i],以及当前死亡时间点会死亡的次数num[i],和死亡后486会返回的时间点(也就是最近的存档点return[i])。

其整个过程就是486从时间点0开始(hurt[0] = 0),不断向下一个时间点1,2,3,…前进,当遇到死亡时间点的时候,486会死亡一次,然后返回到最近的一个存档点,然后会继续从存档点向下一个时间点前进,当又遇到死亡时间点的时候,如果死亡次数还不够需要死亡的次数,那么当前不能过关,继续回到最近的存档点。达到需要死亡的次数之后,便不需要死亡,继续向下一个时间点前进。486在每一个时间点i上都会遭受心理伤害hurt[i],为什么486的心理防线不会崩溃呢,当然因为有我们的蕾姆酱了,每次受到心理伤害的时候蕾姆酱都会治愈掉。第一季的目标便是走到时间点n,现在需要你计算一下蕾姆酱的治愈总和(也就是486从时间点0到时间点n所遭受的心理攻击的总和)。

3915-2

那么萌萌的蕾姆酱到底治愈了多少呢~她这么萌,你还不快告诉她么~

Input

多组输入。(组数不超过100)

第一行输入两个以空格分隔的整数n和m。

n(1 <= n <= 100000)表示486要到达的目标时间点。(起始目标点0,hurt[0] = 0,每次前进一个时间点)。

接下来一行n个以空格分隔的整数,表示hurt[i]。表示486在当前时间点会遭受到的伤害值。

接下来m(0 <= m <= n/2)行,每行3个整数,分别是deth[i],return[i] 和num[i],表示deth[i]时间点需要死亡的次数以及会返回的最近的存档点。

保证:0 <= hurt[i] <= 100,1 <= deth[i-1] < return[i] < deth[i] <= n。0 <= num[i] <= 100。

当前时间点如果不需要死亡,那么486不会返回最近的存档点,会继续前进。

Output

每组输出一个整数,表示蕾姆酱总的治愈值。(486会遭受到的总的伤害值)。

Example Input
10 3
1 2 3 4 5 5 4 3 2 1
4 2 1
6 5 2
10 9 1
Example Output
62
Hint

1+2+3+4 死亡 +2+3+4+5+5 死亡 +5+5 死亡 +5+5+4+3+2+1 死亡 +2+1 = 62。




分析:

动漫还是很好看的呀。。。。     





#include<stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
long long hurt[100005];
long long ans[100005];
struct node{
	long long deth;
	long long r;
}d[100005];
int main (){
	long long n,m;
	while (scanf("%lld%lld",&n,&m)!=EOF){
		memset(hurt,0,sizeof(hurt));
		for(int i=1;i<=n;i++){
			scanf ("%d",&hurt[i]);
		} 
		memset(d,0,sizeof(d));
		for (int i=0;i<m;i++){
			int a,b,c;
			scanf ("%d%d%d",&a,&b,&c);
			d[a].deth=c;
			d[a].r=b;
		}
		int index=0;
		memset(ans,0,sizeof(ans));
		for (int i=1;i<=n;i++){
			ans[i]=ans[i-1]+hurt[i];
		}
		long long sum=0;
		for (int i=1;i<=n;i++){
			sum+=hurt[i];
			if (d[i].deth){
				sum+=(ans[i]-ans[d[i].r-1])*d[i].deth;
				d[i].deth=0;
			}
		} 
		printf ("%lld\n",sum);
	}
	return 0;
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值