codeforces#1139F. Dish Shopping (离散化数组数组+ 扫描线)
膜拜大佬:https://blog.csdn.net/xyz32768/article/details/88831233
题目链接:
http://codeforces.com/contest/1139/problem/F
题意:
有n个物品,物品有三个属性分别是$p_i,s_i,b_i$
有m个人,人有两个属性分别是$pref_j$,$inc_j$
一个人能买某个物品必须满足:,
$p_i \leq inc_j \leq s_i$
$|b_i-pref_j| \leq (inc_j-p_i)$
求出每个人能买物品的数量、
数据范围:
$1 \leq n \leq 10^5$
$1 \leq m \leq 10^5$
其它都是$1$到$10^9$
分析:
借用大佬的图片,描述物品的影响:
对$p_i,s_i,inc_j$进行扫描线处理,$p_i$时提取出$b_i$的影响,$s_i$时取消$b_i$的影响,$inc_j$时对$j$进行计算答案,计算$pref_j$在几个黄色三角形的影响里面。
一个点$(x,y)$受$b_i$影响需要满足下面的条件:
$x-y\geq p_i-b_i$时,$b_i$的影响加一
$-x-y\geq -p_i-b_i+1$时,$b_i$的影响减一
对这两个影响条件分别建立一个离散化的数状数组
具体实现看代码
ac代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
struct Node
{
int is,id,x;
bool operator <(const Node &a)const
{
if(x!=a.x)return x<a.x;
else return is<a.is;
}
};
int a[maxn*4],s[maxn],p[maxn],inc[maxn],b[maxn],treea[maxn*4],treeb[maxn*4],pb[maxn];
int ans[maxn];
map<int,int>ma;
int cnt=0,tt=0;
Node que[maxn*3];
int getid(int x)
{
x=-x;
return ma[x];
}
void add1(int x,int y)
{
for(int i=x;i<4*maxn;i+=(i&-i))treea[i]+=y;
}
void add2(int x,int y)
{
for(int i=x;i<4*maxn;i+=(i&-i))treeb[i]+=-y;
}
int quer1(int x)
{
int res=0;
for(int i=x;i>=1;i-=(i&-i))res+=treea[i];
return res;
}
int quer2(int x)
{
int res=0;
for(int i=x;i>=1;i-=(i&-i))res+=treeb[i];
return res;
}
int main()
{
int n,m;
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)scanf("%d",&p[i]);
for(int i=1;i<=n;i++)scanf("%d",&s[i]);
for(int i=1;i<=n;i++)scanf("%d",&b[i]);
for(int i=1;i<=m;i++)scanf("%d",&inc[i]);
for(int i=1;i<=m;i++)scanf("%d",&pb[i]); for(int i=1;i<=n;i++)
{
a[++cnt]=-(p[i]+b[i]-1),a[++cnt]=-(b[i]-p[i]);
que[++tt]=Node{0,i,p[i]};
que[++tt]=Node{2,i,s[i]};
} for(int i=1;i<=m;i++)
{
a[++cnt]=-(inc[i]+pb[i]),a[++cnt]=-(pb[i]-inc[i]);
que[++tt]=Node{1,i,inc[i]};
}
sort(que+1,que+1+tt);
sort(a+1,a+cnt+1);
int pz=1;
for(int i=1;i<=cnt;i++)
if(ma[a[i]]==0)ma[a[i]]=pz++; for(int i=1;i<=tt;i++)
{ Node now=que[i];
if(now.is==0)
{
add1(getid(b[now.id]-p[now.id]),1);
add2(getid(p[now.id]+b[now.id]-1),1);
}
else if(now.is==1)
{
ans[now.id]=quer1(getid(pb[now.id]-inc[now.id]))+quer2(getid(inc[now.id]+pb[now.id]));
}
else if(now.is==2)
{
add1(getid(b[now.id]-p[now.id]),-1);
add2(getid(p[now.id]+b[now.id]-1),-1);
}
}
for(int i=1;i<=m;i++)
{
printf("%d ",ans[i]);
}
return 0;
}
codeforces#1139F. Dish Shopping (离散化数组数组+ 扫描线)的更多相关文章
- Codeforces 1139F Dish Shopping 树状数组套平衡树 || 平衡树
Dish Shopping 将每个物品拆成p 和 s 再加上人排序. 然后问题就变成了, 对于一个线段(L - R), 问有多少个(li, ri)满足 L >= li && R ...
- 【BZOJ1818】[CQOI2010]内部白点(树状数组,扫描线)
[BZOJ1818][CQOI2010]内部白点(树状数组,扫描线) 题面 BZOJ 题解 不难发现\(-1\)就是在搞笑的. 那么对于每一行,我们显然可以处理出来最左和最右的点,那么等价于我们在横着 ...
- [Codeforces 1208D]Restore Permutation (树状数组)
[Codeforces 1208D]Restore Permutation (树状数组) 题面 有一个长度为n的排列a.对于每个元素i,\(s_i\)表示\(\sum_{j=1,a_j<a_i} ...
- c/c++ 函数指针 指针函数 数组的引用 指针数组 数组指针
1.指针数组数组指针 引用数组 数组的引用 int *a[10] 指针数组 每一个元素都是一个指针 Int (*a)[10] 数组指针 P指向一个含有10个元素的数组 Int (&a)[10] ...
- 指针数组 数组指针的区别.xml
pre{ line-height:1; color:#1e1e1e; background-color:#f0f0f0; font-size:16px;}.sysFunc{color:#627cf6; ...
- 指针数组&数组指针
数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长.也就是说执行p+1时,p要跨过n个整型数 ...
- [ 随手记 2 ] C/C++ 数组/指针/传数组到函数/指针数组/数组指针
1.=================================================================== 1,数组是一块内存连续的数据.2,指针是一个指向内存空间的变 ...
- c/c++ 数组 数组的引用,指针数组的引用
c/c++ 数组 知识点 1,数组的声明和初始化,对应代码里的test1和test2 2,char数组,对应代码里的test3 3,数组不可以拷贝和复制,对应代码里的test4 4,指针数组, 数组的 ...
- 【IT笔试面试题整理】字符串转数组+数组转字符串
[试题描述]定义一个函数,字符串转数组数组转字符串 [参考代码] public static int strToInt(String str) { int i = 0, num = 0; char[] ...
随机推荐
- VMware端口映射配置步骤
1:编辑->虚拟网络编辑器 2:点击NAT模式-->NAT设置 3:注意:主机端口就是物理机的端口,虚拟机就是wmware中的系统 点击添加
- Scrapy-redis<数据库篇>
scrapy-redis爬虫数据库连接部分——windows准备做salve,Linux准备做master开展工作 首先处理简单的windows熟悉的环境——安装Redis服务和Redis可视化~可视 ...
- Node.js微服务实践(一)
什么是微服务 微服务是一种架构风格,一个大型复杂软件应用由一个或多个微服务组成.系统中的各个微服务可被独立部署,各个微服务之间是松耦合的.每个微服务仅关注于完成一件任务并很好地完成该任务.在所有情况下 ...
- Docker & ASP.NET Core (5):Docker Compose
第一篇:把代码连接到容器 第二篇:定制Docker镜像 第三篇:发布镜像 第四篇:容器间的连接 Docker Compose简介 Compose是一个用来定义和运行多容器Docker应用的工具.使用C ...
- ACache【轻量级的开源缓存框架】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 官方介绍 ASimpleCache 是一个为android制定的 轻量级的 开源缓存框架.轻量到只有一个java文件(由十几个类精简 ...
- FileUtils【获取SD卡根目录、读写文件、移动、复制、删除文件、获取文件名、后缀名操作类】
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 封装了获取SD卡根目录路径.以及对文件读写.获取文件名等相关操作. 因为需要用到android.permission.READ_EX ...
- .NET Core 技巧汇总篇
前言 本篇幅会专门记录在工作中实际碰到的问题场景,和一些比较好的实现方法作为汇总,可以供各位借鉴和参考,当然 本人入行不深,能力有限,仅供各位借鉴和参考.欢迎补充 技巧一:引入其他项目类库文件 做项目 ...
- 企业级自动化运维工具---puppet详解
本文收录在Linux运维企业架构实战系列 1.认识puppet 1.1 引入 puppet是什么,咱们先不用专业的名词解释它,咱们先描述一些工作场景,看明白这些工作场景,自然会知道puppet是什么. ...
- SLAM+语音机器人DIY系列:(二)ROS入门——6.编写简单的service和client
摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...
- k8s数据管理(八)--技术流ken
volume 我们经常会说:容器和 Pod 是短暂的.其含义是它们的生命周期可能很短,会被频繁地销毁和创建.容器销毁时,保存在容器内部文件系统中的数据都会被清除. 为了持久化保存容器的数据,可以使用 ...