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 那麼這杯水的溫度就不能再繼續公升高,此時...