noip模擬測試12

2022-05-06 23:09:13 字數 3339 閱讀 5139

t1:斐波那契

呃,其實這題手玩一下就秒出了,可是我還是zz的沒有ac

先說說我怎麼zz的,$10^$是13位……我還以為是12位,然後表就打小了gg

其實正解很easy,手玩一下就會發現,點x的父親就是x減去比x小的第乙個斐波那契數

然後就簡單了,因為斐波那契樹的層數是小於$log x_$的

所以直接用乙個數向上跳父親,並且記錄經過了哪些點,然後再用另乙個數一邊向上跳,一邊查就完了

(於是大佬們紛紛#include,只有蒟蒻我手寫雜湊表)

so,code

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9

#define ll long long

10using

namespace

std;

11const

int maxn=300233,maxd=2400;12

const ll d=2333;13

intm;

14 ll f[65

],a,b;

15struct

hash_map

23void

clear()

27void

insert(ll _v)

36bool

find(ll _v)

42}mp;

43void

first()

47int

main()

59if

(mp.find(b))

63for(int j=62;j>=1;j--)

64if(b>f[j]) 70}

71}72return0;

73 }

t1 code

t2:數顏色

考試時腦子被帶修莫隊填滿了……

詳見數顏色專題

code

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9

#define ll long long

10using

namespace

std;

11const

int maxn=300005;12

intn,m,a[maxn],ans;

13 vectorv[maxn];

14 inline int

r()

20int

main()

26for(int i=1,op;i<=m;i++) else42}

43}44return0;

45 }

t2 code

t3:分組

看到時一臉懵比,腦子裡只有貪心……

那就貪心吧,只會寫$k=1$的情況

於是就要快速判斷一群數分別加某個數是否能得到乙個特定的值

就想到這道題:小清新人渣的本願

於是用bitset來解決這個問題,複雜度 $n/32$,但考完後發現其實$\sqrt$的暴力列舉更快……

說說正解:

case $k=1$:

暴力掃一遍,如果能加入當前段就加入,否則就清空陣列並分段

判斷能否加入直接暴力掃一遍值域內所有的平方數,看平方數減當前數的得數是否出現過

因為要求字典序最小,所以貪心的倒著加入就完了

case $k=2$:

分析後會發現,如果將剛剛的情況看作是把一段數往乙個桶裡塞的話

那麼現在的操作就可以看作是把一段數往兩個桶裡塞,每個桶裡的數不能衝突

貪心的想,會發現如果出現乙個與桶中的數衝突的數,就一定得將其塞到另乙個桶裡

如果這個數和兩個桶中的數都有衝突,那就必須得分段

那怎麼維護呢?

用帶擴充套件域的並查集啊

即:1,3衝突,則將1 和 3',1』 和 3 分別merge一起

表示條件「有1」和「無3」在乙個集合,「無1」和「有3」在乙個集合

若某一時刻出現了「有a」和"無a"在乙個集合的情況,則需要新分乙個段

但這樣還有一點問題,因為每個數有可能多次出現,所以會出現幾種特殊情況:

若數a滿足$2*a=x^2$

1.當a第二次出現時,若已經有和a衝突的數

那兩個桶中乙個有a,另乙個有和a衝突的數,那麼新的a便無法加入桶中,於是需要再分一段

2.當集合中沒有與a衝突的數,但a出現了第三次,那麼新的a便無法加入桶中,於是需要再分一段

3.當插入其他數時,發現該數與a衝突,且a已經出現了兩次,則無法加入該數,於是需要再分一段

於是需要特判一下滿足$2*a=x^2$的數

然後像$k=1$的時候一樣倒著貪心的加入就好了。

特判比較多,需要思路清晰時食用

so,code

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9

#define ll long long

10using

namespace

std;

11const

int maxn=200000;12

intn,k,a[maxn],m,ans[maxn],stk[maxn],tp,mx;

13int fa[maxn*2],bstk[maxn*2],btp,vis[maxn*2

];14

bool spl[maxn*2],bvis[maxn*2

];15

void

work1()

22if(!vis[a[i]]) stk[++tp]=a[i],vis[a[i]]=1;23

}24}25

intget(int

x) 30

void merge(int x,int

y) 34

void

work2()

46 merge(a[i],j*j-a[i]+mx);

47 merge(a[i]+mx,j*j-a[i]);48}

49}50if(spl[a[i]]&&vis[a[i]]) 58}

59if(get(a[i])==get(a[i]+mx))

64if(!vis[a[i]]) stk[++tp]=a[i];

65 ++vis[a[i]];66}

67}68int

main()

t3 code

NOIP模擬測試12

t1 斐波那契 一道找規律題,被我做成了賊難的題。觀察可知x f i 1 j。j為x的父親 且j f i 1 然後就二分找父親沒了。1 include2 define ll long long 3using namespace std 4const int mod 233 5 ll f 61 6 s...

模擬測試12

考試剛發下題時的我 這什麼題,連思路啟發都沒有,毒瘤出題人!不可做!考後乙個字乙個字看著題解改出來的我 我去這麼水!這不沙幣題嗎!考後看著題解改不出來的我 這什麼題,沒一點思維含量,辣雞調試題!考後看不懂題解的我 這題解怎麼寫的比題目還短,一點素質沒有!考後看題解懵比的我 這解法怎麼這麼流氓!這解法...

NOIP模擬測試22

自 閉 賽 從這次比賽之後題都好難啊qaq 開考一小時內沒動鍵盤。三道題都不會。gg problem a 數論 過於玄學 列舉質因子,往答案裡去加。用來加入的質因子不會很多,質因子大了對答案是不優的。開兩個vector來回倒騰就完了 這題改完感覺也沒啥,為啥考場上就是想不出來啊qxq 1 inclu...