題目傳送門
題意:訓練指南p248
分析:第乙個操作可以用並查集實現,儲存某集合的最小高度和最大高度以及城市個數。運用線段樹成端更新來統計乙個區間高度的個數,此時高度需要離散化。這題兩種資料結構一起使用,聯絡緊密。
#include using namespace std;const int n = 1e5 + 5;
const int m = 3 * n;
const int inf = 0x3f3f3f3f;
struct point
point(int x, int y) : x (x), y (y) {}
};struct query q[2*n];
#define lson l, mid, o << 1
#define rson mid + 1, r, o << 1 | 1
int city[m<<2], num[m<<2], col[m<<2], col2[m<<2]; //segment_tree
void push_down(int o)
if (col2[o])
}void build(int l, int r, int o)
int mid = l + r >> 1;
build (lson); build (rson);
}void updata(int ql, int qr, int c1, int c2, int l, int r, int o)
push_down (o);
int mid = l + r >> 1;
if (ql <= mid) updata (ql, qr, c1, c2, lson);
if (qr > mid) updata (ql, qr, c1, c2, rson);
}void query(int p, int l, int r, int o)
push_down (o);
int mid = l + r >> 1;
if (p <= mid) query (p, lson);
else query (p, rson);
}int n, m, bound;
int rt[n], rk[n], maxy[n], miny[n]; //dsu
void init(void)
int find(int x)
void union(int u, int v)
point point[n];
vectorys;
void run(void)
for (int i=1; i<=m; ++i)
else
}}int main(void)
char str[10];
int u, v; double t;
scanf ("%d", &m);
for (int i=1; i<=m; ++i)
else if (str[0] == 'l')
}sort (ys.begin (), ys.end ());
ys.erase (unique (ys.begin (), ys.end ()), ys.end ());
bound = 200010;
for (int i=1; i<=n; ++i)
for (int i=1; i<=m; ++i)
}run ();
}return 0;
}
LA 4730 Kingdom 線段樹 並查集
la 4730 題意 有n個帶座標的城市,和m個操作,每次操作 road a b,連線a,b城市成為乙個州 或者 line c,查詢y c的水平線和多少個州相交以及這些州一共包含多少個城市。思路 可以把每個城市的x座標忽略,把縱座標看做線段樹的區間,乙個點就相當於更新區間 y,y 一條線就相當於更新...
LA 4730 Kingdom 並查集 樹狀陣列
給定n個點的座標,代表n各城市,有m種操作,共分兩種,一種是連線,把兩個點連起來 一旦構成連通圖,這個連通圖即為乙個州 還有種詢問操作,為y c,c為小數部分恒為.5的實數 問y c這條線經過了多少個大周,這些州總共有多少個城市 很明顯要用到並查集,比較好的做法是把並查集落實到線段樹上,並查集維護的...
紅綠 線段樹分治, 並查集
對 1,q to t 1,q tot 1,q t ot 進行線段樹分治,將每個 綠綠 的 影響區間分為 log q tot log q tot logq t ot個區間散布在線段樹節點中,其中 qto tq tot qt o t 為詢問的總數 然後對線段樹dfs dfsdf s,合併祖先鏈的和當前節...