洛谷八連測2017R7-nzhtl1477-いずれその陽は落ちるとしても
阿新 • • 發佈:2017-11-04
個數 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
說明
測試點 | n | a[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-いずれその陽は落ちるとしても