P2309(逆序对)
描述:给定一个序列长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(逆序对)的更多相关文章
- 【CQOI2011】动态逆序对 BZOJ3295
Description 对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数.给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计 ...
- CH Round #72 奇数码问题[逆序对 观察]
描述 你一定玩过八数码游戏,它实际上是在一个3*3的网格中进行的,1个空格和1~8这8个数字恰好不重不漏地分布在这3*3的网格中. 例如:5 2 81 3 _4 6 7 在游戏过程中,可以把空格与其上 ...
- POJ3928Ping pong[树状数组 仿逆序对]
Ping pong Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 3109 Accepted: 1148 Descrip ...
- NOIP2013火柴排队[逆序对]
题目描述 涵涵有两盒火柴,每盒装有 n 根火柴,每根火柴都有一个高度. 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为: ∑(ai-bi)^2 其中 ai 表示 ...
- bzoj 3295 动态逆序对 CDQ分支
容易看出ans[i]=ans[i-1]-q[i],q[i]为删去第i个数减少的逆序对. 先用树状数组算出最开始的逆序对,预处理出每个数前边比它大的和后边比它小的,就求出了q[i]的初始值. 设b[i] ...
- 诸城模拟赛 dvd的逆序对
[题目描述] dvd是一个爱序列的孩子. 他对序列的热爱以至于他每天都在和序列度过 但是有一个问题他却一直没能解决 给你n,k求1~n有多少排列有恰好k个逆序对 [输入格式] 一行两个整数n,k [输 ...
- 归并求逆序数(逆序对数) && 线段树求逆序数
Brainman Time Limit: 1000 MS Memory Limit: 30000 KB 64-bit integer IO format: %I64d , %I64u Java c ...
- BZOJ 3295: [Cqoi2011]动态逆序对
3295: [Cqoi2011]动态逆序对 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3865 Solved: 1298[Submit][Sta ...
- BZOJ 3295 【Cqoi2011】 动态逆序对
Description 对于序列\(A\),它的逆序对数定义为满足\(i<j\),且\(A_i>A_j\)的数对\((i,j)\)的个数.给\(1\)到\(n\)的一个排列,按照某种顺序依 ...
随机推荐
- 127.0.0.1和localhost区别
- Netty服务端接收的新连接是如何绑定到worker线程池的?
更多技术分享可关注我 前言 原文:Netty服务端接收的新连接是如何绑定到worker线程池的? 前面分析Netty服务端检测新连接的过程提到了NioServerSocketChannel读完新连接后 ...
- ASE课程总结 by 朱玉影
收获: 最大的收获应该就是对待选题要慎重吧,虽然前期做了一下调研,但是还是不够,所以到最后我们的项目才会不能公开发布,项目中间也是波折不断,导致我们走了很多弯路,浪费了很多时间吧.选题一定要慎重,慎重 ...
- Sprint 5 summary: UI 界面更新,Azure端部署和用户反馈分析 12/28/2015
本次sprint主要完成的任务有对手机APP的UI界面的更新,同时对Azure客户端的部署进行了相应的学习和有关的程序设计.同时对于ALPHA release的用户反馈做出相应的分析以确定接下来工作的 ...
- stand up meeting for beta release plan 12/16/2015
今天我们开会讨论一下beta版需要的feature,其中待定的feature是可选做的,如果有时间.其他都是必须实现的. 因为做插件的计划失败了,所以我们现在是pdf阅读器和取词查词加入生词本这两部分 ...
- idea创建springboot工程,总出现响应超时问题,或者无法连接http://start.spring.io导致创建失败
问题描述如下: idea创建springboot工程,总出现响应超时问题,或者无法连接http://start.spring.io导致创建失败 从我出现此类问题几次的解决方案 依照解决效率分为一下三种 ...
- [转]sql二次注入
01 二次注入原理 二次注入可以理解为,攻击者构造的恶意数据存储在数据库后,恶意数据被读取并进入到SQL查询语句所导致的注入.防御者可能在用户输入恶意数据时对其中的特殊字符进行了转义处理,但在恶意数据 ...
- [yii2] 实现所有action方法之前执行一段代码或者方法
我做的是在执行任何方法之前,验证用户登陆状态! 其实就是在controller中写beforeaction()方法, 然后我的方案就是做一个基类,然后让你所有控制器继承你的基类, 如果控制器的基类用_ ...
- 华为鲲鹏服务器安装 k3s+rancher
华为鲲鹏服务器安装 k3s+rancher 华为鲲鹏服务器 华为鲲鹏服务器采用华为自研cpu ARMv8架构,提供 Windows 和多个Linux 系统,作为服务器使用我一直使用Centos系统(不 ...
- Java 网络编程 -- 基于TCP 模拟多用户登录
Java TCP的基本操作参考前一篇:Java 网络编程 – 基于TCP实现文件上传 实现多用户操作之前先实现以下单用户操作,假设目前有一个用户: 账号:zs 密码:123 服务端: public c ...