一道線段樹練習題

2021-10-03 04:43:23 字數 3183 閱讀 9805

注意收到的傷害值寫的有點問題,實際上是a2+

∑j=1

k(ai

,j−c

j)2\sqrt^k(a_-c_j)^2}

a2+∑j=

1k​(

ai,j

​−cj

​)2​

,沒有後面的-a

首先由於題目中的限制「選了第i個敵人就再也不能和1到i-1的敵人作戰」,我們可以觀察後得出dp:ans

[i]=

min(

ans[

u]+∑

j=1k

(ai,

j−au

,j)2

)ans[i]=min(\sqrt^k(a_-a_)^2})

ans[i]

=min

(ans

[u]+

∑j=1

k​(a

i,j​

−au,

j​)2

​)這是o (n

2)o(n^2)

o(n2

)的,可以通過20pts.

然後考慮k=1時的情況:我們發現其實ans[i]的值和u沒有什麼關係,而是和au,

1a_au,1

​有關,所以考慮設乙個新陣列alfa,其中alfa[i]表示au,

1==i

a_==i

au,1​=

=i時,ans[u]最小是多少,然後對於第3個測試點,直接暴力維護alfa就可以通過了。

考慮4-5測試點,我們希望能快速維護類似alfa的東西:考慮beta陣列,其中beta[j]表示當前ai,

1==j

a_==j

ai,1​=

=j的答案,那麼每次計算出乙個ans[i],都可以更新一些beta的值,然後我們發現由於a

aa陣列的隨機性,可以用線段樹剪枝。每個位置維護所管轄區間的beta的最小值,然後修改時剪枝,具體看**。

最後的50pts,因為多了一維,不能直接維護所有的beta了,所以我們轉回去,考慮維護alfa,然後加上第二維的限制進行剪枝,然後卡常。。。

#include

using

namespace std;

const

int maxn=

2e5+5;

const

double inf=

1e18

;inline

intread()

while((

isdigit

(c))

&&(c!=

eof)

)return t*f;

}int n,k,a[maxn][3

];double dp[maxn]

;double t[maxn]

;#define ls rt<<1

#define rs rt<<1|1

inline

void

pushup

(int rt)

int ps[maxn]

;inline

void

build

(int rt,

int l,

int r)

int mid=

(l+r)

>>1;

build

(ls,l,mid)

;build

(rs,mid+

1,r)

;pushup

(rt);}

inline

void

modify

(int rt,

int l,

int r,

int x,

double val)

int mid=

(l+r)

>>1;

modify

(ls,l,mid,x,val)

;modify

(rs,mid+

1,r,x,val)

;pushup

(rt);}

struct node

}beta[maxn][55

];int sz[maxn]

;int up[maxn]

,down[maxn]

;void

build2

(int rt,

int l,

int r)

int mid=

(l+r)

>>1;

build2

(ls,l,mid)

;build2

(rs,mid+

1,r);}

void

modify2

(int rt,

int l,

int r,

int x,

int y,

double val)

int mid=

(l+r)

>>1;

if(x<=mid)

modify2

(ls,l,mid,x,y,val)

;else

modify2

(rs,mid+

1,r,x,y,val);}

double now;

inline

void

query2

(int rt,

int l,

int r,

int x,

int y)

if(l==r)

return;}

int mid=

(l+r)

>>1;

if(x<=mid)

else

}signed

main()

mx=max(mx,a[i][1

]);}

if(k==2)

}if(k==1)

for(

int i=

1;i<=n;i++)}

return0;

}

時間複雜度比較玄學,沒有分析。。。

一道線段樹練習題

e9首先我們有乙個考慮列舉每個mex,計算其貢獻的想法.即有多少個區間的mex mexme x是我們當前列舉的這個值.然後我們手畫一下圖,可以發現,乙個數如果想要成為乙個區間的mex mexme x,必須要這個區間已經出現了所有比它小的數.所以可以從小到大列舉mex mexme x,然後用r rr陣...

一道互動練習題

的做法 考慮逐位確定 對於每個位置,往後列舉有沒有位置可以使得正確位置更多,如果有,那麼有兩種情況,1是這個位置被放到了正確的位置,2是這個位置本來應該放的數被放來了 這裡的重點是我們需要區分1和2 具體的做法是記下讓這個位置答案正確位置數變大的2個位置,將其和i一起移位 這裡是手繪示意圖.即把p1...

一道fft練習題

考場上想到的o n 2 o n 2 o n2 暴力 記f i j f i j f i j 表示前i個位置,長度為j的連擊出現的期望次數 記g i j g i j g i j 表示第到i個位置為止,目前連擊次數為j的概率 轉移時有一些細節 include using namespace std con...