最近發現自己資料結構全部忘記基本,只能從頭再補,此題是一道典型的並查集+離散化的題目。
題目:程式自動分析
做法:離散化+並查集
1、因為注意到資料的取值範圍最大有 109
10^9
109,而又用到並查集來儲存節點,所以先要進行離散化。總共有 106
10^6
106 次詢問,因此最多也只會用到 2×1
06
2 \times10^6
2×10
6 個數字,陣列範圍可以滿足。同時這裡的離散化不需要滿足保序性,所以用 map
mapma
p 就可以完成。
2、這道題目的並查集是很典型的並查集。只需要先處理相等的情況,然後判斷不相等的情況會不會和原來衝突,衝突則有問題。
**:
#include
#include
#include
#include
#include
using
namespace std;
const
int n=
1000010
;int p[n*2]
;int n,tot;
int t;
struct queryq[n]
;unordered_map<
int,
int> mp;
intget
(int x)
intfind
(int x)
intmain()
;}for(
int i=
1;i<=tot;i++
) p[i]
=i;for
(int i=
1;i<=n;i++
)bool flag=
false
;for
(int i=
1;i<=n;i++)}
if(flag) cout<<
"no"
"yes"
<}return0;
}
並查集 程式自動分析
原題鏈結 規模太大,先用離散化縮小。考慮所有相等條件,把所有相等的變數 進同乙個集合中。考慮所有不等條件,若兩個變數處於同一集合中,則證明無法同時滿足這兩個條件。實現 include define n 100000 10 using namespace std int n,m int a 2 n f...
並查集 程式自動分析
給你兩個邏輯關係,判斷是否有衝突 先將兩個邏輯分開來看,前乙個邏輯存在那麼後乙個邏輯一定不存在,如果存在那麼答案就錯誤了,可以用並查集維護,詳細見 define fre yes include include include const int n 1000005 struct message ar...
資料結構 並查集
並查集,顧名思義,合併 查詢 集合 並查集是一種樹型的資料結構,用於處理一些不相交集合 disjoint sets 的合併及查詢問題。常常在使用中以森林來表示。對於概念等等的這裡不再贅述,直接講解應用。應用1 判斷圖中有多少聯通分量 或者圖是否聯通 聯通分量 1 hdu 1213 應用2 判斷圖是否...