题解 P11669 [USACO25JAN] Cow Checkups B

【洛谷专栏】

题意

给定两个 N 个数的数列 a,b

d 表示将 a[l,r] 区间翻转后的数列,f(l,r)=i=1N[di=bi]

求对于每个 c[0,N]N,有多少对不同的 (l,r) (1lrN) 满足 f(l,r)=c

分析

1N7500 提示时间复杂度可能是 O(N2),也就是说要找到一种对于每个区间求相等数量为 O(1) 的做法。

对于一个当前已知答案区间 [l,r],可以迅速推广到区间 [l1,r+1]。因为他们的对称轴是相同的,所以新区间内 [l,r] 的关系不会变,计算答案只需要考虑 l1r+1 对应的关系即可。

时间复杂度 O(N2)

代码

//the code is from chenjh
#include<cstdio>
using namespace std;
int n;
int a[7505],b[7505];
int ans[7505];
int main(){
	scanf("%d",&n);
	int org=0,sum=0;
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	for(int i=1;i<=n;i++) scanf("%d",&b[i]),org+=a[i]==b[i];//初始有多少个已经对应相等。
	for(int i=1;i<=n;i++){
		sum=org;
		for(int l=i,r=i+1;l>0&&r<=n;--l,++r)
			++ans[sum+=(a[l]==b[r])+(a[r]==b[l])-(a[l]==b[l])-(a[r]==b[r])];//对称轴在 i 和 i+1 之间,加上两端新出现的答案,减去原来的答案。
		sum=org;
		for(int l=i,r=i;l>0&&r<=n;--l,++r)
			++ans[sum+=(a[l]==b[r])+(a[r]==b[l])-(a[l]==b[l])-(a[r]==b[r])];//对称轴为 i,同上。
	}
	for(int i=0;i<=n;i++) printf("%d\n",ans[i]);
	return 0;
}
posted @   Chen_Jinhui  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通

一言

你已经不是我的狗了。
——龙与虎
点击右上角即可分享
微信分享提示