BZOJ2837 : 小强的形状
离散化后通过树状数组求出:
b[i]为i之前比它小的。
c[i]为i之前比它大的=i-1-i之前小于等于它的。
d[i]为i之后比它小的。
e[i]为i之后比它大的=n-i-f[i]。
f[i]为i之后小于等于它的。
则:
$cnt_{123}=\sum_{i=1}^n b[i]e[i]$
$cnt_{321}=\sum_{i=1}^n c[i]d[i]$
$cnt_{213}$=将序列a翻转后的$cnt_{312}$
$cnt_{231}$=将序列a翻转后的$cnt_{132}$
$cnt_{312}=\sum_{i=1}^n b[i]c[i]-cnt_{132}$
$cnt_{132}$可以这样计算:
枚举$3$的位置$i$,它右边比它小的$k$有$b[k]$的贡献,还要减去$i$右下角内$12$形状的二元组的个数,即右下角$b[k]+f[k]$的和$-C_{d[i]}^2$。
时间复杂度$O(n\log n)$。
#include<cstdio>
#include<algorithm>
#define N 100010
typedef long long ll;
int n,i,a[N],b[N],c[N],d[N],e[N],f[N];ll bit[N],c1,c2,c3,c4,c5,c6,all;
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline int lower(int x){
int l=1,r=n,mid,t;
while(l<=r)if(b[mid=(l+r)>>1]<=x)l=(t=mid)+1;else r=mid-1;
return t;
}
inline void add(int x,int y){for(;x<=n;x+=x&-x)bit[x]+=y;}
inline ll ask(int x){ll t=0;for(;x;x-=x&-x)t+=bit[x];return t;}
void write(ll x){for(printf("0."),i=0;i<20;i++)x*=10,printf("%d",x/all),x%=all;puts("");}
int main(){
for(read(n),i=1;i<=n;i++)read(a[i]),b[i]=a[i];
for(std::sort(b+1,b+n+1),i=1;i<=n;i++)a[i]=lower(a[i]);
for(i=1;i<=n;i++)b[i]=ask(a[i]-1),c[i]=i-1-ask(a[i]),add(a[i],1);
for(i=1;i<=n;i++)bit[i]=0;
for(i=n;i;i--)d[i]=ask(a[i]-1),f[i]=ask(a[i]),e[i]=n-i-f[i],add(a[i],1);
for(i=1;i<=n;i++)bit[i]=0;
for(i=n;i;i--){
c1+=1LL*b[i]*e[i],c6+=1LL*c[i]*d[i];
c5+=1LL*b[i]*c[i],c2+=ask(a[i]-1)-1LL*d[i]*(d[i]-1)/2,add(a[i],b[i]+f[i]);
}
c5-=c2;
for(i=1;i<n-i+1;i++)std::swap(a[i],a[n-i+1]);
for(i=1;i<=n;i++)bit[i]=0;
for(i=1;i<=n;i++)b[i]=ask(a[i]-1),c[i]=i-1-ask(a[i]),add(a[i],1);
for(i=1;i<=n;i++)bit[i]=0;
for(i=n;i;i--)d[i]=ask(a[i]-1),f[i]=ask(a[i]),add(a[i],1);
for(i=1;i<=n;i++)bit[i]=0;
for(i=n;i;i--)c3+=1LL*b[i]*c[i],c4+=ask(a[i]-1)-1LL*d[i]*(d[i]-1)/2,add(a[i],b[i]+f[i]);
c3-=c4;
all=c1+c2+c3+c4+c5+c6;
write(c1),write(c2),write(c3),write(c4),write(c5),write(c6);
return 0;
}
BZOJ2837 : 小强的形状的更多相关文章
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- 关于Three.js基本几何形状之SphereGeometry球体学习
一.有关球体SphereGeometry构造函数参数说明 <1>.SphereGeometry(radius, widthSegments, heightSegments, phiStar ...
- Css3新特性应用之形状
一.自适应椭圆 * border-radius特性: * 可以单独指定水平和垂直半径,并且值可以是百分比,用/(斜杠)分隔这两个值即可(可以实现自适应宽度椭圆). * 还可以单独指定四个角 ...
- Html中自定义鼠标的形状
Html中自定义鼠标的形状 <html> <head> <title>自定义的鼠标形状</title> <meta http-equiv=&quo ...
- visio二次开发——图纸解析之形状
今天有空,下班前补齐解析visio图形形状的方法,包含图形背景色.字体颜色.备注信息.形状数据取值. /// <summary> /// 设置形状的选择属性 /// </summar ...
- C# PPT 为形状设置三维效果
在PPT中,形状是非常重要的元素.3-D形状,立体多元,给人耳目一新的感觉.在幻灯片中添加3-D效果形状,必然会为PPT的整体效果增色不少.为形状设置三维格式时,可设置棱台,轮廓线,表面效果等. 本篇 ...
- 使用css打造形形色色的形状!
使用css打造形形色色的形状! css是非常强大的工具,如果我们掌握的好,那么许多复杂的形状不需要使用图片而直接使用css完成即可,这不仅有利于减少http请求以增强性能还便于日后的管理和维护,一举两 ...
- MFC 鼠标 移动到某控件时 修改鼠标形状为手的形状
响应窗体的 OnSetCursor 消息响应 鼠标移动到某空间时改变 形状 BOOL CQQBulkDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT m ...
- CSS/HTML 改变鼠标指针形状
改变鼠标指针形状的方法有两种:第一种:用的来改变鼠标指针形状.另一种是:利用第三方控件的方法,而我自己最常用的是第一种:用css样式表来改变鼠标指针形状 我们先来看第一种:用来改变鼠标指针形状. 有些 ...
随机推荐
- linux /etc/rc.d/目录的详解
rc.d的内容如下: init.d/ :各种服务器和程序的二进制文件存放目录. rcx.d/: 各个启动级别的执行程序连接目录.里头的东西都是指向init.d/的一些软连接.具体的后边叙述. 还有三个 ...
- 将XML解析成DOM文档
在支持html5的浏览其中,可以使用标准解析器DOMParser对象进行解析html或者xml等字符串 var data = '<div></div>'; var tmp = ...
- MVC(Model(模型) View(视图) Controller(控制器))
复习 1. 商品表 增删改查 index.php add.php view.php edit.php action.php 2. MVC(Model(模型) Vie ...
- echart所有汉字都显示中文,就echarts的toolbox注释显示乱码
echarts无所谓支不支持gbk编码这么一说,关键是页面的charset和echarts.js文件的charset是否匹配,如果不匹配,请使用如下方式引入: <script src=" ...
- 【转】如何用 Chrome for Android 做远程遥控 debugging
http://blog.csdn.net/wuchengzhi82/article/details/22190435
- Java for LeetCode 187 Repeated DNA Sequences
All DNA is composed of a series of nucleotides abbreviated as A, C, G, and T, for example: "ACG ...
- Java for LeetCode 143 Reorder List
Given a singly linked list L: L0→L1→…→Ln-1→Ln, reorder it to: L0→Ln→L1→Ln-1→L2→Ln-2→… You must do th ...
- codeforces A. Puzzles 解题报告
题目链接:http://codeforces.com/problemset/problem/337/A 题意:有n个学生,m块puzzles,选出n块puzzles,但是需要满足这n块puzzles里 ...
- MyBatis的foreach语句详解
foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合.foreach元素的属性主要有 item,index,collection,open,separator,close.it ...
- MVC模式简介
MVC模式是一种表现模式,它将web应用程序分成三个主要部分即:模型(Model)视图(View)控制器(Controller)M:Model主要是存储或者是处理数据的模型,包含了用户使用的数据,业务 ...