並查集 線段樹 LA 4730 Kingdom

2022-05-21 09:26:53 字數 1847 閱讀 8432

題目傳送門

題意:訓練指南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,合併祖先鏈的和當前節...