18 10 30紹一模擬賽

2022-06-13 12:12:09 字數 3020 閱讀 1953

給定乙個長度為n的數列,第i個數為\(a_i\),要求給數列劃分。

要求乙個塊內任意兩個數之和不在斐波那契數列上。

【樣例輸入】

51 5 2 6 1 5 2 6 7

【樣例輸出】

4【樣例說明】

最優分組的一種為: 最優分組的一種為: 最優分組的一種為: 最優分組的一種為: 最優分組的一種為: 最優分組的一種為: , , , 。

【資料範圍】

對於 10% 的資料,\(n ≤ 20\)。

對於 30% 的資料,\(n ≤ 300\)。

對於 60% 的資料,\(n ≤ 1000\)。

對於 100 % 的資料,\(n ≤ 100000, a_i ≤ 10^9\)。

\(2\times a_i\le 2*10^9\)別看這個範圍很大,但是斐波那契數列第47項就比這個數大了,打表!!

既然這麼小,用乙個桶記錄每乙個數是不是為斐波那契數列上的數就不划算了,我們直接暴力查詢(二分也行)就可以了。

我考場上的思路是dp,\(g[i]\)表示第i個點最遠向左擴充套件到\(g[i]\)位置不合法。

我們可以很容易預處理出這個,用乙個map(據說會被卡),或者set,或者手打雜湊表儲存前\(1~i-1\)個數,然後列舉每乙個\(fib[j]-i\),查詢是否存在,取最近的乙個位置。

然後再和\(g[i-1]\)求一下最大值就可以了。

然後考慮dp,\(f[i]\)表示\(1~i\)最小分多少組。

很明顯\(f[i]=min\)。

然後發現是\(o(n^2)\)的,過不去,可以用單調佇列優化,均攤乙個n,輕鬆能過。

不知道為什麼會被卡乙個點。

標算是貪心。

因為很明顯,位置越多分組肯定越多,我們不斷加入乙個數,判斷它跟最近的組是不是有衝突。

如果有衝突我們就新開一組,否則加入上一組。

用雜湊表可以做到\(o(1)\)查詢,這樣子我們就能\(o(n)\)解決問題了。

dp**(90pts)

#include #include #include #include #include #define ll long long

using namespace std;

const int maxn=100009;

ll read()

ll fib[maxn],a[maxn],g[maxn];

ll f[maxn],d[maxn],q[maxn],n,h=1,t=0;

mapm;

bool ask(ll a);

void init();

int main()

memset(f,0x3f,sizeof(f));

f[0]=0;q[++t]=f[0];d[t]=0;

}/* 對每乙隻兔子列舉它之前第乙個和他組成兔子數列的兔子

* 然後跑一遍dp,求出最小劃分數。

* g[i]表示從i開始,最大向左拓展的長度。

* 發現g[i]是遞增的,我們可以考慮單調佇列優化。

* 但是被預處理卡了。。

*/

貪心**(ac)
#include #include #include #include #include #define ll long long

using namespace std;

const int mod=133531;

const int maxn=100009;

int read()

ll n,fib[maxn],a[maxn],ans=0;

ll head[mod+100],nxt[mod+100],val[mod+100],tot=1;

bool find(int x)

void clean()

void insert(int x)

int main()

ll k,r,p[109],now=1,ans=0,maxn;

void dfs(int d)

ll qwq=now;

while(1)

ll k,k1,k2,r,p[109],p1[109],p2[109],now=1,ans=0,maxn;

ll a1[14000005],a2[14000005],cnt1=0,cnt2=0;

void dfs1(int d,ll v)

//coutdfs1(d+1,v*res);

if(res>t1) break;

res=res*p1[d]; }}

void dfs2(int d,ll v)

//coutdfs2(d+1,v*res);

if(res>t1) break;

res=res*p2[d]; }}

bool cmp(ll a,ll b)if(!t2) break;

maxn = max(maxn,a1[t1] * a2[t2]);

ans += t2;

t1++;

} printf("%lld\n",maxn);

printf("%lld\n",ans);

return 0;

}

給定乙個序列,求在序列中中位數在\(l_1\)到\(r_1\)之間並且滿足長度在\(l_2~r_2\)之間的序列的個數。

我怎麼可能會寫啊。。

打了個暴力滾粗了。

正解好像是線段樹。。

40pts

#include #include #include #include #define ll long long

using namespace std;

const int maxn=100009;

int read()

int n,m,l1,l2,r1,r2,maxn,flag;

int a[maxn*2],f[maxn*2],len;

ll ans;

void ask();

int main()

return 0;

}void ask()

} printf("%lld\n",ans);

}

noip模擬賽(一)魔法樹

魔法樹 mahou.pas c cpp 問題描述 魔法使mored在研究一棵魔法樹。魔法樹顧名思義,這貨是一棵樹 奇葩的是魔法樹上的每一條邊都擁有乙個魔法屬性 如果不那麼奇葩就不是mored的魔法樹了。魔法使mored在研究這棵魔法樹的方法比較奇葩,每一次他會選擇一條路徑 施法。這個魔法是mored...

noip模擬賽(一)寵物之戰

寵物之戰 senso.pas c cpp 問題描述 眾所周知,mored的寵物已經被mored奴役得體無完膚。這只寵物實在忍無可忍,把自己每天走魔法樹的經歷告訴了自己的寵物。同時他還說明了自己爬樹是多麼地慢,以至於mored每天都殘酷地訓練他爬樹。幸運的是mored的寵物的寵物不是mored的寵物,...

學校初一模擬賽(2019 3 8)

rank name score t1t2 t3t4 1hky 250100 1005002 lyf240 10050 5040 3wjj 21090 705004 lth120 2050500 5fy9010 305006 tjh30010 2007cwh100 01008 whd1000 100題...