题目

https://www.luogu.com.cn/problem/P5677

分析

  最开始读题的时候没有读的太懂,以为i是在选定区间内给的,实际上不是,这道题的意思应该是在l和r的区间内找出有多少个好的配对,这里好的配对是对于整个区间来说的,既然是对于整个区间,我们就不难想到找出好的配对的方法,所以我们可以先找出所有好的配对,然后用树状数组维护个数。

  如何找出好的配对呢?我们先来分析什么叫好的配对,选定的两点间距离比其中一点到除对方外任意一点的距离都小,也就是说这两点差的绝对值最小,这样的话,这两个点在sort排序后一定相邻,这个很好推出,于是我们只要考虑这个点的另一个配对是左边的点还是右边的点,写一个判断就行了,注意特判1和n。

  找出好的配对来,就又向答案接近了一步,现在我们只要进行更新就行了,这里的更新我们枚举左端点,上一步我们已经求出了好的配对(l,r)如果查询的左端点在l的左边,那么从r开始向右就一定至少存在一个好的配对,所以让树状数组中的r对应的位置更新就行。注意我们要倒序枚举左端点,因为我们加入r后所产生的配对只能是在询问区间包含l的情况下才有效。

 #include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
using namespace std;
const int N=3e5+;
#define ll long long
struct Node{
ll val,id;
bool operator < (const Node&A)const{
return val<A.val;
}
}a[N];
vector<int> point[N],p1[N],p2[N];
ll lowbit(ll x){
return x&-x;
}
void Ins(ll x,ll y){
point[min(x,y)].push_back(max(x,y));//min表示左端点,max表示右端点
}
ll m,n,c[N];
void Add(ll x){
while(x<=n){
c[x]++;
x+=lowbit(x);
}
}
ll query(ll x){
ll ans=;
while(x){
ans+=c[x];
x-=lowbit(x);
}
return ans;
}
ll ans[N];
int main(){
scanf("%lld%lld",&n,&m);
for(int i=;i<=n;i++){
scanf("%lld",&a[i].val);a[i].id=i;
}
sort(a+,a+n+);
for(int i=;i<=n;i++){
int Min=0x3f3f3f3f;
if(i!=&&a[i].val-a[i-].val<Min){
Min=a[i].val-a[i-].val;
}
if(i!=n&&a[i+].val-a[i].val<Min){
Min=a[i+].val-a[i].val;
}
if(i!=&&a[i].val-a[i-].val==Min)Ins(a[i].id,a[i-].id);
if(i!=n&&a[i+].val-a[i].val==Min)Ins(a[i+].id,a[i].id);//取两个端点最小值
}
for(int i=;i<=m;i++){
int l,r;
scanf("%d%d",&l,&r);
p1[l].push_back(r);
p2[l].push_back(i);//记录坐标位置
}
for(int i=n;i>=;i--){
for(int j=;j<(int)point[i].size();j++)Add(point[i][j]);//倒序查询
for(int j=;j<(int)p1[i].size();j++)ans[p2[i][j]]=query(p1[i][j]);
}
ll sum=;
for(int i=;i<=m;i++)
sum+=ans[i]*i;
printf("%lld\n",sum);
}

