【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 ...
随机推荐
- vue tabNav 点击
<template> <div class="content"> <header class="tab_nav"> < ...
- visual studio snippet备忘
一.C++ classheadercpp.snippet <?xml version="1.0" encoding="utf-8"?> <Co ...
- java----int,string 转化为long
String: 1.返回Long包装类型: String str = "aaa"; long l = Long.parseLong([str]); 2.返回long基本数据类型: ...
- 【CSS】float
写在前面的话: 由于CSS内容比较多,小菜没有精力从头到尾讲一遍,只能有针对性的讲解. 如果读者理解CSS盒子模型,但对于浮动不理解,那么这篇文章可以帮助你. 小菜水平有限,本文仅仅是入门教程,不当之 ...
- javascript追加节点
追加节点 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3 ...
- thinkphp环境要求
框架本身没有什么特别模块要求,具体的应用系统运行环境要求视开发所涉及的模块.ThinkPHP底层运行的内存消耗极低,而本身的文件大小也是轻量级的,因此不会出现空间和内存占用的瓶颈. PHP版本要求 P ...
- Java中的线程Thread方法之---stop()
搞过Java线程的人都知道,stop这个方法是臭名昭著了,早就被弃用了,但是现在任然有很多钟情与他的人,永远都放不下他,因为从他的字面意思上我们可以知道他貌似可以停止一个线程,这个需求是每个搞线程开发 ...
- kafka集群安装和使用
kafka(1)kafka是一个分布式的消息缓存系统(2)kafka集群中的服务器都叫做broker(3)kafka有两类客户端,一个叫做producer(消息生产者),一类叫做consumer(消息 ...
- php 类静态变量 和 常量消耗内存及时间对比
在对类执行100w次循环后, 常量最快,变量其次,静态变量消耗时间最高 其中: 常量消耗:101.1739毫秒 变量消耗:2039.7689毫秒 静态变量消耗:4084.8911毫秒 测试代码: cl ...
- nlp总结
中科院nlpir和海量分词(http://www.hylanda.com/)是收费的. hanlp:推荐基于CRF的模型的实现~~要看语料,很多常用词会被分错,所以需要词库支撑.目前最友好的开源工具包 ...