這是乙個很老的題了
想到肯定和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 ...