码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-11-04 20:48:31      阅读:333      评论:0      收藏:0      [点我收藏+]

标签:格式   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

 

输出格式:

 

输出一行一个数表示答案

 

输入输出样例

输入样例#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-いずれその陽は落ちるとしても

标签:格式   open   space   输入输出格式   turn   stdin   ring   pen   span   

原文地址:http://www.cnblogs.com/w-h-h/p/7784203.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!