樹狀數組 不太會 留下慢慢看
L2B的演唱會
Description
著名樂隊L2B宣布要在Music島舉辦一場演唱會,售票當天那家伙,那場面,相當熱鬧,真是鑼鼓喧天,鞭炮齊鳴,旌旗招展,人山人海啊。
L2B的粉絲小C得知消息,飛奔到售票處,卻發現買票的人已經排起了長龍的隊伍,正當他萬般絕望的時候,他看到了敬愛的PengSir,于是他向PengSir請求幫助。PengSir嘴角微微一笑,說道:票我倒是可以給你一張,可是白給的話就太沒意思了,這樣吧,我有一個問題考考你,如果你能在5秒鐘內答出來的話,我就送你這張票,怎么樣?小C急不可待的說:沒問題。于是PengSir徐徐說道:這里排隊的一共有N個人,每個人之前都發了一個號碼牌(數字從1到N各不相同),我們假定隊頭是前,隊尾是后,每個人P最多能夠買的票數是在這個人后面而且號碼牌的數字比這個人P的數字小的人數總和。我的問題是,告訴你每個人手中的號碼,你來算出今天最多一共能賣出去多少張票S么?
舉個例子說吧
假設我們現在有10個人在排隊,他們手中的號碼分別是2 5 8 7 6 1 9 4 10 3,那么可以很快算出他們最多可以買的票數分別是1 3 5 4 3 0 2 1 1 0,所以最多一共能賣出去1+3+5+4+3+0+2+1+1+0=20張票。怎么樣?明白了吧?
小C聽完,頓時傻眼,親愛的朋友,你能幫助小C來實現自己心愿嗎?
L2B的粉絲小C得知消息,飛奔到售票處,卻發現買票的人已經排起了長龍的隊伍,正當他萬般絕望的時候,他看到了敬愛的PengSir,于是他向PengSir請求幫助。PengSir嘴角微微一笑,說道:票我倒是可以給你一張,可是白給的話就太沒意思了,這樣吧,我有一個問題考考你,如果你能在5秒鐘內答出來的話,我就送你這張票,怎么樣?小C急不可待的說:沒問題。于是PengSir徐徐說道:這里排隊的一共有N個人,每個人之前都發了一個號碼牌(數字從1到N各不相同),我們假定隊頭是前,隊尾是后,每個人P最多能夠買的票數是在這個人后面而且號碼牌的數字比這個人P的數字小的人數總和。我的問題是,告訴你每個人手中的號碼,你來算出今天最多一共能賣出去多少張票S么?
舉個例子說吧
假設我們現在有10個人在排隊,他們手中的號碼分別是2 5 8 7 6 1 9 4 10 3,那么可以很快算出他們最多可以買的票數分別是1 3 5 4 3 0 2 1 1 0,所以最多一共能賣出去1+3+5+4+3+0+2+1+1+0=20張票。怎么樣?明白了吧?
小C聽完,頓時傻眼,親愛的朋友,你能幫助小C來實現自己心愿嗎?
Input
輸入有多個測試用例
每個測試用例的第一行是正數N( 0 < N <= 30000 ),
第二行是N個整數Ai( 0 < Ai <= N ),且每個Ai出現且僅出現一次,每兩個相鄰的整數之間有且僅有一個空格隔開
每個測試用例的第一行是正數N( 0 < N <= 30000 ),
第二行是N個整數Ai( 0 < Ai <= N ),且每個Ai出現且僅出現一次,每兩個相鄰的整數之間有且僅有一個空格隔開
Output
對于每一個測試用例,只輸出一個整數S
Sample Input
10 2 5 8 7 6 1 9 4 10 3
Sample Output
20
1
#include <iostream>
2
#include<string.h>
3
#include<stdio.h>
4
using namespace std;
5
const int N=30010;
6
int t[N],a[N],n;
7
void add(int x)
8

{
9
for(;x<=n;x+=x&-x)
10
t[x]+=1;
11
}
12
int sum(int x)
13

{
14
int ans=0;
15
for(;x>0;x-=x&-x)
16
ans+=t[x];
17
return ans;
18
}
19
int main()
20

{
21
while(~scanf("%d",&n))
22
{
23
int i;
24
memset(t,0,sizeof(t));
25
for(i=1;i<=n;i++)
26
scanf("%d",&a[i]);
27
int ans=0;
28
for(i=n;i>=1;i--)
29
{
30
ans+=sum(a[i]);
31
add(a[i]);
32
}
33
printf("%d\n",ans);
34
}
35
return 0;
36
}
37
#include <iostream>2
#include<string.h>3
#include<stdio.h>4
using namespace std;5
const int N=30010;6
int t[N],a[N],n;7
void add(int x)8


{9
for(;x<=n;x+=x&-x)10
t[x]+=1;11
}12
int sum(int x)13


{14
int ans=0;15
for(;x>0;x-=x&-x)16
ans+=t[x];17
return ans;18
}19
int main()20


{21
while(~scanf("%d",&n))22

{23
int i;24
memset(t,0,sizeof(t));25
for(i=1;i<=n;i++)26
scanf("%d",&a[i]);27
int ans=0;28
for(i=n;i>=1;i--)29

{30
ans+=sum(a[i]);31
add(a[i]);32
}33
printf("%d\n",ans);34
}35
return 0;36
}37

