HDU 6039 Gear Up(線段樹 並查集)

2022-07-05 07:18:12 字數 2152 閱讀 3508

【題目鏈結】 

【題目大意】

給出一些齒輪,有些齒輪是邊相連,也就是擁有相同的線速度,

有的齒輪是軸相連,也就是擁有相同的角速度,現在給某個齒輪乙個速度,

求這些齒輪中的最大速度,同時還有修改操作,可以更改某個齒輪的半徑大小

【題解】

對於共邊的齒輪,有logwy=logwx+logrx-logry,

對於同軸的齒輪,他們的速度是相同的,

我們將具有關係的齒輪連在一起,對於每個連通塊選取乙個參考齒輪,

別的齒輪則維護與其的相對關係,

當有修改操作的時候,如下圖:

如果我們將齒輪p的半徑變大,我們發現其同軸的齒輪相對參考齒輪都會變慢,

同時其軸的子樹部分受其影響也會變慢,

但是我們發現只有藍色的齒輪b和c會變慢,

紅色的齒輪這一部分由於擁有和修改的齒輪相同的線速度而保持了速度不變,

所以,我們每次更新兩段dfs序,將同軸與其管轄部分先處理,

然後將其線速度相同的管轄部分用相反數再處理一遍,

對於查詢操作,我們可以求出被施加速度的齒輪和連通塊中相對速度最大的齒輪的差

加上施加速度就是答案。

【**】

#include #include #include #include using namespace std;

const int inf=~0u>>1;

const double ln2=log(2.);

const int n=100010,m=n<<2;

int n,m,k,d[n],f[n];

struct edge;

vectorv[n];

vectore[n];

bool mark[n];

int rad[n],l[n],r[n],l[n],r[n],rt[n];

int log2(int x)

namespace segment_treet[m];

void build(int,int);

void initialize(int n)

void addtag(int x,int tag)

void pb(int x)

t[x].tag=0;

}void up(int x)

void build(int l,int r)

int mid=(l+r)>>1;

t[x].l=tot+1;build(l,mid);

t[x].r=tot+1;build(mid+1,r);

up(x);

}void change(int x,int a,int b,int p)

if(t[x].tag)pb(x);

int mid=(t[x].a+t[x].b)>>1;

if(mid>=a&&t[x].l)change(t[x].l,a,b,p);

if(mid=a&&t[x].b<=b)return t[x].val;

if(t[x].tag)pb(x);

int mid=(t[x].a+t[x].b)>>1; int res=-inf;

if(mid>=a&&t[x].l)res=max(res,query(t[x].l,a,b));

if(mid

return res;

} }int cnt;

void dfs(int rt,int fx,int x,int _d)

else

}r[x]=cnt;

}void print(int k)

int sf(int x)

int cas=1,op,x,y;

int main()

while(m--)

else

}for(int i=1;i<=n;i++));

}}cnt=0;

for(int i=1;i<=n;i++)

using namespace segment_tree;

initialize(cnt);

printf("case #%d:\n",cas++);

while(k--)else

}}return 0;

}

hdu 預處理 線段樹)

給n個數,m個詢問,問任意區間內與其它數互質的數有多少個 比如3個數1 2 4,詢問 1,3 那麼答案是1 千萬要記住,這樣的題目,如果你不轉變下,使勁往線段樹想 雖然轉變之後,也說要用到線段樹,但是維護的東西不同了 那麼會發現這樣的題目,區間與區間之間是無法傳遞資訊的,區間與區間是無法傳遞資訊的,...

hdu4630 hdu4638 線段樹離線操作

兩題都是樸素想法列舉兩個端點o n 2 超時,那麼列舉其中乙個端點用線段樹維護另乙個端點。關鍵在於沒插入乙個端點後都是成段更新,否則又會退化到o n 2 ps 兩題用c 交都比g 快500ms以上。include include include include include includeusin...

線段樹(掃瞄線)(hdu1542 hdu1255)

乙個連線,還不錯 hdu1542 題意 給你每個長方形的左下點的座標和右上點的座標,求他們的面積和。hdu 1255 題意 給你每個長方形的左下點的座標和右上點的座標,求出被這些矩形覆蓋過至少兩次的區域的面積 與上一題議題差別在第一題求總的面積,第二題求覆蓋兩次以上的面積。就len2表示下。1.q ...