b.binary tree
題意:給你一棵二叉樹。有兩個遊戲者,回合制,他們每次可以刪去這棵二叉樹中的一棵滿二叉樹。求最後誰贏。
解法:每一棵滿二叉樹有奇數個節點,那麼每次遊戲者只能刪去奇數個節點,所以直接通過給定的二叉樹節點的奇偶就可以判斷是誰贏了。
#include#includeusing namespace std;
int main()
while(tot--) cout做法:列舉每乙個數是否能被留下。我們需要把大於他的數和小於他的數刪到個數相等,這樣這個數一定可以留下來。假如這個數小於 \(\frac\) ,那我們就刪連續三個大於它的數,反過來就刪連續三個小於它的數。
假設現在這個數小於 \(\frac\) ,當前是大大小這樣排,相當於乙個大,而大小這樣排,相當於抵消了。最後判斷一下最大可以刪的次數和到平衡時應該刪的次數大小關係即可。
#include#include#include#includeusing namespace std;
#define il inline
#define ri register int
const int n = 5000 + 5;
int n;
int a[n];
int del(int l,int r,int pos,bool flag)
else if(--now == -1) now = 0;
} else
else if(--now == -1) now = 0;
} }return ret;
}int main()
printf("\n");
} return 0;
}
g.game design
題意:你需要構造一棵帶點權的樹,使得阻斷這棵樹從葉子節點到根的最小花費方案數為 k。
做法:第一反應構造二叉樹,因為多叉樹不好維護。然後想到二進位制分解。假設有一棵樹,我們讓左子樹為一直維護的東西,右子樹用來乘 2(這裡直接用兩個點權都為 1 的點連成鏈即可)。然後就是如何控制每一位是 1 還是 0 了。假設 \(ans_i\) 陣列為以 i 為根的子樹切斷它的最小花費,\(c_i\) 陣列為每個點的點權,顯然有
\[ans_i = \beginc_i,c_i < ans_ + 1\\c_i+1,c_i = ans_ + 1\\ans_+1,c_i > ans_ + 1\end
\]假設方案數陣列為 \(d_i\) ,那麼
\[d_i = \begin1,c_i < ans_ + 1\\2 \cdot d_ + 1,c_i = ans_ + 1\\2 \cdot d_,c_i > ans_ + 1\end
\]這樣利用後兩行,就可以二進位制分解了。
我的**很混亂(模擬的時候瞎寫)
#include#include#includeusing namespace std;
#define il inline
const int n = 1e5 + 3;
int kk;
int cnt;
int a[n],pa[n],ans[n];
void build() {
int highbit;
for(int i=31;i>=0;i--) {
if(kk&(1<=0;i--) {
if(kk&(1<
2019區域賽網路賽總結
乙個多月下來打了差不多7場左右的網路賽,網路賽一般都是12 00 17 00,爭奪區域賽名額。這麼多場區域賽打下來,有發揮的好的時候,也有不好的時候,其中認識到了自己很多的不足之處,感覺到了其他學校的強大,自己很有壓力。寫題的時候發現自己知識點還有很多不足,對於數論,數學方面,自己菜了許多,高中很多...
歐洲區域賽 A F J 題解
a 題意 有兩個長度分別為n,m的陣列a b 求b 元素 與 a 元素所有差值裡出現次數最多的那個值,如果有多個最多,列印最小值。思路 首先將所有差值,存進tmp陣列裡,然後開乙個map記錄這些差值的出現次數,然後用max維護,找到出現最多的次數,然後對差值進行 sort 排序,找到第一次map值等...
2019湘潭校賽題解
a 我真的沒鴿比賽。b 直接模擬就好。c a 3 192 1。同餘模定理得 a 192 a 192 a 192 192 1。那麼暴力0 192,看看有多少a滿足條件發現只有1。所以只要求l到r有多少個x 192 1就可以了。include define ll long long using name...