【ARC101F】Robots and Exits 树状数组
题目大意
有 \(n\) 个机器人和 \(m\) 个出口。
这 \(n\) 个机器人的初始位置是 \(a_1,a_2,\ldots,a_n\),这 \(m\) 个出口的位置是 \(b_1,b_2,\ldots,b_m\)。
你每次可以让所有机器人往左走一步或往右走一步。
当一个机器人所在的位置有一个出口时,这个机器人就会从这个出口出去。
问你有多少种让机器人全部离开的方案。
两种方案不同当且仅当有至少一个机器人从不同的出口出去。
\(n,m\leq 100000\)
题解
先把最左边的出口左边的机器人和最右边的出口右边的机器人还有已经在出口的机器人全部删掉。
对于一个机器人,设它到左边出口的距离为 \(a_i\),到右边出口的距离为 \(b_i\)。可以把它看成一个点 \((a_i,b_i)\)。
记 \(x\) 是所有机器人往左移动的最远点到初始位置的距离,\(y\) 是所有机器人往右移动的最远点到初始位置的距离。
那么每次可以选择把 \((x,y)\) 变成 \((x+1,y)\) 或者 \((x,y+1)\)。
当 \(x=a_i\) 时,第 \(i\) 个机器人会从左边的出口出去,当 \(y=b_i\) 时,机器人会从右边的出口出去。
那么可以看成从原点开始走,每次往上或右走一步。最后走的这条折线的上方和下方分别对应着从左边和右边的出口出去的机器人的集合。
那么考虑把折线往下移,变成这样:
那么一条折线可以用折线经过的点(那些涂黑的格子)来表示。
设 \(f_i\) 为最后一个经过的黑色格子是 \(i\) 的方案数。
\(f_i=1+\sum_{x_j<x_i,y_j<y_i}f_j\)
用树状数组维护。
时间复杂度: \(O(n\log n)\)
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<utility>
#include<functional>
#include<cmath>
#include<vector>
//using namespace std;
using std::min;
using std::max;
using std::swap;
using std::sort;
using std::reverse;
using std::random_shuffle;
using std::lower_bound;
using std::upper_bound;
using std::unique;
using std::vector;
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef std::pair<int,int> pii;
typedef std::pair<ll,ll> pll;
void open(const char *s){
#ifndef ONLINE_JUDGE
char str[100];sprintf(str,"%s.in",s);freopen(str,"r",stdin);sprintf(str,"%s.out",s);freopen(str,"w",stdout);
#endif
}
int rd(){int s=0,c,b=0;while(((c=getchar())<'0'||c>'9')&&c!='-');if(c=='-'){c=getchar();b=1;}do{s=s*10+c-'0';}while((c=getchar())>='0'&&c<='9');return b?-s:s;}
void put(int x){if(!x){putchar('0');return;}static int c[20];int t=0;while(x){c[++t]=x%10;x/=10;}while(t)putchar(c[t--]+'0');}
int upmin(int &a,int b){if(b<a){a=b;return 1;}return 0;}
int upmax(int &a,int b){if(b>a){a=b;return 1;}return 0;}
const ll p=1000000007;
const int N=100010;
int cmp(pii a,pii b)
{
if(a.first!=b.first)
return a.first<b.first;
return a.second>b.second;
}
int n,m,t,t2;
int a[N],b[N],d[N];
pii c[N];
ll e[N];
ll add(ll a,ll b)
{
a+=b;
return a>=p?a-p:a;
}
void add(int x,ll v)
{
for(;x<=t2;x+=x&-x)
e[x]=add(e[x],v);
}
ll sum(int x)
{
ll s=0;
for(;x;x-=x&-x)
s=add(s,e[x]);
return s;
}
int main()
{
open("arc101f");
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=m;i++)
scanf("%d",&b[i]);
for(int i=1;i<=n;i++)
if(a[i]>b[1]&&a[i]<b[m])
{
int x=lower_bound(b+1,b+m+1,a[i])-b;
if(b[x]==a[i])
continue;
c[++t]=pii(a[i]-b[x-1],b[x]-a[i]);
d[++t2]=b[x]-a[i];
}
sort(d+1,d+t2+1);
t2=unique(d+1,d+t2+1)-d-1;
for(int i=1;i<=t;i++)
c[i].second=lower_bound(d+1,d+t2+1,c[i].second)-d;
sort(c+1,c+t+1,cmp);
t=unique(c+1,c+t+1)-c-1;
ll ans=1;
for(int i=1;i<=t;i++)
{
ll s=sum(c[i].second-1)+1;
ans+=s;
add(c[i].second,s);
}
ans%=p;
printf("%lld\n",ans);
return 0;
}
【ARC101F】Robots and Exits 树状数组的更多相关文章
- 【ARC101F】Robots and Exits 树状数组优化DP
ARC101F Robots and Exits 树状数组 有 $ n $ 个机器人和 $ m $ 个出口.这 $ n $ 个机器人的初始位置是 $ a_1,a_2.....a_n $ ,这 $ m ...
- 【题解】ARC101F Robots and Exits(DP转格路+树状数组优化DP)
[题解]ARC101F Robots and Exits(DP转格路+树状数组优化DP) 先删去所有只能进入一个洞的机器人,这对答案没有贡献 考虑一个机器人只能进入两个洞,且真正的限制条件是操作的前缀 ...
- 洛谷P2982 [USACO10FEB]慢下来Slowing down [2017年四月计划 树状数组01]
P2982 [USACO10FEB]慢下来Slowing down 题目描述 Every day each of Farmer John's N (1 <= N <= 100,000) c ...
- BZOJ 1103: [POI2007]大都市meg [DFS序 树状数组]
1103: [POI2007]大都市meg Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2221 Solved: 1179[Submit][Sta ...
- bzoj1878--离线+树状数组
这题在线做很麻烦,所以我们选择离线. 首先预处理出数组next[i]表示i这个位置的颜色下一次出现的位置. 然后对与每种颜色第一次出现的位置x,将a[x]++. 将每个询问按左端点排序,再从左往右扫, ...
- codeforces 597C C. Subsequences(dp+树状数组)
题目链接: C. Subsequences time limit per test 1 second memory limit per test 256 megabytes input standar ...
- BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]
2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2545 Solved: 1419[Submit][Sta ...
- BZOJ 3529: [Sdoi2014]数表 [莫比乌斯反演 树状数组]
3529: [Sdoi2014]数表 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 1399 Solved: 694[Submit][Status] ...
- BZOJ 3289: Mato的文件管理[莫队算法 树状数组]
3289: Mato的文件管理 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 2399 Solved: 988[Submit][Status][Di ...
随机推荐
- 原生Js交互之DSBridge
文章链接:https://mp.weixin.qq.com/s/Iqd0dKM-ZW4UwkIgSTnvYg 在上一篇文章「android 记一次富文本加载之路」中 介绍了关于android加载富文本 ...
- Go-Ethereum 1.7.2 结合 Mist 0.9.2 实现众筹合约的实例
目录 目录 1.什么是ICO? 2.众筹的奖励-代币 3.众筹合约的完善 3.1.设置众筹合约中使用的代币 3.2.众筹合约的基本设置 3.3.让众筹合约接收以太币 3.4.检测众筹合约是否完成 3. ...
- WPF开源项目
WPF有很多优秀的开源项目,我以为大家都知道,结果,问了很多人,其实他们不知道.唉,太可惜了! 先介绍两个比较牛逼的界面库 1.MaterialDesignInXamlToolkit Android风 ...
- Python第八天 模块 包 全局变量和内置变量__name__ Python path
Python第八天 模块 包 全局变量和内置变量__name__ Python path 目录 Pycharm使用技巧(转载) Python第一天 安装 shell 文件 Pyt ...
- 前后端分离djangorestframework——认证组件
authentication 认证是干嘛的已经不需要多说.而前后端未分离的认证基本是用cookie或者session,前后端分离的一般用token 全局认证 先创建一个django项目,项目名为drf ...
- c/c++ 网络编程 UDP 发送端 bind 作用
网络编程 UDP 发送端 bind 作用 upd 发送端 调用bind函数的效果:把socket特定到一个指定的端口,如果不调用bind,内核会随机分配一个端口. upd 发送端 调用bind函数的目 ...
- 为Arch Linux更换Archlinuxcn源(清华源)
上一篇随笔 archlinux切换官方中国源 里面写了如何切换到官方的中国源,但是因为那个源有一些软件并没有,特别是一些国人常用的中文软件,比如搜狗输入法等这些都是没有的.所以我们现在需要手动切换源一 ...
- LNMP构建动态网站WordPress
LNMP构建动态网站wordpress 一.部署LNMP架构 1.安装nginx #配置nginx源 cat>/etc/yum.repos.d/nginx.repo<<-EOF [N ...
- LeetCode算法题-To Lower Case(Java实现)
这是悦乐书的第301次更新,第320篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第169题(顺位题号是709).实现具有字符串参数str的函数ToLowerCase() ...
- audio
// media.cpp : 定义控制台应用程序的入口点. // https://wenku.baidu.com/view/e910c474c5da50e2524d7fb4.html https:// ...