poj--3928--ping pong
2013-02-28 12:44
295 查看
一个树状数组的题目:点击打开链接
扫描a[i],用x数组标记曾经出现过的a[i]值,每扫描一个a[i],就更新一次c数组(记录前缀和的数组)。
数据结构参考刘汝佳白书
扫描a[i],用x数组标记曾经出现过的a[i]值,每扫描一个a[i],就更新一次c数组(记录前缀和的数组)。
数据结构参考刘汝佳白书
#include<iostream> #include<cstring> #include<cstdio> #define maxn 100020 #define M(a) memset((a),0,sizeof(a)) using namespace std; int n; int a[maxn],c[maxn]; int x[maxn]; int mal[maxn],mar[maxn],mil[maxn],mir[maxn]; long long ans; int lowbit(int x) { return x&-x; } int sum(int x) { int r=0; while(x>0) { r+=c[x]; x-=lowbit(x); } return r; } void call(int x) { mil[x]=sum(a[x])-1; mal[x]=x-mil[x]-1; } void calc(int d) { while(d<=maxn) //注意更新的上界 { c[d]+=1; d+=lowbit(d); } } void calr(int x) { mir[x]=sum(a[x])-1; mar[x]=n-x-mir[x]; } void slove() { M(x);M(c);M(mal);M(mar);M(mil);M(mir); for(int i=1;i<=n;i++) { x[a[i]]=1; calc(a[i]); call(i); } M(x);M(c); for(int i=n;i>0;i--) { x[a[i]]=1; calc(a[i]); calr(i); } #ifdef debug cout<<"mil: "; for(int i=1;i<=n;i++) printf("%d ",mil[i]);cout<<endl; cout<<"mar: "; for(int i=1;i<=n;i++) printf("%d ",mar[i]);cout<<endl; cout<<"mal: "; for(int i=1;i<=n;i++) printf("%d ",mal[i]);cout<<endl; cout<<"mir: "; for(int i=1;i<=n;i++) printf("%d ",mir[i]);cout<<endl; #endif for(int i=2;i<n;i++) { ans+=mil[i]*mar[i]+mal[i]*mir[i]; } printf("%lld\n",ans); } int main() { int T; #ifdef filein freopen("4329.txt","r",stdin); #endif scanf("%d",&T); while(T--) { ans=0; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); slove(); } return 0; }
相关文章推荐
- Poj 3928 Ping pong(树状数组)
- poj 3928 Ping pong 树状数组
- poj 3928 Ping pong(离散化+树状数组)
- POJ 3928 Ping pong
- POJ 3928 Ping pong 树状数组模板题
- POJ 3928 Ping pong 树状数组
- poj 3928 Ping pong 树状数组
- POJ 3928 Ping Pong
- poj 3928——Ping pong
- POJ 3928 Ping pong(树状数组基础题)
- poj 3928 Ping pong
- poj 3928 Ping pong
- POJ 3928 Ping pong(树状数组)
- POJ 3928 Ping pong(树状数组基础题)
- Poj 3928 Ping pong 树状数组
- POJ-3928 Ping pong 线段树 | 树状数组
- poj 3928 Ping pong(树状数组)
- POJ 3928 Ping pong(树状数组)
- poj 3928 ping pong 树状数组
- POJ 3928 - Ping pong