開始用瓜神说的方法撸了一发线段树。早上没事闲的看了一下树状数组的方法,于是又写了一发树状数组

树状数组:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <climits>
#include <string>
#include <iostream>
#include <map>
#include <cstdlib>
#include <list>
#include <set>
#include <queue>
#include <stack>
using namespace std;
#define INF 0xfffffff
const int maxn=100010;
typedef long long LL;
int c[maxn],lmin[maxn],lmax[maxn],rmin[maxn],rmax[maxn],a[maxn];
int lowbit(int x)
{
return x&(-x);
}
void update(int i,int l)
{
while(i<maxn)
{
c[i]+=l;
i+=lowbit(i);
}
}
int sum(int i)
{
int ans=0;
while(i>0)
{
ans+=c[i];
i-=lowbit(i);
}
return ans;
}
int main()
{
int t,n;
cin>>t;
while(t--)
{
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
memset(c,0,sizeof(c));
for(int i=1;i<=n;i++)
{
update(a[i],1);
lmin[i]=sum(a[i]-1);
lmax[i]=i-1-lmin[i];
//cout<<lmin[i]<<" "<<lmax[i]<<endl;
}
memset(c,0,sizeof(c));
for(int i=n;i>=1;i--)
{
update(a[i],1);
rmin[i]=sum(a[i]-1);
rmax[i]=n-i-rmin[i];
//cout<<rmin[i]<<" "<<rmax[i]<<endl;
}
LL ans=0;
for(int i=1;i<=n;i++)
{
ans+=lmin[i]*rmax[i];
ans+=lmax[i]*rmin[i];
}
cout<<ans<<endl;
}
return 0;
}

线段树:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <climits>
#include <string>
#include <iostream>
#include <map>
#include <cstdlib>
#include <list>
#include <set>
#include <queue>
#include <stack>
using namespace std;
#define INF 0xfffffff
typedef long long LL;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define maxn 100000+10
int a[maxn];
int sum[maxn<<2],zmax[maxn],zmin[maxn],ymax[maxn],ymin[maxn];
void pushup(int rt)
{
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void build(int l,int r,int rt)
{
sum[rt]=0;
if(l==r) return ;
int m=(l+r)>>1;
build(lson);
build(rson);
}
int ask(int L,int R,int l,int r,int rt)
{
if(L<=l&&R>=r) return sum[rt];
int m=(l+r)>>1;
int ans=0;
if(L<=m) ans+=ask(L,R,lson);
if(R>m) ans+=ask(L,R,rson);
return ans;
}
void update(int pos,int add,int l,int r,int rt)
{
if(l==r)
{
sum[rt]=1;
return ;
}
int m=(l+r)>>1;
if(pos<=m) update(pos,add,lson);
else update(pos,add,rson);
pushup(rt);
}
int main()
{
int t;
cin>>t;
int n;
while(t--)
{
cin>>n;
int Max=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
Max=max(Max,a[i]);
}
build(1,Max,1);
for(int i=1;i<=n;i++)
{
zmin[i]=ask(1,a[i],1,Max,1);
zmax[i]=ask(1,Max,1,Max,1)-zmin[i];
update(a[i],1,1,Max,1);
}
build(1,Max,1);
for(int i=n;i>=1;i--)
{
ymin[i]=ask(1,a[i],1,Max,1);
ymax[i]=ask(1,Max,1,Max,1)-ymin[i];
update(a[i],1,1,Max,1);
}
LL ans=0;
for (int i = 1; i <= n; i++)
{
ans += zmin[i] * ymax[i];
ans += zmax[i] * ymin[i];
}
cout<<ans<<endl;
}
return 0;
}

