cogs 数列
2014-03-17 23:32
169 查看
树状数组入门级习题 。。。。。
题目链接http://218.28.19.228/cogs/problem/problem.php?pid=859
题目链接http://218.28.19.228/cogs/problem/problem.php?pid=859
/* 一眼就看出来了就是逆序对的变种。在逆序对中, 树状数组c[a[i]]保存的是在a[i]之前的不大于a[i]的数的个数, 注意这里包括a[i本身,但这题呢不能等于,而且不包括本身。。 有个好的解决方法,就是先把每个数+1,在进行修改操作时对加1后的数 操作,但在“求和”操作时,要对原来的数操作。 画几下,就发现这样做保证了计的数都是比a[i]小的! */ #include<stdio.h> #include<string.h> #define MAXN 50010 int n,c[MAXN],f[MAXN],a[MAXN],g[MAXN]; int lowbit(const int &x) { return x&-x; } int getsum(const int &x) { int cnt=0; for (int i=x;i>0;i-=lowbit(i)) cnt+=c[i]; return cnt; } void modify(const int &x,const int &delta) { for (int i=x;i<33000;i+=lowbit(i)) c[i]+=delta; } int main() { int i,x; double ans=0; freopen("queueb.in","r",stdin); freopen("queueb.out","w",stdout); scanf("%d",&n); for (i=1;i<=n;++i) { scanf("%d",&a[i]); a[i]+=1; } for (i=1;i<=n;++i) { modify(a[i],1); f[i]=getsum(a[i]-1); //注意是a[i]-1,不是a[i] } memset(c,0,sizeof(c)); for (i=n;i>0;--i) { modify(a[i],1); g[i]=getsum(a[i]-1);//注意是a[i]-1,不是a[i] } for (i=2;i<n;++i) ans+=f[i]*g[i]; printf("%.lf\n",ans); //while(1); return 0; }
相关文章推荐
- COGS 2638. 数列操作ψ 线段树
- 数列 COGS1048:[Citric S2] 一道防AK好题
- COGS 859. 数列
- 【COGS-2638】数列操作ψ 线段树
- 【cogs240】数列操作【线段树】
- COGS——C66. [HAOI2004模拟] 数列问题
- [bzoj1500][luogu2042][cogs339][codevs1758]维修数列(维护数列)
- 数据结构(Splay平衡树):COGS 339. [NOI2005] 维护数列
- [COGS2632] [HZOI 2016] 数列操作d
- cogs 859 数列【线段树】
- 斐波那契数数列
- 斐波那契数列
- 【NOIP2013模拟联考7】数列
- 图论(网络流,分数规划):COGS 2047. [ZOJ2676]网络战争
- 【BZOJ4636】蒟蒻的数列【扫描线】【set】
- 【BZOJ-4636】蒟蒻的数列 动态开点线段树 ||(离散化) + 标记永久化
- PAT-B 1030. 完美数列
- 状压DP——彩虹小马与魔法数列
- 5-38 数列求和-加强版 (20分)
- HACM2009 求数列的和