2019 10 21 NOIP模擬測試 day1

2022-03-17 23:02:23 字數 3149 閱讀 5938

afo倒計時...感覺10月28日就完了。

3道題都是洛谷某次月賽的題目。

t1 斐波拉契

題解:

這道題一開始我還不太懂什麼意思,就覺得很懵逼,推了很久也沒有發現什麼規律。差點就建了一棵樹跳lca。其實完全沒有必要,還是好想,我的思路就是記錄每乙個節點是哪一代出生的,然後你會發現每個節點的兒子與他的父親相差都為乙個斐波拉契數列中的數,於是我們可以這樣想,就是按照找lca的思路來跳,然後每次出生靠後的節點往上跳,每次跳的值就是斐波拉契數列中的它出生那一代的項數。資料範圍是10^12,所以要處理到菲波拉切數列的60項即可。避免了建樹,還是比較好想的。

**如下:

#includeusing

namespace

std;

const

int maxn=1e6+7

;long

long

f[maxn];

intm;

long

long

a,b;

inttot;

intma,mb;

bool

flag;

inline

long

long

read()

long

long lca(long

long x,long

long

y) }

}else}}

}returnx;}

intmain()

else

}for(int j=2;j<=60;j++)

}printf(

"%lld\n

",lca(a,b));}}

return0;

}

view code

t2 數顏色

題解:

暴力做法是個人都會寫,考試的時候只打了暴力做法,原本以為只能得30分,結果出題人造的資料比較良心,還是水到了60分。其實正解二分答案我覺得很難想到,所以我還是選擇往資料結構的方面來想。

動態開點線段樹即可,每一棵線段樹維護每一種顏色,顏色一共有300000種,動態開點足矣。然後交換的話就是簡單的單點修改。坑點:注意每次單點修改時要將原序列中的顏色交換,還需要小小的卡常。

**如下:

#includeusing

namespace

std;

const

int maxn=300005

;int lc[maxn*30],rc[maxn*30

],root[maxn];

intn,m;

inta[maxn];

int sum[maxn*30

];int

cnt;

intopt,l,r,x,c;

inline

intread()

void update(int &rt,int l,int r,int pos,int

v)int query(int rt,int l,int r,int l1,int

r1)int

main()

for(int i=1;i<=m;i++)

else

}return0;

}

view code

t3 分組

題解:

這道題的題面很長,對於這種題面很長的題,讀題時就需要耐心,你發現你讀完了題面就能得到8分。這道題資料範圍寫的非常明確,還是很好得分的。對於k=1的情況,我們只需要讓相加為平方數的數不在乙個序列中即可。k=2時,需要用並查集來輔助,具體過程見**,又是並查集的神奇運用。

#includeusing

namespace

std;

const

int maxn=1e6+7

;bool

power[maxn];

intn,k;

long

long

sum;

inta[maxn];

bool

flag;

intans[maxn];

intcnt;

intlast;

intmaxx;

intvis[maxn];

intfa[maxn];

intbiaoji[maxn];

intget(int

x)void

work1()

}if(flag)

vis[a[i]]=1

; }

}void

work2()

if(j*jcontinue

;

if(j*j-a[i]>maxx) break

;

if(vis[j*j-a[i]]&&j*j-a[i]!=a[i])

}if(flag)

last=i;}}

}else

int f1=get(a[i]),f2=get(a[i]+maxx),f3=get(j*j-a[i]),f4=get(j*j-a[i]+maxx);

if(f1==f3)

else}}

if(flag)

last=i;}}

vis[a[i]]++;

}}int

main()

if(k==1

) work1();

else

work2();

printf(

"%d\n

",cnt+1

);

for(int i=cnt;i>=1;i--) printf("

%d "

,ans[i]);

printf("\n

");return0;

}

view code

NOIP模擬 修路

這題第一眼看上去有些懵逼,還以為是dp。第二眼,哦,這麼裸的最小生成樹,2分鐘打完,拍都沒對,自信100分。最終100分。每條邊的權值減去連個節點的權值,所有的邊做一次最小生成樹就好了。include include include include include define fo i,a,b f...

NOIP模擬 項鍊

經過一番周折,bob找到了alice,為了安慰alice驚魂未定的心,bob決定給alice買一條手鍊,這條手鍊由m個珍珠組成,每個珍珠上刻著不同的小寫字母。當alice看到一些字母按照一定的順序排列成的字串時,就會產生一定的愉悅值。bob現在可以在這m個珍珠上刻上字母,現在他想知道,如何刻字母可以...

NOIP模擬 幻象

phantom是一位愛思考的哲 學家。最近phantom得到了森 妖精的真傳。在他練功的時候,每秒他的思緒中都有一定的概率浮現出奇 異的幻象,持續x秒的幻象將產生 空格 的幻象值。phantom練功發自真心,他想知道,在n秒內他期望產生的幻象值是多少。等我比賽完之後,我們才知道 空格 是x2 所以比...