注意收到的傷害值寫的有點問題,實際上是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...