题目大意:给一个整数序列,统计四元组(a,b,c,d)的个数,满足条件1:a<>b<>c<>d;条件2:<a,b>组成一个顺序对,<c,d>组成一个逆序对。(a、b、c、d均为下标)
代码如下:从所有四元组中减去不满足条件的四元组。用顺序对数乘以逆序对数得到只满足条件2的四元组数目sum,从sum减去不满足条件1的四元组数目便是答案。sum中只有四种不满足条件1的情况,即:a=c、a=d、b=c、b=d。四种情况的含义分别为顺序对的左端点与逆序对的左端点相同、顺序对的左端点与逆序对的右端点相同、顺序对的右端点与逆序对的左端点相同、顺序对的右端点与逆序对的右端点相同。维护四个数组A、B、C、D,数组中的位置 i 分别表示以 i 为右端点的顺序、逆序以及以 i 为左端点的顺序、逆序对数,便可计算出相应情况下多余的四元组数目。
这四个数组是通过维护树状数组获得的,但是通过维护线段树却超时啦。。。
代码如下:
# include<iostream>
# include<cstdio>
# include<map>
# include<vector>
# include<cstring>
# include<algorithm>
using namespace std;
# define LL long long const int N=50000; int a[N+5];
map<int,int>mp;
vector<int>v;
int vis[N+5];
int cnt[N+5];
int A[N+5];//以i为右端点的顺序对个数
int B[N+5];//以i为右端点的逆序对个数
int C[N+5];//以i为左端点的顺序对个数
int D[N+5];//以i为左端点的逆序对个数 int lowbit(int x)
{
return x&(-x);
} int query(int x)
{
int res=0;
while(x>=1){
res+=cnt[x];
x-=lowbit(x);
}
return res;
} void update(int x,int n)
{
while(x<=n){
++cnt[x];
x+=lowbit(x);
}
} int main()
{
int n;
while(~scanf("%d",&n))
{
v.clear();
mp.clear();
for(int i=1;i<=n;++i){
scanf("%d",a+i);
v.push_back(a[i]);
}
sort(v.begin(),v.end());
int m=unique(v.begin(),v.end())-v.begin();
for(int i=0;i<m;++i) mp[v[i]]=i+1; memset(cnt,0,sizeof(cnt));
memset(vis,0,sizeof(vis));
LL sum1=0,sum2=0;
for(int i=1;i<=n;++i){
A[i]=query(mp[a[i]]-1);
B[i]=i-1-A[i]-vis[mp[a[i]]];
update(mp[a[i]],m+1);
++vis[mp[a[i]]];
sum1+=A[i];
sum2+=B[i];
} memset(cnt,0,sizeof(cnt));
memset(vis,0,sizeof(vis));
for(int i=n;i>=1;--i){
D[i]=query(mp[a[i]]-1);
C[i]=n-i-D[i]-vis[mp[a[i]]];
update(mp[a[i]],m+1);
++vis[mp[a[i]]];
} LL sum3=0;
for(int i=1;i<=n;++i){
sum3+=(LL)C[i]*(LL)D[i];
sum3+=(LL)C[i]*(LL)B[i];
sum3+=(LL)A[i]*(LL)D[i];
sum3+=(LL)A[i]*(LL)B[i];
}
printf("%lld\n",sum1*sum2-sum3);
}
return 0;
}
线段树的超时代码:
# include<iostream>
# include<cstdio>
# include<map>
# include<vector>
# include<cstring>
# include<algorithm>
using namespace std;
# define LL long long
# define mid (l+(r-l)/2) const int N=50000; int a[N+5];
vector<int>v;
int A[N+5];//以i为右端点的顺序对个数
int B[N+5];//以i为右端点的逆序对个数
int C[N+5];//以i为左端点的顺序对个数
int D[N+5];//以i为左端点的逆序对个数
int tr[N*4+5];
map<int,int>mp; void pushUp(int rt)
{
tr[rt]=tr[rt<<1]+tr[rt<<1|1];
} void build(int rt,int l,int r)
{
tr[rt]=0;
if(l==r) return ;
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
} void update(int rt,int l,int r,int pos)
{
if(l==r)
++tr[rt];
else{
if(pos<=mid) update(rt<<1,l,mid,pos);
else update(rt<<1|1,mid+1,r,pos);
pushUp(rt);
}
} int query(int rt,int l,int r,int L,int R)
{
if(L<=l&&r<=R) return tr[rt];
int res=0;
if(L<=mid) res+=query(rt<<1,l,mid,L,R);
if(R>mid) res+=query(rt<<1|1,mid+1,r,L,R);
return res;
} int main()
{
int n;
while(~scanf("%d",&n))
{
mp.clear();
v.clear();
for(int i=1;i<=n;++i){
scanf("%d",a+i);
v.push_back(a[i]);
}
sort(v.begin(),v.end());
int len=unique(v.begin(),v.end())-v.begin();
for(int i=0;i<len;++i)
mp[v[i]]=i+1;
build(1,0,len+1);
LL sum1=0,sum2=0;
for(int i=1;i<=n;++i){
A[i]=query(1,0,len+1,0,mp[a[i]]-1);
B[i]=query(1,0,len+1,mp[a[i]]+1,len+1);
update(1,0,len+1,mp[a[i]]);
sum1+=A[i];
sum2+=B[i];
}
build(1,0,len+1);
for(int i=n;i>=1;--i){
C[i]=query(1,0,len+1,mp[a[i]]+1,len+1);
D[i]=query(1,0,len+1,0,mp[a[i]]-1);
update(1,0,len+1,mp[a[i]]);
}
LL sum3=0;
for(int i=1;i<=n;++i){
sum3+=(LL)C[i]*(LL)D[i];
sum3+=(LL)C[i]*(LL)B[i];
sum3+=(LL)A[i]*(LL)D[i];
sum3+=(LL)A[i]*(LL)B[i];
}
printf("%lld\n",sum1*sum2-sum3);
}
return 0;
}
HDU-5792 World is Exploding(树状数组)的更多相关文章
-
HDU 5792 World is Exploding 树状数组+枚举
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5792 World is Exploding Time Limit: 2000/1000 MS (Ja ...
-
hdu 5792 World is Exploding 树状数组
World is Exploding 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5792 Description Given a sequence ...
-
hdu 5792 World is Exploding 树状数组+离散化+容斥
World is Exploding Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Other ...
-
HDU 5862 Counting Intersections(离散化+树状数组)
HDU 5862 Counting Intersections(离散化+树状数组) 题目链接http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 D ...
-
hdu 5517 Triple(二维树状数组)
Triple Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Sub ...
-
2016 Multi-University Training Contest 5 1012 World is Exploding 树状数组+离线化
http://acm.hdu.edu.cn/showproblem.php?pid=5792 1012 World is Exploding 题意:选四个数,满足a<b and A[a]< ...
-
HDU 1394 Minimum Inversion Number ( 树状数组求逆序数 )
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 Minimum Inversion Number ...
-
HDU 5862 Counting Intersections (树状数组)
Counting Intersections 题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5862 Description Given ...
-
hdu 5592 ZYB&#39;s Game 树状数组
ZYB's Game Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=55 ...
-
HDU 1394 Minimum Inversion Number (树状数组求逆序对)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 题目让你求一个数组,这个数组可以不断把最前面的元素移到最后,让你求其中某个数组中的逆序对最小是多 ...
随机推荐
-
iOS开发之音频口通信-通过方波来收发数据
之前做过的项目有需要通过音频口通信用方波来收发数据,由于这方面的资料比较少,下面就介绍下其原理,希望能给大家帮助. 一. 音频通信简介大家应该都知道支付宝声波支付和拉卡拉吧,它们都是利用手机的音频口( ...
-
HTML5新特性之Web Worker
1.概述 JavaScript语言采用的是单线程模型,也就是说,所有任务排成一个队列,一次只能做一件事.随着电脑计算能力的增强,这一点带来很大的不便,无法充分发挥JavaScript的潜能.龙其考虑到 ...
-
mysql学习笔记(sqlalchemy安装及简单使用)
博主最近在研究接口API自动化测试,之前设计的通过excel来实现自动化测试的框架实际使用中还是有很多局限性 这次博主的思路是: 1 搭建接口API管理平台 支持数据库方便维护 2 自动化测试平台可直 ...
-
Tomcat性能参数设置
Tomcat性能参数设置 Tomcat性能参数设置 博客分类: Java LinuxTomcat网络应用多线程Socket 默认参数不适合生产环境使用,因此需要修改一些参数 1.修改启动时内存参数.并 ...
-
overload的一点思考
仅参数类型不同的重载方法,使用过程的一个困惑: 有没有必要使用instanceof方法? package overload.special; public class OverLoadTest { p ...
-
Mac中使用svn进行项目管理
Mac中使用svn进行项目管理,借鉴了http://blog.csdn.net/q199109106q/article/details/8655204 下面方案多人亲測可用 转载请注明出处:http: ...
-
Python基础篇(一)
首先需要从Python的官网下载python的安装程序,下载地址为:www.python.org/downloads.最新的版本为3.4.1,下载和操作系统匹配的安装程序并安装即可. 安装好了后,在开 ...
-
delphi GDI 图片压缩代码 据说是位图缩放保持原图视觉效果最好的算法
delphi 图片压缩代码 据说是位图缩放保持原图视觉效果最好的算法 若有更好的,请大神留言我也学习下,感谢! uses WinAPI.GDIPAPI, WinAPI.GDIPOBJ; var Bi ...
-
华为oj之求int型正整数在内存中存储时1的个数
题目: 求int型正整数在内存中存储时1的个数 热度指数:4427 时间限制:1秒 空间限制:32768K 题目描述 输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数. 输入描述: ...
-
memcached----------linux下安装memcached,以及php的memcached扩展。
1.通过wget http://www.memcached.org/files/memcached-1.4.24.tar.gz下载最新源码2.解压tar -xf memcached-1.4.24.ta ...