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

树状数组:

#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. 使用POI循环写入数据时发现只有最后一列有数据

    直接说重点: 一般出现在多重(一般是两重)循环,再多几重效率就很低了. 检查调用createRow() 是否在外层循环调用的,如果是在内层循环调用就会出现这个问题,因为程序会不停的重新创建行,直至最后 ...

  2. 牛客网暑期ACM多校训练营(第一场)J Different Integers(树状数组, 离线)

    题意: 给定n个数字, 然后给出m个区间, 求区间外其他数字的种类有多少. 分析: 将区间以r为基准升序排序, 每次处理pre~r的数字第一次出现的位置. #include<bits/stdc+ ...

  3. Oc_总结

    1.定义类: @interface 类名 : 父类 @end 2.使用:(冒号)表示继承一个类 Student : NSObject 3.使用()定义一个Catagory(类别) * 作用:在不改变原 ...

  4. 使用systemctl命令管理服务mysql

    启动mysql systemctl start mysqld.service 停止mysql systemctl stop mysqld.service 重启mysql systemctl resta ...

  5. 4C. Stars

    4C. Stars Time Limit: 2000ms Case Time Limit: 2000ms Memory Limit: 65536KB   64-bit integer IO forma ...

  6. numpy split()

    numpy.split(ary, indices_or_sections, axis=0)[source] Split an array into multiple sub-arrays. 将一个ar ...

  7. 网页QQ唤起

    网页QQ唤起 <html> <head> <meta http-equiv="Content-Type" content="text/htm ...

  8. 九度oj 题目1385:重建二叉树

    题目描述: 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7 ...

  9. DataTable排序

    DataRow[] rows = dt.Select("", "name asc");   DataTable t = dt.Clone();   t.Clea ...

  10. 【Luogu】P2530化工厂装箱员(DP)

    题目链接 不知道做出这道题是我能力的一个提升还是能力的回归. DP.设f[i][j][k][l]是已经取了i个产品,现在手里还拿着j件A,k件B,l件C,最小的操作数. 然后状转方程乱搞啊 #incl ...