【做题记录】[NOIP2016 普及组] 魔法阵

P2119 魔法阵

2016年普及组T4

题意:

给定一系列元素 \(\{X_i\}\) ,求满足以下不等式的每一个元素作为 \(a,b,c,d\) 的出现次数 。

\[\begin{cases}X_a<X_b<X_c<X_d \\ X_a-X_b=2\times (X_d-X_c) \\X_b-X_a<\dfrac{X_c-X_b}{3}\end{cases} \]

题解:

\(X_d-X_c=t\) ,则 \(X_a-X_b=2\times t\)

带入第三个式子,可得:\(2\times t<\dfrac{X_c-X_b}{3}\)

变形得:\(6\times t+k=X_c-X_b\) ,其中 \(1\le k\le n\)

因为 \(A\ge 1\)\(D\le n\) ,所以 \(1\le9\times t \le n-1\)

则有了这么一幅图:

考虑枚举 \(t\)

  • 枚举 \(A=[n-9\times t-1,\dots,1]\)

    对于一对 \([A,B]\)\([C,D]\) 的最小值当 \(k=1\) 时取到 。而对于一对能形成魔法阵的 \([X_c,X_d]\)\([X_i(X_i>=X_c),X_j(X_j>X_d)]\) ,也能形成魔法阵 。则可以用后缀和优化 。

  • 枚举 \(D=[2+9\times t,\dots,n]\) :同理,用前缀和优化 。

代码:

int n,m,a[Maxn],cnt[Maxn],ans[4][Maxn];

n=rd(),m=rd();
for(int i=1;i<=m;i++) a[i]=rd(),cnt[a[i]]++;
for(int t=1,tmp;9*t<n;t++)
{
	 tmp=0; for(int A=n-t*9-1;A>=1;A--)
	 {
	 	 int D=A+t*9+1,B=A+2*t,C=D-t;
	 	 tmp+=cnt[C]*cnt[D];
	 	 ans[0][A]+=tmp*cnt[B];
	 	 ans[1][B]+=tmp*cnt[A];
	 }
	 tmp=0; for(int D=t*9+2;D<=n;D++)
	 {
	 	 int A=D-t*9-1,B=A+t*2,C=D-t;
	 	 tmp+=cnt[A]*cnt[B];
	 	 ans[2][C]+=tmp*cnt[D];
	 	 ans[3][D]+=tmp*cnt[C];
	 }
}
for(int i=1;i<=m;i++) printf("%d %d %d %d\n",ans[0][a[i]],ans[1][a[i]],ans[2][a[i]],ans[3][a[i]]);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值