多校第四場 Hdu 4638 樹狀陣列

2021-06-17 17:55:53 字數 1259 閱讀 6607

題意:一段區間裡怎樣分組才能使得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區間裡有多少個不同的數。我們可以列舉每個數,對於每個數來說,如果以這個數作為新的右端點,那麼左端點到上一次出現...