标签:格式 open space 输入输出格式 turn stdin ring pen span
珂朵莉有一个序列
在威廉不在的时候,珂朵莉没事情干
所以她数出了这个序列所有子区间的逆序对个数和
然而珂朵莉开始丧失记忆了,于是忘掉了这个根本没啥意义的值
所以给你一个序列,求出所有子区间的逆序对个数和
子区间:
一个序列有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
输出格式:
输出一行一个数表示答案
测试点 | 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-いずれその陽は落ちるとしても
标签:格式 open space 输入输出格式 turn stdin ring pen span
原文地址:http://www.cnblogs.com/w-h-h/p/7784203.html