LA 4730 Kingdom 線段樹 並查集

2021-08-21 03:11:11 字數 1122 閱讀 9416

la 4730

題意:有n個帶座標的城市,和m個操作,每次操作: road a b,連線a,b城市成為乙個州 或者 line c,查詢y=c的水平線和多少個州相交以及這些州一共包含多少個城市。

思路:可以把每個城市的x座標忽略,把縱座標看做線段樹的區間,乙個點就相當於更新區間[y,y],一條線就相當於更新區間[y1,y2],每次查詢y=c相當於查點c,那麼這題轉化成區間更新,求點的線段樹問題,如果有多個點連線成乙個圖,那麼只要這個圖包含最大的縱座標和最小的縱座標當成區間去更新即可,那麼這個圖有多少個城市呢,就需要用並查集演算法來記錄。如果連線a,b,那麼用並查集路徑壓縮找到a,b的根節點,如果同根,不需要更新,不同根,從線段樹中刪除這兩個點的資訊,然後把這兩個點的根節點相連並更新新的根節點的節點數以及區間的範圍,然後再把新的根節點插入線段樹即可。

#include#include#includeusing namespace std;

const int maxn=1e5+5;

struct node

a[maxn];

int sum1[maxn*60],sum2[maxn*60],ans1,ans2;

void build(int l,int r,int o)

int m=(l+r)/2;

build(l,m,o*2);

build(m+1,r,o*2+1);

sum1[o]=sum2[o]=0;

}void update(int l,int r,int o,int k,int flag)

else

return;

} int m=(l+r)/2;

if(a[k].y1<=m)

update(l,m,o*2,k,flag);

if(a[k].y2>m)

update(m+1,r,o*2+1,k,flag);

}int find(int x)

void query(int l,int r,int o,int c)

int main()

ans1=ans2=0;

query(l,r,1,c);

printf("%d %d\n",ans1,ans2);

}} }

}

並查集 線段樹 LA 4730 Kingdom

題目傳送門 題意 訓練指南p248 分析 第乙個操作可以用並查集實現,儲存某集合的最小高度和最大高度以及城市個數。運用線段樹成端更新來統計乙個區間高度的個數,此時高度需要離散化。這題兩種資料結構一起使用,聯絡緊密。include using namespace std const int n 1e5...

LA 4730 Kingdom 並查集 樹狀陣列

給定n個點的座標,代表n各城市,有m種操作,共分兩種,一種是連線,把兩個點連起來 一旦構成連通圖,這個連通圖即為乙個州 還有種詢問操作,為y c,c為小數部分恒為.5的實數 問y c這條線經過了多少個大周,這些州總共有多少個城市 很明顯要用到並查集,比較好的做法是把並查集落實到線段樹上,並查集維護的...

LA3938 線段樹 分治

給出長度為n的整數序列,然後m次詢問,對於每次詢問,要求找到區間內的兩個下標x,y使得區間和盡量大,如果有多解,x盡量小,還有多解,那麼y也盡量小最大連續和的分治分治演算法是解決此題的關鍵,構造一棵線段樹,並查集維護四個值 區間和sum,最大連續和max sub 最大字首和max pre 最大字尾和...