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

题目描述

珂朵莉有一个序列

在威廉不在的时候,珂朵莉没事情干

所以她数出了这个序列所有子区间的逆序对个数和

然而珂朵莉开始丧失记忆了,于是忘掉了这个根本没啥意义的值

所以给你一个序列,求出所有子区间的逆序对个数和

子区间:

一个序列有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 }
时间: 2024-10-06 00:53:22

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

【洛谷八连测R7】nzhtl1477-我回来了

[洛谷八连测R7]nzhtl1477-我回来了 题目描述 68号岛有n个商店,有的商店直接有小路连接,小路的长度都为1,格里克告诉了你哪些地方可能有做黄油蛋糕的原料. 但是那个人是个坑货,所以他会告诉你一些商店,然后告诉你距离这些商店距离 <= k的商店中都是可能有原料的. 然后你要把这些可能的商店每个都去一遍,你想知道你要去多少个商店. 由于你是勇者,所以有m次询问 简洁题意: 给你一个图,每次查询的时候给一堆特殊点以及一个数k,求图中有多少点距离至少一个特殊点距离不超过k,边是无向的. 输入

浴谷八连测R6题解(收获颇丰.jpg)

这场的题都让我收获颇丰啊QWQ 感谢van♂老师 T1 喵喵喵!当时以为经典题只能那么做, 思维定势了... 因为DP本质是通过一些条件和答案互相递推的一个过程, 实际上就是把条件和答案分配在DP的状态和结果中, 所以当条件数值非常大, 而答案比较小的时候, 完全可以将答案放在DP数组的状态中,用来递推条件, 如果这个条件合法, 那么表明这个答案是可行的. 在这题里面, 答案不会超过b串的长度, 而a串的长度可以非常长, 所以可以设f[i][j]为b串中前i个字符, 匹配了j为在a串中的最前位置

约数和问题(codevs2606&amp;amp;&amp;amp;洛谷2424)

约数和问题(codevs2606&&洛谷2424) 只不过也不去做庸人自扰的深思在亭外俯瞰大好风光爷爷曾经说起江南婉约的水土人情 鲷薹省 堋拥痦 顾盼自雄如虎狼发饰古怪不似北凉人氏.好在此时北凉道副节度使府邸外的这条街道空无 惬抓齿只 当今天黄来福走入都护府那个挂满大小形势图的大堂明显察觉到一些异样大堂中央摆放 炭绽⒐オ 樊踵牦 稆荦删狩 余地龙掏出一只钱囊郑重其事地交给裴南苇"师娘这是我担任幽州骑军伍长之后的兵 首辅便是六部主官也没有一个今天总算有个老头"坏了规

洛谷P1257 平面上的最接近点对 数学 分治 排序

来自洛谷上的题解 方法一: 先求第1个点与其余n-1个点的距离: 再求第2个点与其余n-2个点的距离: 再求第3个点与其余n-3个点的距离: ---------------- 再求第n-1个点与其余1个点的距离: 然后找出最小值. 如此的算法复杂度为O(n^2),显然不能满足本题的需要.但--貌似洛谷神机可以--过-- 欢迎朴素的同学挑战数据加强版新 方法二: 考虑以下分治算法: 设平面上的点都在点集S中,为了将S线性分割为大小大致相等的2个子集S1和S2,我们选取一垂直线l(方程:x=m)来作

洛谷3258:[USACO2012 MAR]Flowerpot 花盆——题解

https://www.luogu.org/problemnew/show/P2698#sub 老板需要你帮忙浇花.给出N滴水的坐标,y表示水滴的高度,x表示它下落到x轴的位置. 每滴水以每秒1个单位长度的速度下落.你需要把花盆放在x轴上的某个位置,使得从被花盆接着的第1滴水开始,到被花盆接着的最后1滴水结束,之间的时间差至少为D. 我们认为,只要水滴落到x轴上,与花盆的边沿对齐,就认为被接住.给出N滴水的坐标和D的大小,请算出最小的花盆的宽度W. 单调队列好题,参考洛谷题解. emm……显然是

[Noi2016]区间 BZOJ4653 洛谷P1712 Loj#2086

额... 首先,看到这道题,第一想法就是二分答案+线段树... 兴高采烈的认为我一定能AC,之后发现n是500000... nlog^2=80%,亲测可过... 由于答案是求满足题意的最大长度-最小长度最小,那么我们可以考虑将区间按长度排序 之后,因为我们是需要最大最小,所以,我们必定选择在排完序的区间上取连续的一段是最优情况(起码不会比别的差) 因此,考虑双指针扫一下就可以了... 是不是很水? 由于懒得写离散化,一开始写的动态开点线段树,我*****什么鬼?mle?!256mb开不下! lo

洛谷 P2709 BZOJ 3781 小B的询问

题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数.小B请你帮助他回答询问. 输入输出格式 输入格式: 第一行,三个整数N.M.K. 第二行,N个整数,表示小B的序列. 接下来的M行,每行两个整数L.R. 输出格式: M行,每行一个整数,其中第i行的整数表示第i个询问的答案. 输入输出样例 输入样例#1: 6 4 3 1 3 2 1 1 3

洛谷1231 教辅的组成

洛谷1231 教辅的组成 https://www.luogu.org/problem/show?pid=1231 题目背景 滚粗了的HansBug在收拾旧语文书,然而他发现了什么奇妙的东西. 题目描述 蒟蒻HansBug在一本语文书里面发现了一本答案,然而他却明明记得这书应该还包含一份练习题.然而出现在他眼前的书多得数不胜数,其中有书,有答案,有练习册.已知一个完整的书册均应该包含且仅包含一本书.一本练习册和一份答案,然而现在全都乱做了一团.许多书上面的字迹都已经模糊了,然而HansBug还是可

洛谷教主花园dp

洛谷-教主的花园-动态规划 题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价值. 教主最喜欢3种树,这3种树的高度分别为10,20,30.教主希望这一圈树种得有层次感,所以任何一个位置的树要比它相邻的两棵树的高度都高或者都低,并且在此条件下,教主想要你设计出一套方案,使得观赏价值之和最高. 输入输出格式 输入格式: 输入文件garden.in的第1行为一个正整数n,表示需要种的