NOIP2016普及 魔法陣

2021-07-25 11:03:44 字數 3307 閱讀 4200

暴力列舉可以得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...