#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 ...