HDU3015 樹狀陣列 離散 詳解版

2021-08-19 01:51:12 字數 1167 閱讀 7227

#include

#include

#include

#define ll long long

using

namespace

std;

struct node

t[100005];

int n,c[100005],c1[100005];

bool cmp(node s1,node s2)

void insert(int x,int num,int *s) //s為對應的傳遞過來的陣列

}int sum(int x,int *s)

return ans;

} int main()

} int jilu=t[n].x; //記錄最大的數下邊用

sort(t+1,t+n+1,cmp1); //按照高度進行排序

ji=t[1].h;

t[1].h=1;

for(int i=2;i<=n;i++)

}ll ans=0;

sort(t+1,t+n+1,cmp1); //第三次進行排序

memset(c,0,sizeof(c));

memset(c1,0,sizeof(c1));

for(int i=1;i<=n;i++)

//上邊的這個for迴圈處理之後如果是有的數的話對應的點上就有了

//然後再對應每個數找出後邊

int xiao,da; //xiao 表示比對應的數a 小反之亦然

for(int i=1;i1,c1)*t[i].x-sum(t[i].x-1,c); //找出比這個數小的個數*這個數-比這個數小的所有數之和

da=(sum(jilu,c)-sum(t[i].x,c))-(sum(jilu,c1)-sum(t[i].x,c1))*t[i].x; //找出比這個數大的數的和-這個數 * 比這個數大的個數

ans+=(xiao+da)*t[i].h;

insert(t[i].x,-t[i].x,c); //把這個用過的數從刪除

insert(t[i].x,-1,c1);//把這個數字置上減去1

}printf("%lld\n",ans);

}return

0;}

HDU 3743 樹狀陣列,離散化

其實,我也知道這道題是求逆序數來做的,但是問題來了,怎麼求逆序數,常規的解法肯定是不行的,因為資料量很大,那麼想到能用線段樹來做,是可以的,不過我還沒敲過,既然在看樹狀陣列就用這個做。又因為資料可以達到一百萬,並且資料又用不到,所以可以對資料進行離散化 include include include...

hdu 5877(樹狀陣列 離散化)

題意 查詢節點與它的父親節點相乘小於k的種類數。思路 用乙個樹狀陣列維護,查詢的話就是它的父親節點小於k a i 的個數。當跑完這個分支之後,要對他進行清除操作。ps 數比較大,需要離散化。include include include include include include include...

hdu5542 樹狀陣列 離散化 dp

推薦 通過離散化 樹狀陣列 優化 include using namespace std const int mod 1e9 7 const int maxn 1e3 60 int s maxn 最初的陣列 int e maxn 排序後的書序 int num maxn 儲存 離散化後的位置 int ...