雙指標+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了,有...