【差分 贪心】JZOJ_4788 序列

博客围绕一道题展开,先阐述题意,接着给出思路。需计算ai表示转换成bi还需的量并进行差分,根据加的数是否超过4分类讨论,若不超4,答案为∑i=1nmax(0,ai);若超4,让区间(l,r]加4,要使ar+4<al。最后给出代码。

题意

在这里插入图片描述

思路

求出aia_iai表示还需多少才能转换成bib_ibi,把它差分。
如果加的数不超过444,那么答案就为∑i=1nmax(0,ai)\sum_{i=1}^{n}max(0,a_i)i=1nmax(0,ai)
否则如果让区间(l,r](l,r](l,r]加上4,即al−4,ar+4a_l-4,a_r+4al4,ar+4,那么就要使ar+4&lt;ala_r+4&lt;a_lar+4<al,分类讨论。

代码

#include<cstdio>

int t, n, ans;
int a[100002];

int main() {
	scanf("%d", &t);
	while (t--) {
		scanf("%d", &n);
		for (int i = 1; i <= n; i++)
			scanf("%d", &a[i]);
		int x;
		for (int i = 1; i <= n; i++) {
			scanf("%d", &x);
			a[i] = (x - a[i] + 4) % 4;
		}
		ans = 0;
		for (int i = 1; i <= n; i++) {
			a[i] -= a[i + 1];
			if (a[i] > 0) ans += a[i];
		}
		int t2 = 0, t3 = 0;
		for (int i = 1; i <= n; i++) {
			if (a[i] == -3) {
				if (t3) {
					t3--;
					ans -= 2;
				} else if (t2) {
					t2--;
					ans--;
				}
			}
			else if (a[i] == -2) {
				if (t3) {
					t3--;
					t2++;
					ans--;
				}
			}
			else {
				t2 += a[i] == 2;
				t3 += a[i] == 3;
			}
		}
		printf("%d\n", ans);
	}
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值