洛谷 P2147 SDOI2008 洞穴勘測

2022-03-05 02:08:09 字數 1683 閱讀 5076

p2147 [sdoi2008]洞穴勘測

思路:按時間分治,然後每條邊有乙個存活時間段,按存活時間段將邊加入劃分樹,然後在劃分樹上分治,用可撤銷並查集維護連通性。

**:

#pragma gcc optimize(2)

#pragma gcc optimize(3)

#pragma gcc optimize(4)

#includeusing namespace std;

#define y1 y11

#define fi first

#define se second

#define pi acos(-1.0)

#define ll long long

//#define mp make_pair

#define pb push_back

#define ls rt<<1, l, m

#define rs rt<<1|1, m+1, r

#define ull unsigned ll

#define pll pair#define pli pair#define pii pair#define piii pair#define pdd pair#define mem(a, b) memset(a, b, sizeof(a))

#define debug(x) cerr << #x << " = " << x << "\n";

#define fio ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);

//head

const int n = 1e4 + 10, m = 2e5 + 5;

vectorvc[m<<2];

int n, m, u[m], v[m], op[m];

struct ufs

inline int find(int x)

inline void merge(int x, int y) );

fa[x] = y;

if(rnk[x] == rnk[y]) );

rnk[y]++;}}

else );

fa[y] = x;}}

inline void undo()

}ufs;

void update(int l, int r, pii p, int rt, int l, int r)

void dfs(int rt, int l, int r)

return ;

}int m = l+r >> 1;

int sz = ufs.stk.size();

dfs(ls);

while(ufs.stk.size() > sz) ufs.undo();

dfs(rs);

while(ufs.stk.size() > sz) ufs.undo();

}char s[15];

mapmp;

int main() ] = i;

else if(op[i] == 1) ], i-1, , 1, 1, m);

mp = 0;}}

for (auto it : mp) if(it.se) update(it.se, m, it.fi, 1, 1, m);

dfs(1, 1, m);

return 0;

}

洛谷P2147 SDOI2008 洞穴勘測

題目大意 有 n 個洞穴,m 條指令,指令有三種 connect u v 在 u,v 之間連一條邊 destroy u v 切斷 u,v 之間的邊 query u v 詢問 u,v 是否連通 資料保證合法 題解 lct 潘佳奇的板子 卡點 無 潘佳奇的板子 c code include includ...

洛谷 P1984 SDOI2008 燒水問題

題目描述 把總質量為1kg的水分裝在n個杯子裡,每杯水的質量均為 1 n kg,初始溫度均為0 現需要把每一杯水都燒開。我們可以對任意一杯水進行加熱。把一杯水的溫度公升高t 所需的能量為 4200 t n j,其中,j 是能量單位 焦耳 如果一旦某杯水的溫度達到100 那麼這杯水的溫度就不能再繼續公...

洛谷 P1984 SDOI2008 燒水問題

把總質量為1kg的水分裝在n個杯子裡,每杯水的質量均為 1 n kg,初始溫度均為0 現需要把每一杯水都燒開。我們可以對任意一杯水進行加熱。把一杯水的溫度公升高t 所需的能量為 4200 t n j,其中,j 是能量單位 焦耳 如果一旦某杯水的溫度達到100 那麼這杯水的溫度就不能再繼續公升高,此時...