ZROI2018提高day6t1
分析
我们发现这个四元组可以分解成一个逆序对拼上一个顺序对,这个线段树搞搞然后乘一下就可以求出来了,但是我们发现可能有(a,b)为逆序对且(b,c)为顺序对的情况,所以要进行容斥,我们只需要枚举是哪一个点重合然后减掉即可。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
long long a[],b[],d[],sum,d1[];
long long S1[],S2[],S11[],S21[];
map<long long,long long>id;
inline void add(long long le,long long ri,long long wh,long long pl,long long k){
d[wh]+=k;
if(le==ri)return;
long long mid=(le+ri)>>;
if(mid>=pl)add(le,mid,wh<<,pl,k);
else add(mid+,ri,wh<<|,pl,k);
return;
}
inline void add2(long long le,long long ri,long long wh,long long pl,long long k){
d1[wh]+=k;
if(le==ri)return;
long long mid=(le+ri)>>;
if(mid>=pl)add2(le,mid,wh<<,pl,k);
else add2(mid+,ri,wh<<|,pl,k);
return;
}
inline long long q(long long le,long long ri,long long x,long long y,long long wh){
if(x>y)return ;
if(le>=x&&ri<=y)return d[wh];
long long mid=(le+ri)>>,ans=;
if(mid>=x)ans+=q(le,mid,x,y,wh<<);
if(mid<y)ans+=q(mid+,ri,x,y,wh<<|);
return ans;
}
inline long long q2(long long le,long long ri,long long x,long long y,long long wh){
if(x>y)return ;
if(le>=x&&ri<=y)return d1[wh];
long long mid=(le+ri)>>,ans=;
if(mid>=x)ans+=q2(le,mid,x,y,wh<<);
if(mid<y)ans+=q2(mid+,ri,x,y,wh<<|);
return ans;
}
int main(){
long long n,m,i,j,k,sum1=,sum2=;
scanf("%lld",&n);
id.clear();
for(i=;i<=n;i++)scanf("%lld",&a[i]),b[i]=a[i];
sort(b+,b+n+);
for(i=;i<=n;i++)
if(!id[b[i]])
id[b[i]]=++sum;
for(i=;i<=n;i++){
long long x=q(,sum,,id[a[i]]-,),y=q(,sum,id[a[i]]+,sum,);
sum1+=x;sum2+=y;
add(,sum,,id[a[i]],);
}
long long Ans=(long long)sum1*sum2;
memset(d,,sizeof(d));
memset(d1,,sizeof(d1));
for(i=;i<=n;i++){
S1[i]=q(,sum,,id[a[i]]-,);
S11[i]=q(,sum,id[a[i]]+,sum,);
add(,sum,,id[a[i]],);
}
for(i=n;i>;i--){
S2[i]=q2(,sum,,id[a[i]]-,);
S21[i]=q2(,sum,id[a[i]]+,sum,);
add2(,sum,,id[a[i]],);
}
for(i=;i<=n;i++)
Ans-=(long long)S1[i]*S2[i]+(long long)S11[i]*S1[i]+(long long)S21[i]*S2[i]+(long long)S21[i]*S11[i];
printf("%lld\n",Ans);
return ;
}
ZROI2018提高day6t1的更多相关文章
- ZROI2018提高day9t1
传送门 分析 我们首先想到的自然是根据大小关系建图,在这之后我们跑一遍拓扑排序 但是由于l和r的限制关系我们需要对传统的拓扑排序做一些改变 我们考虑将所有入度为0且现在的拓扑序号已经大于等于l的点放入 ...
- ZROI2018提高day6t2
传送门 分析 将所有字母分别转化为1~26,之后将字符串的空位补全为0,?设为-1,我们设dp[p][c][le][ri]表示考虑le到ri个字符串且从第p位开始考虑,这一位最小填c的方案数,具体转移 ...
- ZROI2018提高day5t3
传送门 分析我们可以根据性质将这个序列构造成一个环:0,a[1~n],0,a[n~1] 这中间的0是为了起间隔作用的. 我们又知道b[i]=a[i-1]^a[i+1] c[i]=b[i-1]^b[i+ ...
- ZROI2018提高day5t2
传送门 分析 考场上傻了,写了个树剖还莫名weila...... 实际就是按顺序考虑每个点,然后从他往上找,一边走一边将走过的边染色,如果走到以前染过色的边就停下.对于每一个a[i]的答案就是之前走过 ...
- ZROI2018提高day5t1
传送门 分析 我们不难将条件转换为前缀和的形式,即 pre[i]>=pre[i-1]*2,pre[i]>0,pre[k]=n. 所以我们用dp[i][j]表示考虑到第i个数且pre[i]= ...
- ZROI2018提高day4t3
传送门 分析 我们假设如果一个点是0则它的值为-1,如果一个点是1则值为1,则一个区间的答案便是max(pre[i]+sur[i]),这里的pre[i]表示此区间i点和它之前的的前缀的最大值,sur[ ...
- ZROI2018提高day4t2
传送门 分析 我们二分球的直径,然后就像奶酪那道题一样,将所有距离相遇直径的点用并查集连在一起,然后枚举所有与上边的顶距离小于直径的点和所有与下边的距离小于直径的点,如果它们被并查集连在一起则代表这个 ...
- ZROI2018提高day4t1
传送门 分析 一道贪心题,我们用两个优先队列分别维护卖出的物品的价格和买入但没有卖出的物品的价格,然后逐一考虑每一个物品.对于每一个物品如果他比卖出的物品中的最低个价格,则改将现在考虑的物品卖出,将之 ...
- ZROI2018提高day3t3
传送门 分析 我们对于每一个可以匹配的字符都将其从栈中弹出,然后他的哈希值就是现在栈中的字符哈希一下.然后我们便可以求出对于哪些位置它们的哈希值是一样的,即它们的状态是一致的.而这些点可以求出它们的贡 ...
随机推荐
- 微信浏览器HTTP_USER_AGENT判断
微信公众平台开发 微信公众平台开发者 微信公众平台开发模式 微信浏览器 HTTP_USER_AGENT作者:方倍工作室 原文:http://www.cnblogs.com/txw1958/archiv ...
- Nhibernate系列学习之(五) 存储过程
NHibernate也是能够操作存储过程的,不过第一次配置可能会碰到很多错误. 一.删除 首先,我们新建一个存储过程如下: CREATE PROC DeletePerson @Id int AS DE ...
- hihocoder 1049 后序遍历树
#include<cstdio> #include<cstdlib> #include<iostream> #include<cstring> #inc ...
- Python函数-abs()
说明: 返回绝对值 参数可以是:负数.正数.浮点数或者长整形 实例: abs(-1.2) #返回 1.2 abs(1.2) #返回 1.2 abs(-11216.5) #返回 11216.5 abs( ...
- VC 6.0下载 VC 6.0英文版下载 Visual C++ 6.0 英文企业版 集成SP6完美版(最新更新地址,百度网盘)
下载地址1:Visual.C++.6.EN 下载地址2:Visual.C++.6.EN 更新下载地址可用(百度网盘)Visual.C++.6.EN 转载请注明出处,有技术问题,欢迎互相交流,或者留言.
- BZOJ2716:[Violet 3]天使玩偶
浅谈离线分治算法:https://www.cnblogs.com/AKMer/p/10415556.html 题目传送门:https://lydsy.com/JudgeOnline/problem.p ...
- 解决IDEA输入法不跟随
1.关掉idea后在idea的安装路径下把jre64文件夹删掉,或者重命名也行,如把jre64改成jre642: 2.升级jdk版本至jdk 8u45以上 3.把Java安装路径下的jre文件拷贝到I ...
- 蓝桥杯 历届试题 PREV-32 分糖果
历届试题 分糖果 时间限制:1.0s 内存限制:256.0MB 问题描述 有n个小朋友围坐成一圈.老师给每个小朋友随机发偶数个糖果,然后进行下面的游戏: 每个小朋友都把自己的糖果分一半给左手边 ...
- Anti-pattern(反模式)
常见的与“直觉”相背离的 anti-pattern 产生的实际原因是我们没有深入全面地考虑问题. 即只关注到自己关心的方面,忽略了其他重要的.恰好起相反作用的因素. 所以这个“直觉”是不成熟.不全面的 ...
- 【转】 Pro Android学习笔记(八四):了解Package(3):包间数据共享
目录(?)[-] 共享User ID的设置 共享资源例子 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowing ...