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 #include9t1 code#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 }
t2:數顏色
考試時腦子被帶修莫隊填滿了……
詳見數顏色專題
code
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9t2 code#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 }
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 #include9t3 code#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()
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...