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. vue tabNav 点击

    <template> <div class="content"> <header class="tab_nav"> < ...

  2. visual studio snippet备忘

    一.C++ classheadercpp.snippet <?xml version="1.0" encoding="utf-8"?> <Co ...

  3. java----int,string 转化为long

    String: 1.返回Long包装类型: String str = "aaa"; long l = Long.parseLong([str]); 2.返回long基本数据类型: ...

  4. 【CSS】float

    写在前面的话: 由于CSS内容比较多,小菜没有精力从头到尾讲一遍,只能有针对性的讲解. 如果读者理解CSS盒子模型,但对于浮动不理解,那么这篇文章可以帮助你. 小菜水平有限,本文仅仅是入门教程,不当之 ...

  5. javascript追加节点

    追加节点 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...

  6. thinkphp环境要求

    框架本身没有什么特别模块要求,具体的应用系统运行环境要求视开发所涉及的模块.ThinkPHP底层运行的内存消耗极低,而本身的文件大小也是轻量级的,因此不会出现空间和内存占用的瓶颈. PHP版本要求 P ...

  7. Java中的线程Thread方法之---stop()

    搞过Java线程的人都知道,stop这个方法是臭名昭著了,早就被弃用了,但是现在任然有很多钟情与他的人,永远都放不下他,因为从他的字面意思上我们可以知道他貌似可以停止一个线程,这个需求是每个搞线程开发 ...

  8. kafka集群安装和使用

    kafka(1)kafka是一个分布式的消息缓存系统(2)kafka集群中的服务器都叫做broker(3)kafka有两类客户端,一个叫做producer(消息生产者),一类叫做consumer(消息 ...

  9. php 类静态变量 和 常量消耗内存及时间对比

    在对类执行100w次循环后, 常量最快,变量其次,静态变量消耗时间最高 其中: 常量消耗:101.1739毫秒 变量消耗:2039.7689毫秒 静态变量消耗:4084.8911毫秒 测试代码: cl ...

  10. nlp总结

    中科院nlpir和海量分词(http://www.hylanda.com/)是收费的. hanlp:推荐基于CRF的模型的实现~~要看语料,很多常用词会被分错,所以需要词库支撑.目前最友好的开源工具包 ...