【JZOJ6342】Tiny Counting
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的更多相关文章
- 【USACO2017JAN】 Promotion Counting
[题目链接] 点击打开链接 [算法] 离散化 + dfs + 树状数组 [代码] #include<bits/stdc++.h> using namespace std; #define ...
- 【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 ...
- 【USACO17JAN】Promotion Counting晋升者计数 线段树+离散化
题目描述 The cows have once again tried to form a startup company, failing to remember from past experie ...
- 【SP26073】DIVCNT1 - Counting Divisors 题解
题目描述 定义 \(d(n)\) 为 \(n\) 的正因数的个数,比如 \(d(2) = 2, d(6) = 4\). 令 $ S_1(n) = \sum_{i=1}^n d(i) $ 给定 \(n\ ...
- 【计数】【UVA11401】 Triangle Counting
传送门 Description 把1……n这n个数中任取3个数,求能组成一个三角形的方案个数 Input 多组数据,对于每组数据,包括: 一行一个数i,代表前i个数. 输入结束标识为i<3. O ...
- 【hdu3518】Boring counting
题意:找出一个字符串中至少重复出现两次的字串的个数(重复出现时不能重叠). 后缀数组 枚举字串长度h,对于每一次的h,利用height数组,找出连续的height大于等于h的里面最左端和最右端得为之l ...
- 【leetcode】338 .Counting Bits
原题 Given a non negative integer number num. For every numbers i in the range 0 ≤ i ≤ num calculate t ...
- 【模板】【P3605】【USACO17JAN】Promotion Counting 晋升者计数——动态开点和线段树合并(树状数组/主席树)
(题面来自Luogu) 题目描述 奶牛们又一次试图创建一家创业公司,还是没有从过去的经验中吸取教训--牛是可怕的管理者! 为了方便,把奶牛从 1⋯N(1≤N≤100,000) 编号,把公司组织成一棵树 ...
- 【LeetCode】338. Counting Bits 解题报告(Python & Java & C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目描述 Given a non negati ...
随机推荐
- 2-数据分析-matplotlib-1-概述
1.matplotlib: 最流行的Python底层绘图库,主要做数据可视化图表,名字取材于MATLAB,模仿MATLAB构建. 2.学习matplotlib的意义: (1)能将数据进行可视化,更直观 ...
- CF#537 C. Creative Snap /// DFS
题目大意: 给定n k A B为位置长度 复仇者个数 两种花费 在一段为1~2^n的位置中 某些位置存在一些复仇者 求消灭所有复仇者的最小花费 对一段位置可以有两种处理方式 1.若该段长度至少为2 可 ...
- 【洛谷】P1288 取数游戏II
题目链接:https://www.luogu.org/problemnew/show/P1288 题意:中文题面不赘述啦. 题解:代码很好写,其实就是判断边数是否为偶数.先手确定方向其实都是一样的,但 ...
- 如何在react中实现一个table切换?
废话不说,直接贴代码,供新手参考 <!DOCTYPE html> export default class TabComponent extends Component { constru ...
- react-router踩坑
1.当用BrowserRouter时,<Link/>组件必须放在BrowserRouter里,如果是存在于某个组件里的Link,则该组件也必须放在Router里,不然会出现url改变页面为 ...
- js查询字符串是否包含指定字符的函数indexOf
今天用到了js的函数indexOf来查看字符串中是否包含指定的字符,最开始没注意看,就拿来用了,结果用的时候才发现,IndexOf的返回值原来是字符在字符串中的index,返回值有0.1等等,如果没有 ...
- webpack4.0高级
环境变量 webpack --env.NODE_ENV=local --env.production --progress Tree Shaking 移除JS上下文字未被引用的代码 只支持ES6的im ...
- 【硬盘】RAID卡
独立磁盘冗余阵列,或简称磁盘阵列(Redundant Array of Independent Disks) RAID是一种把多块独立的物理硬盘按不同方式组合起来形成一个逻辑硬盘,一般分为硬RAID卡 ...
- kma 2019CSP前刷题记录
2019/10/25 \([LNOI2014]\ LCA\) \([Luogu\ P2774]\) 方格取数问题 \(Gauss\)消元板 \([JSOI2008]\)球形空间产生器 2019/10/ ...
- UvaLive6893_The_Big_Painting
目录 Catalog Solution: (有任何问题欢迎留言或私聊 && 欢迎交流讨论哦 Catalog Problem:传送门 Portal 原题目描述在最下面. 给你两个二 ...