2021 5 23模擬賽賽後總結

2022-09-09 06:42:10 字數 4220 閱讀 9419

其實這次考試題目還是很水的

首先這次考試題目的資料範圍都很不對勁,動不動就 \(1e9 \ 1e8\) 的,看著嚇人極了。

可是沒想到,這題非常不講武德

上來直接給 \(1e9\) 套個 \(\log\)

我全都防出去了啊,直接 給 \(1e9\) 的 \(\log\) 來個三次方,也卡過去了啊

可是沒想到,他這 \(t2\) 又給我來乙個 \(1e9\) ,我大意了啊,沒有閃。

然後 \(re\) 了。

其他題目也出現了一些**錯誤

啊啊啊!無能狂怒

算了進正題吧。

這題做法還是蠻多的。

能數的出來的就有 \(4\) 種。

樹上路徑,樹鏈剖分線段樹,時間複雜度 \(o(n + qlog2 n\)),空間複雜度 \(o(n)\)

這好極了啊,\(1e9\) 這玩意直接就非常離譜。

\(tle+mle\)

可以發現我們要找 \(lca\) 而且樹的形態十分固定,也就是其實我們能直接算出我們需要的東西。

具體過程就是兩個點不斷地向上跳找父親,直到到達根節點,並且記錄下過程中經過的所有經過節點。

最後我們直接對比兩個陣列,他們的第乙個重合部分就是 \(lca\) ,然後直接把兩個點到 \(lca\) 的距離加起來就可以了。

首先兩個點分別跳回根節點是 \(o(logn)\) 的,然後對比兩個陣列找 \(lca\) 是 \(o(log^2n)\) 的,所以總複雜度就是 \(o(qlog^3n)\) 的。

沒錯拿了全場最劣解。

其實是可以優化的。

把他們經過的公共點存進棧裡,然後彈出公共部分就行了。

直接掉兩個 \(\log\) .

時間複雜度 \(o(qlogn)\),空間複雜度 $ o(logn)$.

非常不錯。

放個考場**

#define lawrencesivan

#includeusing namespace std;

typedef long long ll;

#define re register

const int maxn=1000;

#define inf 0x3f3f3f3f

int n,q;

int a[maxn],b[maxn];

int cnt1,cnt2;

inline int solve(int x,int y)

xx=x/2,yy=y/2;

for(;xx;xx/=2)

for(;yy;yy/=2)

