BZOJ2837 小強的形狀

2021-09-07 02:55:40 字數 1285 閱讀 8802

離散化後通過樹狀陣列求出:

b[i]為i之前比它小的。

c[i]為i之前比它大的=i-1-i之前小於等於它的。

d[i]為i之後比它小的。

e[i]為i之後比它大的=n-i-f[i]。

f[i]為i之後小於等於它的。

則:$cnt_=\sum_^n b[i]e[i]$

$cnt_=\sum_^n c[i]d[i]$

$cnt_$=將序列a翻轉後的$cnt_$

$cnt_$=將序列a翻轉後的$cnt_$

$cnt_=\sum_^n b[i]c[i]-cnt_$

$cnt_$可以這樣計算:

列舉$3$的位置$i$,它右邊比它小的$k$有$b[k]$的貢獻,還要減去$i$右下角內$12$形狀的二元組的個數,即右下角$b[k]+f[k]$的和$-c_^2$。

時間複雜度$o(n\log n)$。

#include#include#define n 100010

typedef long long ll;

int n,i,a[n],b[n],c[n],d[n],e[n],f[n];ll bit[n],c1,c2,c3,c4,c5,c6,all;

inline void read(int&a)

inline int lower(int x)

inline void add(int x,int y)

inline ll ask(int x)

void write(ll x)

int main()

c5-=c2;

for(i=1;ifor(i=1;i<=n;i++)bit[i]=0;

for(i=1;i<=n;i++)b[i]=ask(a[i]-1),c[i]=i-1-ask(a[i]),add(a[i],1);

for(i=1;i<=n;i++)bit[i]=0;

for(i=n;i;i--)d[i]=ask(a[i]-1),f[i]=ask(a[i]),add(a[i],1);

for(i=1;i<=n;i++)bit[i]=0;

for(i=n;i;i--)c3+=1ll*b[i]*c[i],c4+=ask(a[i]-1)-1ll*d[i]*(d[i]-1)/2,add(a[i],b[i]+f[i]);

c3-=c4;

all=c1+c2+c3+c4+c5+c6;

write(c1),write(c2),write(c3),write(c4),write(c5),write(c6);

return 0;

}

Codevs 2837 考前複習

時間限制 1 s 空間限制 128000 kb 題目等級 gold 題解檢視執行結果 aiden馬上要考試了,可他還沒怎麼複習,於是他決定臨時抱佛腳。他列了n個知識點,並分析出了複習每個知識點所需的時間t以及可能獲得的分數k。他現在還有t時間來複習,他希望選擇正確的知識點來在最短的時間內獲得最高的期...

P2837 晚餐佇列安排

此題可能用動規不太好做,主要是狀態轉移方程很難想個人認為,思維發散的大佬們忽視。我看了這位大佬的 dp 題解後才想到了方程,在此受我一膜 嗯,說下思路 先用 a i 陣列存一下輸入的編號 然後用二維陣列 dp i 0 1 來表示當前第 i 頭奶牛的編號改成 1 或 2 所用的最少次數 0 表示改成 ...

P2837 晚餐佇列安排

p2837 晚餐佇列安排 對程式有新的理解 難度 讀懂題 準確地從題中提取有效資訊 設計演算法 實踐 mmp,我看錯題啦。字首和 列舉斷點即可 1 include2 include3 include4 include5 include6 define inf 2147483647 7 define ...