传送门

描述:给定一个序列长n,求多少子串和大于零。

\(一开始一定会想到根据前缀和优化,枚举起点和中点O(n)解决\)

\(那更高效的方法呢?实际上,我们上面就是要求S_i-S_j>0的数量\)(S为前缀和数组)

是不是很眼熟?就是一个正序对嘛!归并排序搞一搞。(特殊的,序列长可以为0,另外算)

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,s[100009],a[100009],b[100009];
ll ans;
void merge(int l,int mid,int r)
{
int p1=l,p2=mid+1,k=l;
while(p1<=mid&&p2<=r)
{
if(a[p1]<a[p2]) ans+=mid-p1+1,b[k++]=a[p2++];
else b[k++]=a[p1++];
}
while(p1<=mid)
b[k++]=a[p1++];
while(p2<=r)
b[k++]=a[p2++];
for(int i=l;i<=r;i++) a[i]=b[i];
}
void mergesort(int l,int r)
{
if(r>l)
{
int mid=l+r>>1;
mergesort(l,mid);
mergesort(mid+1,r);
merge(l,mid,r);
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>s[i],a[i]=a[i-1]+s[i];
for(int i=1;i<=n;i++) if(a[i]>0) ans++;
mergesort(1,n);
cout<<ans;
}

树状数组版本

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+9;
int sumn[maxn],sm[maxn],n,tot;
ll ans;
class Binary_Index_Tree
{
private:
int sumn[maxn];
int lowbit(int x){
return x&(-x);
}
public:
void insert(int x)
{
for(;x<=tot;x+=lowbit(x)) sumn[x]++;
}
int query(int x)
{
int ans=0;
for(;x;x-=lowbit(x)) ans+=sumn[x];
return ans;
}
}bit;
int main()
{
cin>>n;
for(int i=1,x;i<=n;i++)
{
scanf("%d",&x);
sumn[i]=sumn[i-1]+x;
sm[i]=sumn[i];
}
sort(sm+1,sm+1+n);
tot=unique(sm+1,sm+1+n)-sm-1;
for(int i=1;i<=n;i++)
{
int p=lower_bound(sm+1,sm+tot+1,sumn[i])-sm;
ans+=bit.query(p-1);//搜集1到(p-1)数字
bit.insert(p);
}
for(int i=1;i<=n;i++) if(sumn[i]>0) ans++;
cout<<ans;
}

P2309(逆序对)的更多相关文章

  1. 【CQOI2011】动态逆序对 BZOJ3295

    Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计 ...

  2. CH Round #72 奇数码问题[逆序对 观察]

    描述 你一定玩过八数码游戏,它实际上是在一个3*3的网格中进行的,1个空格和1~8这8个数字恰好不重不漏地分布在这3*3的网格中. 例如:5 2 81 3 _4 6 7 在游戏过程中,可以把空格与其上 ...

  3. POJ3928Ping pong[树状数组 仿逆序对]

    Ping pong Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3109   Accepted: 1148 Descrip ...

  4. NOIP2013火柴排队[逆序对]

    题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi)^2 其中 ai 表示 ...

  5. bzoj 3295 动态逆序对 CDQ分支

    容易看出ans[i]=ans[i-1]-q[i],q[i]为删去第i个数减少的逆序对. 先用树状数组算出最开始的逆序对,预处理出每个数前边比它大的和后边比它小的,就求出了q[i]的初始值. 设b[i] ...

  6. 诸城模拟赛 dvd的逆序对

    [题目描述] dvd是一个爱序列的孩子. 他对序列的热爱以至于他每天都在和序列度过 但是有一个问题他却一直没能解决 给你n,k求1~n有多少排列有恰好k个逆序对 [输入格式] 一行两个整数n,k [输 ...

  7. 归并求逆序数(逆序对数) && 线段树求逆序数

    Brainman Time Limit: 1000 MS Memory Limit: 30000 KB 64-bit integer IO format: %I64d , %I64u   Java c ...

  8. BZOJ 3295: [Cqoi2011]动态逆序对

    3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3865  Solved: 1298[Submit][Sta ...

  9. BZOJ 3295 【Cqoi2011】 动态逆序对

    Description 对于序列\(A\),它的逆序对数定义为满足\(i<j\),且\(A_i>A_j\)的数对\((i,j)\)的个数.给\(1\)到\(n\)的一个排列,按照某种顺序依 ...

随机推荐

  1. 009-数组-C语言笔记

    009-数组-C语言笔记 学习目标 1.[掌握]数组的声明 2.[掌握]数组元素的赋值和调用 3.[掌握]数组的初始化 4.[掌握]数组的遍历 5.[掌握]数组在内存中的存储 6.[掌握]数组长度计算 ...

  2. 第八节:time和random模块

    定义: 模块是一组Python代码的集合,可以使用其他模块,也可以被其他模块使用. 重点: 1.模块的名字不要和自带的模块名字相同,不然会优先调用自己的那个模块,因为查找模块的时候是按照sys.pat ...

  3. GeoGebra函数使用

    分段函数使用 输入指令: If(x < -2, x, -2 < x < 2, x², x > 2, x)

  4. 从Generator入手读懂co模块源码

    这篇文章是讲JS异步原理和实现方式的第四篇文章,前面三篇是: setTimeout和setImmediate到底谁先执行,本文让你彻底理解Event Loop 从发布订阅模式入手读懂Node.js的E ...

  5. A - Number Sequence 哈希算法(例题)

    Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1], b[2], ...... , b[M] (1 <= M ...

  6. el-tab-pane label的文字内容怎样设间距

    el-tab-pane label的文字内容怎样设间距 问题描述: 在使用element-ui的el-tab-pane做标签页时,label属性的位置与样式不能通过style样式直接解决 百度后几乎没 ...

  7. 重装anaconda的记录,包含设置jupyter kernel

    anaconda安装记录 官网下载最新版 linux:sh xx.sh 注意不要敲太多回车,容易错过配置bash的部分,还要手动添加 (vim ~/.bashrc 手动添加新bash,卸载时也要删掉此 ...

  8. Spring Cloud+nacos+Feign,实现注册中心及配置中心

    写在前面 注册中心.配置中心的概念就不在这里解释了.发现服务原来一直用的是Eureka,因为这家伙闭源了,不爽.然后就发现了nacos,阿里巴巴的,好东西,一个搞定注册中心和配置中心.官网:https ...

  9. RESTFul 设计规范

    REST这个词,是Roy Thomas Fielding博士在他2000年提出的,有兴趣的可以阅读一下他的论文, 论文地址为:http://www.ics.uci.edu/~fielding/pubs ...

  10. Vue 3.0 Composition API - 中文翻译

    Composition API 发布转载请附原文链接 https://www.cnblogs.com/zgh-blog/articles/composition_api.html 这两天初步了解了下 ...