/*cout<<"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ";

cout《經過做法 \(b\) 的啟發,我們可以意識到根本不需要讓兩個點同時跳啊,我們只需要讓深度大的跳,直到編號相同,那麼總步數就是答案。

時間複雜度 \(o(qlogn)\),空間複雜度 $ o(1)$.

分析完全二叉樹節點編號的二進位制性質,發現乙個節點的深度即為它的編號的二進位制表示的位數,

如 \((10)_= (1010)_2\) ,則 \(10\) 號節點深度為 \(4\);兩個節點的最近公共祖先的編號就是兩個節點的

編號的二進位制表示的最長公共字首,如 \((8)_ = (1000)_2\) ,\((5)_ = (101)_2\) 則它們的二進位制表示

的最長公共字首為 \((10)_2 = (2)_\),它們的最近公共祖先就是 \(2\) 號節點。因此我們只需要把 \(x\) 和 \(y\)

轉換成二進位制表示,然後求它們的最近公共字首 \(z\),答案即為 $ \left| x \right|$ \(+\)

\(\left|y \right|\)

\(−\)

\(2\left| z \right|\)。時間複雜度 \(o(qlogn)\)

,空間複雜度 \(o(logn)\) .

**是 @xyy1411的

#include #include using namespace std;

int n, q, x, y, lx, ly, k;

template inline t qread()

inline int getlen(const int &n)

int main()

return 0;

}

就是這個 ## 題,

在考場上想了一下以為節點所對區間要先預處理,於是開始爆肝區間,然後不知不覺開了 \(4\) 倍空間去記,然後後來一看這 \(nm\) 不就和線段樹需要的空間一樣了嗎,反正都過不去了我還不如直接搞線段樹,**實現難度又低,又比較熟練。

於是又搞了 \(4\) 倍空間去搞線段樹,然後就一頓操作非常嫻熟然後一波敲下去直接一遍過編譯一遍測樣例然後都過了,然後啪的一下直接取消 \(freopen\) 的注釋然後就直接關掉檔案。

結果\(nm\) 這玩意 能直接算!

腦子都 $*** $ 了吧!!

草,技不如人啊

然後有了區間然後累計區間內已經操作的值

具體的:

2.因為\(s_i\)是個等差數列所以可以用求和公式。

3.記得開 \(long\ long\) (參與求和公式的變數也要開 \(long\ long\))

//#define lawrencesivan

#include using namespace std;

typedef long long ll;

#define inf 0x3f3f3f3f

#define re register

const int maxn=1e5+5;

int n,q,x,y;

ll sum(ll h,ll t)

ll solve(int t,int x)

inline int read()

while (isdigit(ch))

return x*f;

}int main()

return 0;

}

以為是個平衡樹,但是年代太久遠了早就不會寫了。

於是開桶打了暴力。

突然腦子一抽意識到,這玩意不就是針對值域進行操作嗎,根本不需要排序,只需要一大塊一起處理就行了。

然後這玩意不就是權值線段樹裸題嗎?

敲一發就 \(a\) 了:

//#define lawrencesivan

#includeusing namespace std;

typedef long long ll;

#define re register

const int maxn=1e5+5;

#define inf 0x3f3f3f3f

#define ls rt<<1

#define rs rt<<1|1

int n,q;

char op[10];

struct segmenttreest[maxn<<2];

inline void push_up(int rt)

inline void push_down(int rt)

}void modify(int rt,int l,int r,int pos,int val)

push_down(rt);

int mid=(l+r)>>1;

if(pos<=mid)modify(ls,l,mid,pos,val);

else modify(rs,mid+1,r,pos,val);

push_up(rt);

}void change(int rt,int l,int r,int ql,int qr,int val)

return; }

push_down(rt);

int mid=(l+r)>>1;

change(ls,l,mid,ql,qr,val);

change(rs,mid+1,r,ql,qr,val);

push_up(rt);

}int query(int rt,int l,int r,int ql,int qr)

int ask(int rt,int l,int r,int val)

inline int read()

while(isdigit(ch))

return x*f;

}int main()

if(op[0]=='c')

if(op[0]=='r')

if(op[0]=='l'){

int x=read();

int ans=0;

if(st[1].v待補充

20181010模擬賽 賽後處刑

黃題第五套 問題描述 ufo 在樓下的花園裡種了棵樹,這棵樹上有 k 朵花。他還在樹上的某節點 上藏了封密信。有n只 lzl從密信的位置出發,經過不超過 d 段樹枝,可 以到達的範圍內包含所有的花。可以到達的範圍 如果從 a 出發,經過不超過 d 段樹枝,可以到達 b,則 b 屬於到達的範圍,否則不...

2 8模擬賽 賽後題解

難度排序 t4最高得分 前5名 t4由題意不難知道,每次選擇拔高的區間的右端點一定是 n 具體證明大家意會一下.考慮 f i j 表示當前選擇的左區間最右不超過 i 且拔高了 j 次的答案 則 f i j max 1 x二位樹狀陣列維護一下即可 看!樹套樹!時間複雜度 o nk cdot lognl...

新生賽賽後總結

題目描述 蒲煜凡學長跟學妹出來約會了!蒲煜凡學長作為一名標準直男,想要給學妹買一杯奶茶,便問學妹喜歡喝什麼樣的奶茶,學妹回了兩個字 隨便 蒲煜凡學長傻眼了,但作為一名優秀的acmer,他是不會坐以待斃的,他早早便將學妹喜歡喝的奶茶 和奶茶店的 表弄到了手 現在你要根據奶茶 判斷學妹到底喜歡喝哪一種奶...