题目链接(https://ac.nowcoder.com/acm/contest/358/D)

题目描述

出题人的妹子送了出题人一个手环,这个手环上有 n 个珠子,每个珠子上有一个数。

有一天,出题人和妹子分手了,想把这个手环从两个珠子间切开,并按顺时针顺序展开成一条链。

可以发现,这条链一共有 n 种可能性。求这 n 种可能性的逆序对数之积模 1000000007。

输入描述:

第一行一个数 n,表示珠子个数。

接下来一行 n 个数,以顺时针顺序给出每个珠子上的整数

样例输入

4

1 3 2 3

样例输出

24

备注

n<=200000,-10^9 <=珠子上的整数 <= 10^9。

题目就是求这n个顺时针排列的逆序数乘积,那么重点就是求逆序数啦,首先求出第一个排列的逆序数,看一下数据范围,n方肯定不行,那么考虑离散化加树状数组N*logN,求出逆序数之后,再从后向前遍历这个数组,考虑每一次的排列的变化,相当于将最后一个数移到第一个位置,那么这个数移动之后造成的逆序数的变化可以O(1)计算出来的,然后每一次的逆序数乘在一起就好啦,嘤嘤嘤,具体实现看我代码qwq

  1. #include <set>
  2. #include <map>
  3. #include <queue>
  4. #include <stack>
  5. #include <math.h>
  6. #include <bitset>
  7. #include <vector>
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <iostream>
  12. #include <algorithm>
  13. #define MAXN 1010100
  14. #define LL long long
  15. #define fi first
  16. #define se second
  17. #define mp make_pair
  18. #define pb push_back
  19. #define ll __int64
  20. #define INF 0x7fffffff
  21. #define cs(s) freopen(s,"r",stdin)
  22. #define mem(x) memset(x,0,sizeof(x))
  23. #define PI acos(-1)
  24. #define eps 1e-10
  25. using namespace std;
  26. int gcd(int a,int b){return b?gcd(b,a%b):a;}
  27. int lcm(int a,int b){return a/gcd(a,b)*b;}
  28. LL powmod(LL a,LL b,LL MOD){LL ans=1;while(b){if(b%2)ans=ans*a%MOD;a=a*a%MOD;b/=2;}return ans;}
  29. //head
  30. LL sum[200001],tree[200001],mod=1000000007,vis[200001],a[200001],b[200001];
  31. int n;
  32. void add(int t){//树状数组更新
  33. for(int i=t;i<=n;i+=(i)&(-i))tree[i]+=1,tree[i]%=mod;
  34. }
  35. LL que(int t){//树状数组求和,返回的是1-t的和
  36. LL q=0;
  37. for(int i=t;i;i-=(i)&(-i))q+=tree[i],q%=mod;
  38. return q;
  39. }
  40. int main(){
  41. ios::sync_with_stdio(false);
  42. cin>>n;
  43. for(int i=1;i<=n;i++)cin>>a[i],b[i]=a[i];
  44. sort(b+1,b+1+n);
  45. int cnt=unique(b+1,b+1+n)-b-1;//离散化操作
  46. for(int i=1;i<=n;i++){
  47. a[i]=lower_bound(b+1,b+1+cnt,a[i])-b;
  48. vis[a[i]]++;
  49. }
  50. for(int i=1;i<=n;i++)sum[i]=sum[i-1]+vis[i];//记录1-i的个数和
  51. LL op=0;
  52. for(int i=1;i<=n;i++){//树状数组求逆序数
  53. add(a[i]);
  54. op+=que(n)-que(a[i]);
  55. op%=mod;
  56. }
  57. LL tt=op;
  58. for(int i=n;i>=2;i--){
  59. tt+=(sum[a[i]-1]-sum[n]+sum[a[i]]+1000ll*mod)%mod;//移动后的逆序数变化
  60. tt%=mod;
  61. op*=tt;
  62. op%=mod;
  63. }
  64. cout<<op<<endl;
  65. return 0;
  66. }

出题人的手环(牛客练习赛38D 离散化+树状数组)的更多相关文章

  1. 牛客练习赛38 D 题 出题人的手环 (离散化+树状数组求逆序对+前缀和)

    链接:https://ac.nowcoder.com/acm/contest/358/D来源:牛客网 出题人的手环 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 524288K,其他 ...

  2. 牛客网 牛客练习赛4 A.Laptop-二维偏序+离散化+树状数组

    A.Laptop 链接:https://ac.nowcoder.com/acm/contest/16/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其 ...

  3. 「BZOJ1669」D 饥饿的牛 [Usaco2006 Oct] Hungry Cows 牛客假日团队赛5 (LIS,离散化树状数组)

    链接:https://ac.nowcoder.com/acm/contest/984/D 来源:牛客网 饥饿的牛 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言 ...

  4. 牛客练习赛1 B - 树

    链接:https://www.nowcoder.com/acm/contest/2/B来源:牛客网 题目描述 shy有一颗树,树有n个结点.有k种不同颜色的染料给树染色.一个染色方案是合法的,当且仅当 ...

  5. 牛客网 牛客练习赛13 B.幸运数字Ⅱ-数组 or DFS

    B.幸运数字Ⅱ 链接:https://www.nowcoder.com/acm/contest/70/B来源:牛客网     这个题就是找出来数据范围内的所有的幸运数,然后直接区间累加起来就可以了. ...

  6. 牛客练习赛18E pocky游戏 状压dp

    正解:状压dp+辅助dp 解题报告: 来还债辣!NOIp之后还是轻松很多了呢,可以一点点儿落实之前欠下的各种东西一点点提升自己!加油鸭! 是个好题,可以积累套路,启发性强,而且很难 哦而且状压它也是个 ...

  7. 牛客练习赛55 E 树

    题目链接: 题意:给出n个点,n-1条边求任意两个点的距离平方的和 解法: f[i]表示这个点的高度 sz[i]表示这个子树的大小 szz[i]表示这个这个子树大小的平方 sum[i]表示这个子树所有 ...

  8. AcWing:244. 谜一样的牛(树状数组 + 二分)

    有n头奶牛,已知它们的身高为 1~n 且各不相同,但不知道每头奶牛的具体身高. 现在这n头奶牛站成一列,已知第i头牛前面有AiAi头牛比它低,求每头奶牛的身高. 输入格式 第1行:输入整数n. 第2. ...

  9. 牛客练习赛38 D 出题人的手环

    链接 [https://ac.nowcoder.com/acm/contest/358/D] 题意 链接:https://ac.nowcoder.com/acm/contest/358/D 来源:牛客 ...

随机推荐

  1. js 获取对象属性个数

    js 获取对象属性个数 方法一: var attributeCount = function(obj) { var count = 0; for(var i in obj) { if(obj.hasO ...

  2. A1076. Forwards on Weibo

    Weibo is known as the Chinese version of Twitter. One user on Weibo may have many followers, and may ...

  3. A1065. A+B and C (64bit)

    Given three integers A, B and C in [-263, 263], you are supposed to tell whether A+B > C. Input S ...

  4. TestNg 9. 参数化测试-DataProvider参数化

    首先利用@DataProvider(name = "XXX")的属性,将name的值XXX 传递给 @Test(dataProvider = "XXX") 看以 ...

  5. (map 并查集) codeVs 2639 约会计划

    题目描述 Description cc是个超级帅哥,口才又好,rp极高(这句话似乎降rp),又非常的幽默,所以很多mm都跟他关系不错.然而,最关键的是,cc能够很好的调解各各妹妹间的关系.mm之间的关 ...

  6. 微服务框架之微软Service Fabric

    常见的微服务架构用到的软件&组件: docker(成熟应用) spring boot % spring cloud(技术趋势) Service Fabric(属于后起之秀 背后是微软云的驱动) ...

  7. 洛谷P1228 分治

    https://www.luogu.org/problemnew/show/P1228 我真傻,真的,我单知道这种题目可以用dfs剪枝过,没有想到还能构造分治,当我敲了一发dfs上去的时候,只看到一个 ...

  8. ASP.NET的checkboxlist,RadioButtonList,FileUpload,image控件的综合使用

    一.拖控件 控件拖完如图所示:(有些是对不齐的,加一个表单就好了,把他们都放在表单里) 单纯的RadioButton是不能只选择一个的,除非你手动给他们加上代码: RadioButton1.Group ...

  9. 翻译二--创建一个Web测试计划

    这里主要是翻译jmeter官方文档第4章:创建一个基本的测试计划来测试一个网站.你将创建5个用户来发送请求给两个页面,同时,你将告诉用户去执行两次测试.所以,请求的总和是5(users)*2(requ ...

  10. js拼接HTML页面元素a标签遇到的问题

    业务,如下图需要做一个广告轮播的图片链接 使用了ajax请求后台,在js拼接html,关键代码: $("#scroll_img").html(""); for ...