四校聯考 點

2022-06-03 08:00:09 字數 1239 閱讀 9602

【題目描述】

有n個點,初始時沒有邊。有m個操作,操作分為兩種:

(1) 在i和j之間增加一條無向邊,保證1<=i,j<=n。

(2) 刪去最後新增的k條邊,保證k<=當前邊數。

你想要知道最多能選取多少個兩兩不連通的點,以及選取的方案數。在每次操作後輸出這兩個值。方案數對998244353取模。

【輸入資料】

第一行兩個整數n,m。接下來m行每行第乙個數表示操作型別,接下來2或1個數表示i,j或k。

【輸出資料】

對於每個操作,輸出一行兩個整數,用乙個空格隔開。

【樣例輸入】

3 71 1 2

1 1 3

1 3 3

2 11 1 2

2 22 1

【樣例輸出】

2 21 3

1 31 3

1 32 2

3 1【資料範圍】

對於20%的資料,n,m<=10。

對於40%的資料,n,m<=1000。

對於100%的資料,n,m<=500000。

【題解】

這是乙個維護連通性的問題

我們發現每次都只會刪除最近的邊

於是我們把每次加的邊壓入棧中

一條邊只會彈出一次

於是我們採用啟發式合併維護

1 #include2 #include3

#define mod 998244353

4using

namespace std;const

int n=500001;typedef long

long

ll;

5int

n,m,top,p[n],q[n],f[n],s[n],ans1,ans2,r[n];

6 inline int getf(int h)

7 inline void join(int x,int

y)11 inline void

split()

15int

main()

19for(int py=1,fx,fy,t,x,y;py<=m;py++)

25else

for(int jy=1;jy<=x;jy++,top--) if

(p[top]) split();

26 printf("

%d %d\n

",ans1,ans2);27}

28return0;

29 }

四校聯考 20171001

二分 期望得分 70 實際得分 10 列舉最高的高度可能為多少 二分。o logm 列舉最高高度應該位於哪一列上.o n 左右擴散列舉出需要用的積木總數,與m相比較。容易發現合法的高度的最高值,最終需要搭建乙個金字塔。1,3,5,7 正解是預處理出每一列作為最高列的左右邊界。然後再二分最大高度。ch...

四校聯考(20170910)

ditoly出的題目果然喪,待我一天啃一題。廢話不多說,開更 我是分割線 t1 最大值 max 問題描述 小c有n個區間,其中第i個區間為 li,ri 小c想從每個區間中各選出乙個整數,使得所有選出的數and起來得到的結果最大,請你求出這個值。輸入格式 第一行乙個正整數n,表示區間個數。接下來n行,...

四校聯考 傳遞

題解 如果乙個圖是競賽圖那麼如果存在邊,那麼a一定能走到b,反之亦然 還有,如果在圖p中存在邊,那麼圖q中一定不存在邊或 基圖是完全圖 那麼,如果圖p中存在邊,圖q一定不能從a走到b或者從b走到a 既然如此,因為圖p 圖q是完全圖 所以,對於點u和點v,u和v之間的邊要不然在p裡,要不然在q裡,所以...