考試反思 0224省選模擬30 倉皇

2022-02-03 02:15:25 字數 3153 閱讀 5103

毒瘤大合集。

$t1$基本沒有暴力分但是正解是兩個暴力的合集。。然後單純只寫其中比較簡單的那乙個的話一分都沒有。。

$t2$寫的暴力正解不知道是啥東西。但是我陣列開i太大,本機沒事但交上去$ce$了。(把我根本沒呼叫過的杜教篩雜湊表給刪了就不$ce$了)

然而也只有$10$分。常數醜了。把所有陣列都縮小到$\frac$就有$20$分了。奇奇怪怪。

$t3$是個毒瘤卡常的互動題,複雜度明明是$o(n \ log \ n)$但是因為所謂實測非得卡到$o(10n)$.

然而我並沒有什麼想法,畢竟只會寫$o(n^2)$的,正解優化的思路還是不錯。但是因為毒瘤卡常所以還是耽誤了我一下午的時間。

不知道為什麼並沒有留更多的改題時間,所以苟過$t3$然後把$t1$的高分暴力寫了就結束了。

t1:任憑風浪起,穩坐釣魚台

大意:給$n$個$k$位二進位制數,求兩兩異或的立方和。$nk \le 2 \times 10^6$

對於$k \geq 128$直接暴力,手寫$bitset$壓位,$2^$進製效果不錯。

對於$k<128$,逐位考慮貢獻。發現立方就是可重複的選擇三位,如果這三位在兩個數中異或值都為$1$那麼就產生這三位的乘積的貢獻。

於是用$bitset$壓一壓有哪些數這一位上是1哪些數是0,然後與一與就好了。

1 #include2

using

namespace

std;

3#define ull unsigned long long

4#define mod 998244353

5 unsigned int seed;int n,k,x,ans,bit[1

<<16];ull jz=((1ull<<63)%mod<<1)%mod,pw[555

];6 vectorb[20005],r,c[20005];7

ull get01()

13int cnt(ull s)

14int

main()cout

26 }const

int n=n-1>>6; r.resize(n+1

);27

for(int i=0;i1),c[i].resize(n+1

);28

for(int i=0;ifor(int j=0;j>6]|=get01()<>6]|=b[j][i>>6]&(1ull<

));29 pw[0]=1;30

for(int i=1;i<555;++i)pw[i]=(pw[i-1]+pw[i-1])%mod;

31for(int i=1;i<1

<<16;++i)bit[i]=bit[i>>1]+(i&1

);32

for(int i=0;ifor(int j=i;jfor(int x=j;xx)cout

46 }

80pts。卡常

對於異或這種操作,上面我們是列舉了每一位的$01$。然而為什麼不能直接去做異或呢?

發現這道題貌似可以直接對若干位異或$fwt$。

我們把二進位制位每$a$位分為一組,然後我們要從中選出三個數字的話,那麼只需要選出三個數字分別在哪一組裡。

t2:任憑風浪起,穩坐釣魚台(續)

鴿了鴿了等$skyh$大神講了。

t3:魚和熊掌不可兼得

大意:互動。實現乙個函式猜中乙個$n$排列。可以呼叫乙個函式,返回排列中對位正確的有多少個。$n \le 5000,limit \le 10n$

首先為了方便隨機出乙個錯排。

然後交換關係相當與$\frac$條邊。

因為已經是錯排了,所以交換的結果只會使正確數增加,那麼這條邊就使至少乙個數字歸位了。

把所有這樣有用的邊都記下來,那麼整個序列就被分成了若干環。

現在問題是如何在合法查詢次數內知道哪條邊是否有用。

發現只要沒有公共點,那麼邊之間是互不影響的。

那麼我們就可以指定乙個沒有公共點的邊集同時交換它們然後進行$count$。如果有數就證明這組邊裡至少有一條有用的。

然後遞迴分治下去就能找到哪些邊是有用的。

所以現在的問題是如何把$\frac)$條邊分成盡量少的組使之沒有公共點。

發現邊兩端點的編號和對$n$取模就是乙個合理的組編號。

因為如果有公共點那麼相當於乙個數就一定鎖定了。為了讓模後相等在同乙個組內,那麼另乙個數也要相等,那就是重邊了。。。

所以如此分組然後分治,最後$dfs$弄環就可以了。

然而有幾個小細節用來卡常,畢竟這題應該是$o(nlogn)$的且附帶一些不小的常數,然而卡成$10n$也就非常無良了。

首先對於乙個點如果它的有用邊度數已經達到了2那麼以後關於這個點的邊就不必加入分治了。

其次分治時傳乙個引數是這裡面所有邊對$count$的總貢獻。然後查詢左兒子時,右兒子的值也就可以直接做差得到了。

再之最後$dfs$的複雜度應該是環數級別的,而不能是點數級別的。

然後就大概在最後乙個子任務$49199$過去了。無良出題人。。

1 #include"

game.h"2

using

namespace

std;

3#define s 5555

4int x[5555],y[5555],c,mt[5555],e[5555][3],al[5555],c,top;vectora,r;

5void cl(int l,int r)

6void dac(int l,int r,int

zz)11 cl(l,l+r>>1);int $=count(a);cl(l,l+r>>1);if($)dac(l,l+r>>1

,$);

12if($!=zz)dac((l+r>>1)+1,r,zz-$);13}

14void dfs(int p,int nt=1

)18 vectorguess(int n,int

l)26}27

for(int i=0,lc=0;iif(!al[i])

32for(int j=0;jtop;

33 al[i]=2;swap(a[i],a[e[i][2]]);dfs(e[i][2],2

);34 }return

a;35 }

view code

考試反思 0502省選模擬86 恐懼

還是狀態持續不佳。但是今天沒那麼困,雖說腦子還是不想動。一看到原題就慫,毛病。好像考場上遇到原題的話,得分會比非原題還低。t2 作為原題就直接放棄正解了 然後乖乖的打部分分,結果教練把子任務放錯了於是丟了 15pts 放錯子任務同時也導致 直接輸出 0 能多 20 分。啊人就應該有信仰啊為什麼我沒輸...

考試反思 0316省選模擬47 偏頗

這套題的考察思路其實不錯。三暴力,掛乙個。t1 是送分,但是一眼覺得是大資料結構,於是直接扔掉了。結果竟然是個原題。dy 講的只記住了只言片語思路早就忘了。好歹這次會了。t2 的話寫了個亂搞,結果把本來到手的 20 給寫死迴圈了,加了句判斷就 50 了。t3 差不多想到正解了,但是毒瘤出題人不給部分...

考試反思 0313省選模擬44 習慣

我也不知道我在幹什麼了。僥倖還是害人啊。t1 乙個變數名的大小寫寫錯了 shift沒按住 然後就爆零了,丟了 45 分。然後 oj 貌似終於支援靜態記憶體了?不知道反正我就謎之 mle 了,我根本都沒用那東西。然後開小點就有 35 分了。85 分的場打成 5 分。哎。話說這套題好噁心啊,部分分很少且...