站队(test05)
2016-09-28 19:37
309 查看
Problem:
给定一个长度为n的队列,求它是第几种站队方式(从矮到高认为是第一种,从高到矮认为是最后一种)
1<n<105
100.0000<ai<200.0000
Solution:
一看就是康托展开,但由于数据范围我们要对其进行优化,在寻找当前元素是第几位时,O(剩余元素个数)查找很不优雅,自然我们想到用数据结构(树状数组,线段树,平衡树)进行优化。查找复杂度降为log(剩余元素个数)级别。
下面是代码(树状数组):
给定一个长度为n的队列,求它是第几种站队方式(从矮到高认为是第一种,从高到矮认为是最后一种)
1<n<105
100.0000<ai<200.0000
Solution:
一看就是康托展开,但由于数据范围我们要对其进行优化,在寻找当前元素是第几位时,O(剩余元素个数)查找很不优雅,自然我们想到用数据结构(树状数组,线段树,平衡树)进行优化。查找复杂度降为log(剩余元素个数)级别。
下面是代码(树状数组):
#include <stdio.h> #include <algorithm> using namespace std; typedef long long LL; #define mod 1000000007 #define lowbit(x) ((x)&(-x)) LL n,t[100001],ans,fac[100001],res; struct data { double val; int pos,id; }person[100001]; bool cmp(data x,data y) { return x.val<y.val; } bool cmp1(data x,data y) { return x.pos<y.pos; } void Update(int x,int c) { for(int i=x; i<=100000; i+=lowbit(i)) t[i]+=c; } LL getpos(LL x) { LL pos=0; for(int i=x; i; i-=lowbit(i)) pos+=t[i]; return pos; } LL getans(LL x) { LL ans=(getpos(person[x].id)-1)%mod*fac[n-x]%mod; return ans; } int main() { scanf("%I64d",&n); for(int i=1; i<=n; i++) { scanf("%lf",&person[i].val); person[i].pos=i; } fac[0]=1; for(int i=1; i<=n; i++) fac[i]=fac[i-1]%mod*i%mod; sort(person+1,person+n+1,cmp); for(int i=1; i<=n; i++) person[i].id=i; sort(person+1,person+n+1,cmp1); for(int i=1; i<=n; i++) Update(i,1); for(int i=1; i<=n; i++) { (res+=getans(i))%=mod; Update(person[i].id,-1); } printf("%I64d",res+1); return 0; }
相关文章推荐
- 文章标题
- 第5周项目2-建立链栈算法库
- jquery选择器 之 获取父级元素、同级元素、子元素
- Docke 1.12 基础篇:48条命令(6)
- chrome被hao123劫持,篡改主页
- C Primer Plus学习 二
- 立体视觉:算法和应用(七)
- Android Studio该如何创建虚拟机呢?包括错误无法启动虚拟机
- 数据库与表的操作之创建、修改和删除数据
- Codis 使用
- 【BZOJ-4082】Surveillance 树链剖分 LCA + 贪心
- Mac 下两款 Markdown 编辑器 Mou/MacDown
- Hawq学习笔记 --- How to access HDFS data via GPDB external table with gphdfs protocol
- hdu 2063 过山车【二分图匹配,ver匈牙利
- UVa11520-Fill the Square
- Android 拦截 LinearLayout RelativeLayout ViewGroup 监听 传递到下面布局
- VR 触摸板模拟上下左右按键
- 很不错的Map工具类
- RE:从零开始的数据结构生活
- 【JZOJ 4799】我的快乐时代