題意:一段區間裡怎樣分組才能使得value最大,組內人員編號必須是連續的,剛一看這個題目我就確定是用樹狀陣列做,但是怎麼想也想不到樹狀陣列怎麼分組。。無語了。我用筆推了一下,要是各組value值最大,必須盡量每一組的人數足夠大,組數盡量小,如4個人,分一組,value=4*4,這時值最大,兩組時3、1,value=3^2+1^1也比2^2+2^2大............
因此,可以得出結論,使組內的人盡量多且組數少(其實乙個組內人數多了就減少了再分組的可能,組數自然就少),value就大,所以只要能組成一組的就組一塊!!就相當於求一段區間內有多少段連續的數(能連續的就放一塊),其實之前題目沒更新之前是想不到把連續的數和一塊的。。還需加強思想呀!!
ps:其實這很類死去重問題,就好比詢問一段區間裡有幾個不相同的數,如去重例子:2 2 2 3 ,詢問區間【1,3】,得結果1,詢問區間【2,4】,結果得2,所以我們可以想象能組成一組的看成都是相同的數,問題就轉化成了在一段區間裡求不同數的個數,思路就比較清晰了,**就好寫了
**:#include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
const int m=100005;
int pos[2*m];
int c[m];
int a[m],n,m;
int ans[m];
struct node
inv[m];
int lowbit(int x)
void update(int x,int v)
int query(int x)
bool cmp(node a,node b)
nd[4*m];
struct node
inv[m];
bool cmp(node a,node b)
nd[num].value=nd[2*num].value+nd[2*num+1].value;
}int query(int s,int e,int num)
int main()
for(int i=1; i<=m; i++)
sort(inv+1,inv+m+1,cmp);
build(1,n,1);
int j=1;
for(int i=1; i<=n; i++)
{update(i,i,1,1);
if(a[i]>1 && pos[a[i]-1]
HDU 多校聯合第四場
比賽的時候各種wa加tle。好糾結。01.至今沒搞懂怎麼個過程。04 gb用hash過得,後來看了一下標程,複雜度o n 3 尼嘛,我寫個o n 3 20 的演算法就超時。06 偶始終不明白容斥原理怎麼用的。估計各位大神是猜的公式,把1 p1 1 p2 1 pn這個式子寫出來後邊的就可以猜了。07....
2013第四場多校
多校第四場 6題,打得最好的一場多校。還是cjboy給力。本場比賽我基本上沒什麼貢獻,搞04一搞就是一下午。最後看了09覺得只有狀態壓縮,不知道怎麼優化。1004 圖論,強聯通分量 0 一開始推理的時候思路很清晰,但是接著就腦殘了,沒怎麼細想就直接去套樣例。以為得到了正確的解法,只是需要乙個特判。然...
hdu6070 2017hdu多校第四場
這道題是跟code force 834d很相像的一道題,題意說的是要求區間裡面不同數的個數除區間長度的最小值,首先先想到乙個公式si ze l r r l 1 size l,r 指的是l到r區間裡有多少個不同的數。我們可以列舉每個數,對於每個數來說,如果以這個數作為新的右端點,那麼左端點到上一次出現...