CF1386C Joker 雙指標 動態樹

2021-10-08 17:19:47 字數 1622 閱讀 2719

雙指標+lct.     

在二分圖那道題中,有一種用 lct 維護奇環的方法.   

該題的做法和那道題相似.      

對於 $i$,維護 $left[i]$ 表示當刪除 $i$ 時最靠左的端點使得刪掉 $[left[i]+1,i]$ 後仍然存在奇環.      

那麼最後判斷答案的時候就看 $(l,r)$ 中的 $l$ 是否大於 $left[r]$ 即可.       

由於刪掉邊一定不會使答案更優,所以 $i$ 增加時 $left[i]$ 不會減小,故 $[left[i],i]$ 滿足雙指標性質(即不存在包含的情況)   

將邊分為兩類:

1. 由於 $i$ 變大被刪掉的. 

2. 由於雙指標中左端點的移動被加入的.    

顯然對於 $1$ 類邊希望出現時間越晚越好,對於 $2$ 類邊沒有要求.   

根據上述結論,我們在預處理邊的時候貪心加入即可(即加不進去就不加)     

然後雙指標移動的時候去替換結束時間最小的邊,類似最大生成樹.          

#include #include #include #define n 400008  

#define ll long long

#define ls s[x].ch[0]

#define rs s[x].ch[1]

#define setio(s) freopen(s".in","r",stdin)

using namespace std;

const int inf=100000000;

int det[n];

int left[n],sta[n<<1],vis[n<<1],n,m,q;

struct edge

}a[n],arr[n];

struct data s[n<<2];

inline int get(int x)

inline int isr(int x)

void pushup(int x)

}else

}

int tot=n+m;

exi(lst);

int p=1,cnt=0;

for(int i=lst;i<=m;++i)

if(a[nx].t<=m)

dec(pr,a[nx].u);

dec(pr,a[nx].v);

}

int now=++tot;

a[m+p].t=m+1;

s[now].v=m+p;

s[now].t=m+1;

pushup(now),add(now,x),add(now,y);

}

left[i]=p-1;

if(i+1<=m&&vis[i+1])

}for(int i=1;i<=q;++i)

}return 0;

}

CF374 C 動態規劃

題目看上去感覺像是dijstra,但是不是最短路,而是在實踐允許的範圍內選擇最多的點去走完從1到n的路,這個想到的是動態規劃,以邊為核心,一條邊一條邊的掃過,如果這條邊對應的起點和終點連線上之後,對於從1到終點來說是有利的就加上那種,我還不是很理解,只是把標程看懂自己敲了一遍而已。include u...

CF369C 思維搜尋

附 原題鏈結 題意 給你n個人,以及要進行k輪遊戲,每個人都有一把槍,在每一輪中,每個活著的人都將搶指向在場上編號最小的那個人身上,編號最小的那個人將槍口指向編號次小的那個人身上。現在已知每個人打中的概率,問k輪內,會有幾種存活情況出現。分析 通過分析,可以得知每一種存活狀態僅對應一種被槍口指向的人...

CF 392 2 C 暴力模擬

cf 392 2 c.unfair poll 題意 n行m列人,老師點k次名。點名次序,每一行都是從1到m,但行是按1,2.n 1 n,n 1 n 2 1,2,3.n 1 n.求點完k次名後被點的最多的次數和最少的次數,以及給定的 x,y 被點次數。總結 有點麻煩,但還是很好找規律,只是fst了,有...