description


analysis

  • 首先不管\(a,b,c,d\)重复的情况方案数是正逆序对之积

  • 如果考虑\(a,b,c,d\)有重复,只有四种情况,下面括号括起来表示该位置重复

  • 比如\(\{a,(b,c),d\}\),其中\(b=c,S_a<S_b,S_c>S_d\)

  • 还有\(\{(a,c),b,d\}\),\(\{a,c,(b,d)\}\),\(\{c,(a,d),b\}\),注意前两种不在括号内的数可以互换

  • 那么扫两次,用数据结构维护在某个位置前面或后面比该数大或小的数

  • 于是拿总方案减掉四种不合法的方案数,这个直接用维护出来的数求

  • 由于我很蠢笨树状数组都不会只能用线段树苟且偷生


code

#pragma GCC optimize("O3")
#pragma G++ optimize("O3")
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define MAXN 100005
#define ll long long
#define reg register ll
#define max(x,y) ((x>y)?(x):(y))
#define min(x,y) ((x<y)?(x):(y))
#define fo(i,a,b) for (reg i=a;i<=b;++i)
#define fd(i,a,b) for (reg i=a;i>=b;--i) using namespace std; ll tr[MAXN<<2],b[MAXN],c[MAXN];
ll premx[MAXN],premn[MAXN],sufmx[MAXN],sufmn[MAXN];
ll n,m,ans,ans1; struct node
{
ll x,id;
}a[MAXN]; inline ll read()
{
ll x=0,f=1;char ch=getchar();
while (ch<'0' || '9'<ch){if (ch=='-')f=-1;ch=getchar();}
while ('0'<=ch && ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
inline void swap(ll &x,ll &y){ll z=x;x=y,y=z;}
inline bool cmp(node a,node b){return a.x<b.x;}
inline bool cmp1(node a,node b){return a.id<b.id;}
inline void modify(ll t,ll l,ll r,ll x)
{
if (l==r){++tr[t];return;}
ll mid=(l+r)>>1;if (x<=mid)modify(t<<1,l,mid,x);
else modify((t<<1)+1,mid+1,r,x);tr[t]=tr[t<<1]+tr[(t<<1)+1];
}
inline ll query(ll t,ll l,ll r,ll x,ll y)
{
if (x>y)return 0;ll mid=(l+r)>>1;
if (l==x && y==r)return tr[t];
if (y<=mid)return query(t<<1,l,mid,x,y);
else if (x>mid)return query((t<<1)+1,mid+1,r,x,y);
else return query(t<<1,l,mid,x,mid)+query((t<<1)+1,mid+1,r,mid+1,y);
}
inline void msort(ll l,ll r)
{
if (l==r)return;
ll mid=(l+r)>>1,i=l,j=mid+1,k=l;
msort(l,mid),msort(mid+1,r);
while (i<=mid && j<=r)
{
if (b[i]<=b[j])c[k++]=b[i++];
else c[k++]=b[j++],ans+=mid-i+1;
}
while (i<=mid)c[k++]=b[i++];
while (j<=r)c[k++]=b[j++];
fo(i,l,r)b[i]=c[i];
}
int main()
{
//freopen("T1.in","r",stdin);
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
n=read();fo(i,1,n)a[i].x=read(),a[i].id=i;
sort(a+1,a+n+1,cmp);ll i=1,tmp=0;
while (i<=n){tmp=a[i].x,a[i].x=++m;while (i<n && a[i+1].x==tmp)a[++i].x=m;++i;}
sort(a+1,a+n+1,cmp1);fo(i,1,n)b[i]=a[i].x;msort(1,n),ans1=ans,ans=0;
fo(i,1,n)b[i]=a[n-i+1].x;msort(1,n),ans=(ll)ans*ans1;
fo(i,1,n)premx[i]=query(1,1,n,a[i].x+1,n),premn[i]=query(1,1,n,1,a[i].x-1),modify(1,1,n,a[i].x);
memset(tr,0,sizeof(tr));
fd(i,n,1)sufmx[i]=query(1,1,n,a[i].x+1,n),sufmn[i]=query(1,1,n,1,a[i].x-1),modify(1,1,n,a[i].x);
fo(i,1,n)ans-=premx[i]*sufmx[i]+premn[i]*sufmn[i]+premx[i]*premn[i]+sufmx[i]*sufmn[i];
printf("%lld\n",ans);
return 0;
}

【JZOJ6342】Tiny Counting的更多相关文章

  1. 【USACO2017JAN】 Promotion Counting

    [题目链接] 点击打开链接 [算法] 离散化 + dfs + 树状数组 [代码] #include<bits/stdc++.h> using namespace std; #define ...

  2. 【LeetCode】338. Counting Bits (2 solutions)

    Counting Bits Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num  ...

  3. 【USACO17JAN】Promotion Counting晋升者计数 线段树+离散化

    题目描述 The cows have once again tried to form a startup company, failing to remember from past experie ...

  4. 【SP26073】DIVCNT1 - Counting Divisors 题解

    题目描述 定义 \(d(n)\) 为 \(n\) 的正因数的个数,比如 \(d(2) = 2, d(6) = 4\). 令 $ S_1(n) = \sum_{i=1}^n d(i) $ 给定 \(n\ ...

  5. 【计数】【UVA11401】 Triangle Counting

    传送门 Description 把1……n这n个数中任取3个数,求能组成一个三角形的方案个数 Input 多组数据,对于每组数据,包括: 一行一个数i,代表前i个数. 输入结束标识为i<3. O ...

  6. 【hdu3518】Boring counting

    题意:找出一个字符串中至少重复出现两次的字串的个数(重复出现时不能重叠). 后缀数组 枚举字串长度h,对于每一次的h,利用height数组,找出连续的height大于等于h的里面最左端和最右端得为之l ...

  7. 【leetcode】338 .Counting Bits

    原题 Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate t ...

  8. 【模板】【P3605】【USACO17JAN】Promotion Counting 晋升者计数——动态开点和线段树合并(树状数组/主席树)

    (题面来自Luogu) 题目描述 奶牛们又一次试图创建一家创业公司,还是没有从过去的经验中吸取教训--牛是可怕的管理者! 为了方便,把奶牛从 1⋯N(1≤N≤100,000) 编号,把公司组织成一棵树 ...

  9. 【LeetCode】338. Counting Bits 解题报告(Python & Java & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目描述 Given a non negati ...

随机推荐

  1. 44-Ubuntu-用户管理-09-chmod的数字表示法介绍

    chmod 修改文件和目录权限 chmod在设置权限时,可以简单地使用三个数字分别对应拥有者/组和其他用户的权限. 注意: chmod直接修改文件|目录的'读|写|执行'权限,但是不能精确到拥有者|组 ...

  2. idea一直在copying resources或者一直在build,卡住不动,问题已解决

    IDE在启动项目的过程中,一直copying,或者是build一直卡住,需要在modules中配置下,把target文件夹移出resource folder 同时,在此之前,我还屏蔽了项目中pom.x ...

  3. sudo dpkg --configure -a无法解决的问题

    系统升级及新立得启动时出现的问题,还不能安装软件 E: dpkg 的操作被中断了, 您必须手动执行 'sudo dpkg --configure -a' 以修复这个问题. E: _cache-> ...

  4. [转]PHP base64_encode 在URL地址参数编码上使用

    因为我使用公钥,使用php的 openssl 加密之后的资料 base64_encode()字符串,然后放入请求 url 中当作参数,urlencode(base64_encode()),然后用 ur ...

  5. laravel passport client_credentials

    我是使用 Laravel 5.4 + Dingo Api + passport/jwt 两个验证方式 目前需要用到 passport 的 client_credentials 获取 token成功之后 ...

  6. jq-demo-放大镜

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. jq-demo-楼梯效果

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. Python 分解质因数

    def zys(n, value=[]): for i in range(2, int(n / 2 + 1)): if n % i == 0: value.append(i) zys(n / i, v ...

  9. mysql服务命令行操作

    启动 net start mysql 关闭 net stop mysql 登陆 mysql -hlocalhost -uusername -ppassword 退出 exit 显示数据库 show d ...

  10. 解决MySQL登录密码正确却提示错误-1045的方法

    MySQL密码正确却无法本地登录-1045 Access denied for user 'root'@'localhost' (using password:YES MySQL密码正确却无法本地登录 ...