GZOI 2017配对统计 树状数组的更多相关文章

  1. NOIP 2017 列队 - Splay - 树状数组

    题目传送门 传送点I 传送点II 题目大意 (家喻户晓的题目应该不需要大意) (我之前咋把NOIP 2017打成了NOIP 2018,好绝望) Solution 1 Splay 每行一颗Splay,没 ...

  2. gym 100589A queries on the Tree 树状数组 + 分块

    题目传送门 题目大意: 给定一颗根节点为1的树,有两种操作,第一种操作是将与根节点距离为L的节点权值全部加上val,第二个操作是查询以x为根节点的子树的权重. 思路: 思考后发现,以dfs序建立树状数 ...

  3. POJ3928 Pingpong(统计比 K 小的个数 + 树状数组)

    Ping pong Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2691   Accepted: 996 Descript ...

  4. UVA 11990 `Dynamic'' Inversion CDQ分治, 归并排序, 树状数组, 尺取法, 三偏序统计 难度: 2

    题目 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&a ...

  5. 【loj6041】「雅礼集训 2017 Day7」事情的相似度 后缀自动机+STL-set+启发式合并+离线+扫描线+树状数组

    题目描述 给你一个长度为 $n$ 的01串,$m$ 次询问,每次询问给出 $l$ .$r$ ,求从 $[l,r]$ 中选出两个不同的前缀的最长公共后缀长度的最大值. $n,m\le 10^5$ 题解 ...

  6. HDU 6240 Server(2017 CCPC哈尔滨站 K题,01分数规划 + 树状数组优化DP)

    题目链接  2017 CCPC Harbin Problem K 题意  给定若干物品,每个物品可以覆盖一个区间.现在要覆盖区间$[1, t]$. 求选出来的物品的$\frac{∑a_{i}}{∑b_ ...

  7. HDU 5997 rausen loves cakes(启发式合并 + 树状数组统计答案)

    题目链接  rausen loves cakes 题意  给出一个序列和若干次修改和查询.修改为把序列中所有颜色为$x$的修改为$y$, 查询为询问当前$[x, y]$对应的区间中有多少连续颜色段. ...

  8. ZJOI 2017 树状数组(线段树套线段树)

    题意 http://uoj.ac/problem/291 思路 不难发现,九条カレン醬所写的树状数组,在查询区间 \([1,r]\) 的时候,其实在查询后缀 \([r,n]\) :在查询 \([l,r ...

  9. HDU 1892(书架统计 二维树状数组)

    题意是在二维平面上在一些位置上进行数据的增删改查操作,使用树状数组(了解树状数组点这里) 原来的树状数组在求区间和时是 sum( x, y ) = getsum( y ) - getsum( x - ...

随机推荐

  1. SGD与Adam识别MNIST数据集

    几种常见的优化函数比较:https://blog.csdn.net/w113691/article/details/82631097 ''' 基于Adam识别MNIST数据集 ''' import t ...

  2. Ribbon进行服务调用/负载均衡以及请求重试配置

    Ribbon负载均衡 经过对Eureka的认识,及Eureka集群的搭建,已经基本可以入门Eureka的使用.之前对于服务调用者我们是直接获取注册列表后通过 get(0) 的方式来获取第一个注册信息. ...

  3. Ansible-基本概述

    为什么要自动化运维 纯手动软件安装部署方式 我们以 10 台机器部署 Nginx 为例.部署步骤如下: 1.通过 ssh 登录一台机器: 2.yum install -y nginx 或者 获取安装包 ...

  4. [Python之路] object类中的特殊方法

    一.object类的源码 python版本:3.8 class object: """ The most base type """ # d ...

  5. 5行js代码搞定导航吸顶效果

    一.HTML布局 首先写HTML布局 <body> <div id="wrap"></div> </body> 二.CSS样式 给点 ...

  6. PhaserJS 3 屏幕适配时的小坑 -- JavaScript Html5 游戏开发

    巨坑:在config内不要把 width 设为 window.innnerWidth在config内不要把 width 设为 window.innnerWidth在config内不要把 width 设 ...

  7. fsLayuiPlugin多数据表格使用

    fsLayuiPlugin 是一个基于layui的快速开发插件,支持数据表格增删改查操作,提供通用的组件,通过配置html实现数据请求,减少前端js重复开发的工作. GitHub下载 码云下载 测试环 ...

  8. 移动端overflow失效问题

    在项目开发中,我们有时候需要实现元素从屏幕外移动到屏幕内的效果. 我们一般会有这样的方案:先通过position: absolution或transform: translate() 使得元素移动到屏 ...

  9. 2017、2018面试分享(js面试题记录)记得点赞分享哦;让更多的人看到~~

    2017面试分享(js面试题记录) 1. 最简单的一道题 '11' * 2 'a8' * 3 var a = 2, b = 3; var c = a+++b; // c = 5 2. 一道this的问 ...

  10. Asp.Net Core IdentityServer4 中的基本概念

    一.前言 这篇文章可能大家会觉得很空洞,没有实际的实战东西,主要是自己整理出来的IdentityServer4 的一些概念性的东西:如果你对IdentityServer4有过一定的实战经验,可以跳过不 ...