POJ 3928 Ping pong 树状数组模板题的更多相关文章

  1. HDU 1166 敌兵布阵(线段树/树状数组模板题)

    敌兵布阵 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submi ...

  2. poj3928 Ping pong 树状数组

    http://poj.org/problem?id=3928 Ping pong Time Limit: 1000MS   Memory Limit: 65536K Total Submissions ...

  3. Ping pong(树状数组经典)

    Ping pong Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  4. UVA 1428 - Ping pong(树状数组)

    UVA 1428 - Ping pong 题目链接 题意:给定一些人,从左到右,每一个人有一个技能值,如今要举办比赛,必须满足位置从左往右3个人.而且技能值从小到大或从大到小,问有几种举办形式 思路: ...

  5. LA 4329 Ping pong 树状数组

    对于我这样一名脑残ACMer选手,这道题看了好久好久大概4天,终于知道怎样把它和“树状数组”联系到一块了. 树状数组是什么意思呢?用十个字归纳它:心里有数组,手中有前缀. 为什么要用树状数组?假设你要 ...

  6. LA4329 Ping pong 树状数组

    题意:一条大街上住着n个乒乓球爱好者,经常组织比赛切磋技术.每个人都有一个能力值a[i].每场比赛需要三个人:两名选手,一名裁判.他们有个奇怪的约定,裁判必须住在两名选手之间,而裁判的能力值也必须在两 ...

  7. UVALive - 4329 Ping pong 树状数组

    这题不是一眼题,值得做. 思路: 假设第个选手作为裁判,定义表示在裁判左边的中的能力值小于他的人数,表示裁判右边的中的能力值小于他的人数,那么可以组织场比赛. 那么现在考虑如何求得和数组.根据的定义知 ...

  8. 敌兵布阵 HDU - 1166 (树状数组模板题,线段树模板题)

    思路:就是树状数组的模板题,利用的就是单点更新和区间求和是树状数组的强项时间复杂度为m*log(n) 没想到自己以前把这道题当线段树的单点更新刷了. 树状数组: #include<iostrea ...

  9. POJ 3321 Apple Tree 树状数组 第一题

    第一次做树状数组,这个东西还是蛮神奇的,通过一个简单的C数组就可以表示出整个序列的值,并且可以用logN的复杂度进行改值与求和. 这道题目我根本不知道怎么和树状数组扯上的关系,刚开始我想直接按图来遍历 ...

随机推荐

  1. Linux 权限设置和 SUID, SGID 以及粘滞位sticky bit

    suid是指在执行suid程序的过程中,去访问其他文件时拥有suid程序属主的权限,而不是指对suid程序本身拥有suid程序属主的权限! 一. Linux 文件权限的表示方法 文件权限用 12 个二 ...

  2. HDU 2829 斜率优化DP Lawrence

    题意:n个数之间放m个障碍,分隔成m+1段.对于每段两两数相乘再求和,然后把这m+1个值加起来,让这个值最小. 设: d(i, j)表示前i个数之间放j个炸弹能得到的最小值 sum(i)为前缀和,co ...

  3. Mac下Python和Pycharm之virtualenv

    一.python如何配置virtualenv   1.安装virtualenv pip3 install virtualenvpip install -i https://pypi.tuna.tsin ...

  4. Python第三方库之openpyxl(4)

    Python第三方库之openpyxl(4) 2D柱状图 在柱状图中,值被绘制成水平条或竖列. 垂直.水平和堆叠柱状图. 注意:以下设置影响不同的图表类型 1.在垂直和水平条形图之间切换,分别设置为c ...

  5. [SQL server] IF ELSE 和 CASE WHEN 的用法

    /*判断一个数如果大于10,按10统计,如果小于0,按0统计*/ --方法a DECLARE @AA INT SET @AA=15 IF @AA>10 SELECT 10 ELSE IF @AA ...

  6. win10关闭防火墙命令

    NetSh Advfirewall set allprofiles state off #关闭防火墙 Netsh Advfirewall show allprofiles #查看防火墙状态

  7. Android点击两次返回退出程序

    代码改变世界 Android点击两次返回退出程序 private long mExitTime; public boolean onKeyDown(int keyCode, KeyEvent even ...

  8. 雅礼培训4.3 Problem A 【点分治】

    题目简述 一个\(N\)个节点的树,有\(M\)个炸弹分布在一些节点上,有各自的威力,随着其他点距离增大对其他点的伤害呈等差减小,直至为0 问每个点受到的伤害 题解 QAQ考场代码没处理好有些炸弹威力 ...

  9. 【双向bfs】2017多校训练十 HDU 6171 Admiral

    [题意] 现在给出一个三角矩阵,如果0编号的在点(x,y)的话,可以和(x+1,y),(x-1,y),(x+1,y+1),(x-1,y-1)这些点进行交换. 我们每一次只能对0点和其他点进行交换.问最 ...

  10. 服务器内部转发forward,action到action

    如果request.getRequestDispatcher();中不是页面而是传action的话,参考以下内容修改: web.xml 2.4版本里,默认的filter只拦截request. 如果使用 ...