情報站
現在我方已經查明,敵人通訊所使用的加密方式依賴於乙個長度為 nn 的數列,只要得知了這個數列中每個數的值,我方便可破解敵方的通訊。
通過深入敵人內部的內線人員的艱苦奮鬥,我方逐漸獲得了一些有用的情報,通過這些情報,整個數列正在被不斷地破解。
先後有 mm 條情報被得知,每條情報是以下兩種情況之一:
每得知一條情報,我方都試圖破解數列中元素的值
作為情報部門核心技術人員的你,請程式設計實現如下功能:每次得知一條新情報,你都要計算當前已經能夠確定出數列中的多少個數了
你比較笨,對於情況 2 這種情報,只能在已知其中乙個數的情況下推出另乙個數,不能通過若干情況 2 的情報列方程求解
第一行,兩個正整數 n,mn,m
接下來 mm 行,每行的第乙個數是 typetype
輸出 mm 行,每行包含乙個非負整數,第 ii 行的非負整數表示在得知了前 ii 條情報之後數列中已經能夠確定的數的數量
對於 20\%20% 的資料,1 \le n,m \le 101≤n,m≤10,且只有第一種情報
對於 50\%50% 的資料,1 \le n,m \le 50001≤n,m≤5000
對於 100\%100% 的資料,1 \le n,m \le 3\times 10^51≤n,m≤3×105
可能會有重複的情報,也可能出現 x=yx=y 的情況
5 4
1 11 2
2 2 3
2 1 3
123
3
我當初寫這題的時候,沒有考慮到並查集,以為只是簡單的模擬題,一提交就爆0了,認真一看似乎和並查集有關,但是由於注意的細節太多,直到比賽結束**還沒有除錯完。
這題的並查集最重要的地方是維護現在有集合,和未知集合,未知集合又分為兩種:
第一種是:未知和未知是乙個集合,且其中乙個數可以是已知也可以是未知的,這也要是分開討論的;
第二種是:單個未知,該未知也可以是已知也可以是未知,這也是需要討論的;
***注:以下**是在智算之道上提交的並且是正確,但是並沒有在其他平台上測試。因此並不能保證是正確的**,且該**是本人自己想,自己的寫的,也不能保證該**是最優的。
**:
#includeusingnamespace
std;
const
int n=1e6+100
;int fa[2*n],size[n],num[n];
intn,m,len;
sets;
inline
intread()
while(c>='
0'&&c<='9'
)
return x*f;
}int find(int x)//
查詢父親
void merge(int x,int y)//
合並且累加個數
return;}
intmain()
for(int i=0;i)
else
//如果不同,合併兩個數的個數。
}else
else
if(a==b)//
如果相同但又不存在於當前所擁有的數當中,那麼當前的個數依舊不變,仍然是當前集合的個數
else
//如果不同,有兩種情況
else
//第二種:這兩個數都不是當前所擁有的,但也要把他們合併,萬一在下一次的操作一中會出現該兩數的其中乙個,那是的個數不是多一,而是多二。 }}
}return0;
}
給出兩個我自己想的測試點,因為我是靠這兩個測試點過的這題,答案被我清除了,原因是這樣的好複製(嘿嘿嘿~),所以答案需要自己想的。
測試點一:
121611122
1213
2132
2322
2233
2112
4525
6152
7829
9289
18
測試點二:
1231821222
3234
2452
5626
7111
2131
4151
6171
8289
29102
1111212
12
望大佬們海涵。
智算之道初賽第二場題解
共 10 個測試點 每個測試點 10 分 每個測試點限時 1 秒 執行記憶體上限 512mb小明正在上樓梯,當小明逐漸接近某層樓的時候,這層樓的聲控燈檢測到小明的腳步聲便會亮起來,當小明逐漸遠去的時候,聲控燈由於一段時間內沒檢測到聲音又會滅下去。由於小明是勻速上樓的,而且他的速度把控得剛剛好,腳步聲...
水杯 模擬 智算之道初賽高校組第三場
傳送門 共 20 個測試點 每個測試點 5 分 每個測試點限時 1 秒 執行記憶體上限 512mb 小小 d有乙個能顯示溫度的杯子.其原理是杯蓋上的乙個感測器.只有在杯子內的水的體積大於等於某個數 l 的時候感測器才能顯示水溫,並且如果水溫不在 a,b 內感測器也無法顯示水溫.注意,這裡溫度對水的體...
2018計蒜之道 初賽 第二場
a.推薦系統 直接暴力dp就行 賽後沒儲存orz.找不到了 b.阿里巴巴的手機 商 簡單 直接拿map暴力就行 include include include include include include include include include include include includ...