暴力列舉可以得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
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
inline
const
int get_int()
while(x>='0'&&x<='9')
return num*bj;
}int max,n,a[50005],b[50005],c[50005],d[50005];
struct node a[50005];
bool cmp(node a,node b)
sort(a+1,a+n+1,cmp);
for(int numa=1; numa<=n; numa++)
for(int numb=numa+1; numb<=n; numb++)
}
}for(int i=1; i<=n; i++)printf("%d %d %d %d\n",a[i],b[i],c[i],d[i]);
return
0;}
暴力優化
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
inline
const
int get_int()
while(x>='0'&&x<='9')
return num*bj;
}int max,n,a[50005],b[50005],c[50005],d[50005];
struct node a[50005];
bool cmp(node a,node b)
sort(a+1,a+n+1,cmp);
for(int i=1; ifor(int j=i+1; j<=n; j++)
to[i][int(a[j].v)].push_back(j);
for(int numa=1; numa<=n; numa++)
for(int numb=numa+1; numb<=n; numb++) }}
for(int i=1; i<=n; i++)printf("%d %d %d %d\n",a[i],b[i],c[i],d[i]);
return
0;}
ac
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
inline const int get_int()
while(x>='0'&&x
<='9')
return num*bj;
}int max,n,mogic[50005];
struct magic f[50005];
int main()
for(int deltacd=1; deltacd<=max/9; deltacd++)
tmp=0;
for(int a=max-9
*deltacd-1; a>=1; a--)
}for(int i=1; i<=n; i++)printf("%d
%d%d
%d\n",f[mogic[i]].a,f[mogic[i]].b,f[mogic[i]].c,f[mogic[i]].d);
return
0;}
NOIP2016普及組 魔法陣
題目描述 六十年一次的魔法戰爭就要開始了,大魔法師準備從附近的魔法場中汲取魔法能量。大魔法師有m個魔法物品,編號分別為1,2,m。每個物品具有乙個魔法值,我們用x i 表示編號為i的物品的魔法值。每個魔法值x i是不超過n的正整數,可能有多個物品的魔法值相同。大魔法師認為,當且僅當四個編號為a,b,...
NOIP2016普及組複賽 魔法陣
設xd xc為i,那麼xb xa 2i,又因為xb xa 那麼c 6i b。於是,先列舉i,再分別列舉xa和xd,根據之間的關係,用字首和求出每一種魔法陣的每一種物品的次數。include include include include include include include const i...
NOIP2016普及組第四題 魔法陣
題目描述 六十年一次的魔法戰爭就要開始了,大魔法師準備從附近的魔法場中汲取魔法能量。大魔法師有m個魔法物品,編號分別為1,2,m。每個物品具有乙個魔法值,我們用xi表示編號為i的物品的魔法值。每個魔法值xi是不超過n的正整數,可能有多個物品的魔法值相同。大魔法師認為,當且僅當四個編號為a,b,c,d...