綿陽東辰國際test201910 22eve

2022-01-29 08:58:14 字數 1971 閱讀 4723

這是乙個很老的題

想到肯定和lca樹剖啊有關,但當時我看到1e6的範圍時果斷放棄

結果它m的時限時2秒

說說我的分析:

最值問題?不是貪心就是dp

對於dp,如果轉化為線性的,就是乙個單調佇列優化dp的模板

但是想了半天一棵樹怎麼都不能轉化為線性

對於貪心,考慮乙個點如果能被較多的區間覆蓋就肯定最優(能多白嫖)

這樣選擇了乙個點之後,所有區間包含它的區間都要刪掉,貌似樹剖可以(懶得打)

正解:

考慮對於每一條路徑的lca求出來,將他們的lca按照深度排序,從深度較大的刪,能不刪就不刪,

這樣保證結果最優

至於證明:

應該是個感性理解,畫幾個圖就會明白的

code by std:

#include#define rep for(int s,i=lk[x];i;i=hd[i])if(f[x]^(s=to[i]))

const int n=1000006;

using namespace std;

int n,m,to[n*2],hd[n*2],lk[n],cnt,

f[n],sz[n],de[n],son[n],top[n],ans;

inline void add(int u,int v)int u,v;

void dfs(int x)

int main()

else x^=p[i]; }}

int main()

回到正題:考慮線性基交換插入順序結果不變的性質,對於同乙個r,強行搞一搞。

把新加的數ax 連同座標資訊 x按照正常過程插進線性基里。

特殊的是當線性基的這一位有值,且對應的座標y < x時,需要把ax直接 放在這一位,並把這一位原來的數拿出來繼續插入線性基

通俗點就是前乙個 r,然後新插入的把對應位置上原來的往後面趕

查詢bse[r]中位置大於等於 l的那一部分。

code by std

#includeconst int n=2000006,l=30;

using namespace std;

int tp,n,m,x,b[n][l],p[n][l],lans;

inline void ins()

if(p[n][i]r)swap(l,r);

x=0;

for(int i=l-1;~i;i--)

if(p[r][i]>=l&&!(x>>i&1))

x^=b[r][i];

printf("%d\n",lans=x);

} }}

綿陽東辰國際test2019 10 31

吐槽 當時腦抽了,總是往難得地方想,實際上很簡單一道簽到題,總結以後要求自己第一題 不能超過50行,不然就不要寫 肯定就是方法錯了 分析 構造的時候就每次在它前面從大到小的放,這樣保證肯定能消完的 吐槽 n3log暴力炸了?我真的是服了我自己了,功底太好了 這題資料用腳造的,暴力能過,這樣這道題就毫...

綿陽東辰國際test201910 21

分析 哈密爾頓環 每個點只經過一次的路線,有哈密爾頓環的圖叫哈密爾頓圖 先考慮只是一條鏈 很容易想到隔乙個跳一次,這樣無論鏈有多長一定是從a出發,b回來 所以直接拓展到樹上即可 如 果當前節點深度是奇數,那麼我們在dfs前輸出這個點,否則在dfs完所有孩子之 後再輸出這個點。part code il...

綿陽東辰國際test10 12

蒟蒻分析 考試時寫個權值線段樹就是調不出來 蒟蒻總結 平時多練手 solution 其實就用樹狀陣列維護一下就行 多了個撤銷操作而已,應該十分鐘就寫完的,我寫了三個小時!code by jklover includeusing namespace std inline int read const ...