题目描述
输入格式
输出格式
样例数据
说明
题目分析
暴力枚举可以得65分
写的稍微好一点可以得75分
先讲讲75分做法:
用O(m^2)的时间将以i开始的,在i后值为a[j]的位置j加入链表
每次需要找到a[j]所在位置时,按照delta在链表中查找即可,时间可以忽略
因此是总时间复杂度O(m^3)的。
再讲讲满分做法:
用Hash统计每个魔法值出现的次数
题目描述可以抽象为下面一条线段(图画的丑别在意)
由图我们可以先枚举Δcd(1<=Δcd<=n/9)
将Δbc>6*Δcd改为Δbc=6*Δcd+1。
为什么可以这样做呢?因为我们只是找出一种方案,如果这种方案满足,那么>6*Δcd的方案均可满足
然后枚举d,可得
d的方案数=(前面所有a的方案)(前面所有b的方案)(当前c的方案数)
c的方案数=(前面所有a的方案)(前面所有b的方案)(当前d的方案数)
同理,枚举a的位置,i和a定了之后b就定了,可得
a的方案数=(前面所有c的方案)(前面所有d的方案)(当前b的方案数)
b的方案数=(前面所有c的方案)(前面所有d的方案)(当前a的方案数)
源代码
下面给出暴力,暴力优化和AC代码
暴力
#include<algorithm>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cstdlib>
#include<vector>