1. 程式人生 > >洛谷八連測2017R7-nzhtl1477-いずれその陽は落ちるとしても

洛谷八連測2017R7-nzhtl1477-いずれその陽は落ちるとしても

個數 set i++ get 逆序 限制 blog 包含 +=

題目描述

珂朵莉有一個序列

在威廉不在的時候,珂朵莉沒事情幹

所以她數出了這個序列所有子區間的逆序對個數和

然而珂朵莉開始喪失記憶了,於是忘掉了這個根本沒啥意義的值

所以給你一個序列,求出所有子區間的逆序對個數和

子區間:

一個序列有n*(n+1)/2個子區間

即所有滿足1 <= l <= n , 1 <= r <= n , l <= r的[l , r]都是一個子區間

閉區間。。。

逆序對:

在一個區間中,如果有 i < j , a[i] > a[j]則( i , j )為一個逆序對

輸入輸出格式

輸入格式:

第一行一個數n表示序列長度

之後一行n個數表示這個序列a

輸出格式:

輸出一行一個數表示答案

輸入輸出樣例

輸入樣例#1: 復制
8
1 9 2 6 0 8 1 7
輸出樣例#1: 復制
106
輸入樣例#2: 復制
10
1 10 8 5 6 2 3 9 4 7
輸出樣例#2: 復制
270
輸入樣例#3: 復制
20
6 0 4 5 8 8 0 6 6 1 0 4 6 6 0 0 7 2 0 5
輸出樣例#3: 復制
3481

說明

測試點na[i]是否有重復數字
1 1 無特殊限制
2 10 無特殊限制
3 10 無特殊限制
4 1000 <=10
5 1000 無特殊限制
6 1000 無特殊限制
7 100000 <=100
8 300000 無特殊限制
9 500000 無特殊限制
10 1000000 無特殊限制

對於100%的數據,n <= 1000000 , a[i] <= 1000000000

沒負數


逆序對的變式

對於逆序對(i,j)肯定1<=L<=i,j<=R<=n的區間[L,R]都包含,乘一下就可以了

由於出題人比較毒瘤,最高會達到n^4,要寫高精度

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<algorithm>
 4 #include<cstring>
 5
#define MAXN 1000005 6 #define pii pair<int,int> 7 #define ll long long 8 using namespace std; 9 int read(){ 10 int x=0,f=1;char ch=getchar(); 11 while(ch<0||ch>9){if(-==ch)f=-1;ch=getchar();} 12 while(ch>=0&&ch<=9){x=x*10+(ch^48);ch=getchar();} 13 return x*f; 14 } 15 struct BigInt{ 16 int a[105]; 17 int len; 18 BigInt(){ 19 memset(a,0,sizeof(a)); 20 len=1; 21 } 22 void Add(ll b){ 23 int t[105]={0}; 24 int L=0; 25 while(b){ 26 t[++L]=b%10; 27 b/=10; 28 } 29 len=max(len,L); 30 for(int i=1;i<=len;i++){ 31 a[i]+=t[i]; 32 } 33 for(int i=1;i<=len;i++){ 34 a[i+1]+=a[i]/10; 35 a[i]%=10; 36 } 37 if(a[len+1]){ 38 len++; 39 } 40 } 41 void Print(){ 42 for(int i=len;i>=1;i--){ 43 printf("%d",a[i]); 44 } 45 printf("\n"); 46 } 47 }; 48 int n; 49 int cnt=1; 50 int a[MAXN]; 51 pii t[MAXN]; 52 ll dat[MAXN]; 53 void add(int k,int x){ 54 while(k>=1){ 55 dat[k]+=x; 56 k-=(k&-k); 57 } 58 } 59 ll query(int k){ 60 ll ret=0; 61 while(k<=cnt){ 62 ret+=dat[k]; 63 k+=(k&-k); 64 } 65 return ret; 66 } 67 void init(){ 68 n=read(); 69 for(int i=1;i<=n;i++){ 70 a[i]=read(); 71 t[i]=make_pair(a[i],i); 72 } 73 sort(t+1,t+n+1); 74 for(int i=1;i<=n;i++){ 75 if(t[i-1].first!=t[i].first){ 76 cnt++; 77 } 78 a[t[i].second]=cnt; 79 } 80 } 81 void solve(){ 82 BigInt ans; 83 for(int i=1;i<=n;i++){ 84 ans.Add(query(a[i]+1)*1LL*(n-i+1)); 85 add(a[i],i); 86 } 87 ans.Print(); 88 } 89 int main() 90 { 91 // freopen("Chtholly5.in","r",stdin); 92 init(); 93 solve(); 94 return 0; 95 }

洛谷八連測2017R7-nzhtl1477-いずれその陽は落ちるとしても