正题

题目链接:https://www.luogu.com.cn/problem/AT4353


题目大意

数轴上有\(n\)个球\(m\)个洞,每次可以将所有球左移或者右移,球到洞的位置会掉下去。

求有多少让球掉进不同洞的方案。

\(1\leq n,m\leq 10^5\)


解题思路

设一个球距离左右洞的距离分别为\((x,y)\),那么一个球\((x_1,y_1)\)对球\((x_2,y_2)\)产生限制当且仅当\(x_1\leq x_2\)且\(y_1\geq y_2\)。

那么我们相当于找一些两两没有限制的数字的集合,一种方法是按照\(x\)升序排序,然后求\(y\)的上升序列数量即可。

时间复杂度\(O(n\log n)\)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
#define lowbit(x) (x&-x)
#define mp(x,y) make_pair(x,y)
using namespace std;
const ll N=1e5+10,P=1e9+7;
ll n,m,cnt,bnt,b[N],x[N],y[N],t[N],ans;
pair<ll ,ll >a[N];
void Change(ll x,ll val){
while(x<=n){
(t[x]+=val)%=P;
x+=lowbit(x);
}
return;
}
ll Ask(ll x){
ll ans=0;
while(x){
(ans+=t[x])%=P;
x-=lowbit(x);
}
return ans;
}
signed main()
{
freopen("hole.in","r",stdin);
freopen("hole.out","w",stdout);
scanf("%lld%lld",&n,&m);
for(ll i=1;i<=n;i++)scanf("%lld",&x[i]);
for(ll i=1;i<=m;i++)scanf("%lld",&y[i]);
ll z=1;
for(ll i=1;i<=n;i++){
while(z<=m&&y[z]<x[i])z++;
if(z==1||z>m||y[z]==x[i])continue;
a[++cnt]=mp(x[i]-y[z-1],x[i]-y[z]);
b[++bnt]=y[z]-x[i];
}
sort(a+1,a+1+cnt);
b[++bnt]=0;sort(b+1,b+1+bnt);
cnt=unique(a+1,a+1+cnt)-a-1;
bnt=unique(b+1,b+1+bnt)-b-1;
Change(1,1);ans=1;
for(ll i=1;i<=cnt;i++){
ll w=lower_bound(b+1,b+1+bnt,-a[i].second)-b;;
ll sum=Ask(w-1);Change(w,sum);
(ans+=sum)%=P;
}
printf("%lld\n",ans);
return 0;
}

AT4353-[ARC101D]Robots and Exits【LIS】的更多相关文章

  1. 【58测试】【贪心】【离散】【搜索】【LIS】【dp】

    第一题 大天使之剑 大意: 有n个怪,每个怪的ph 为 h[i],有三种攻击方式,普通攻击:一次打一个怪一滴血:重击(消耗1魔法值):一次打一个怪两滴血:群体攻击(消耗1魔法值):一次打所有怪一滴血. ...

  2. HDU 1025 城市供应 【LIS】

    题目链接:https://vjudge.net/contest/228455#problem/A 题目大意: 有2n个城市,其中有n个富有的城市,n个贫穷的城市,其中富有的城市只在一种资源富有,且富有 ...

  3. 【LIS】【递推】Gym - 101246H - ``North-East''

    x坐标排序,y坐标当权值,同一个x坐标的,y从大到小排. 求f(i)表示以i结尾的LIS以后,从后向前枚举,不断更新一个max数组,max(i)代表最长上升子序列为i时,当前的 结尾的最大值是多少. ...

  4. 【LIS】Luogu P1020 导弹拦截

    昨天晚上看蓝书,看到了LIS问题的优化解法. 是比O(n方)更快的解法,实际上是一个常数优化. 先讲一下朴素的解法: 一个集合a,a[i]是第i个元素.设dp[i]为以编号为i的元素结尾的最长不上升子 ...

  5. HDU 1257 最少拦截系统【LIS】

    题意:类似于套娃娃,问最少需要多少个拦截系统. 思路: 假设已经有m个导弹拦截序列 r1:x11>=x12>=x13>=...>=x1n r1:x21>=x22>= ...

  6. HDU 1051 Wooden Sticks【LIS】

    题意:给出n个木头的重量wi,长度li,如果满足w[i+1]>=w[i]且l[i+1]>=l[i],则不用耗费另外的加工时间,问至少需要多长时间加工完这些木头. 第一次做这一题目也没有做出 ...

  7. hdoj 1950 Bridging signals【二分求最大上升子序列长度】【LIS】

    Bridging signals Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  8. 序列变换(HDU-5256)【LIS】

    题目链接:https://vjudge.net/problem/HDU-5256 题意:给一个数列,每一个数都不相同且为整数,现求,最少需要修改多少次才能使该数列为严格上升的. 思路:首先,对于一个严 ...

  9. POJ_2533 Longest Ordered Subsequence 【LIS】

    一.题目 Longest Ordered Subsequence 二.分析 动态规划里的经典问题.重在DP思维. 如果用最原始的DP思想做,状态转移方程为$DP[i] = max(DP[j] + 1) ...

随机推荐

  1. VMware 启动虚拟机黑屏(Ubuntu)

    之前启动都很正常,不知道为啥,最近启动,老出现这种黑屏得情况: 解决方法: 在搜索栏里搜索cmd 巴拉了一下谷歌,发现了问题: 虚拟机和主机之间的通信,基本上是以 socket 的方式进行通信的(这里 ...

  2. 如何在HTML中实现图片的滚动效果

    <MARQUEE onmouseover=stop() onmouseout=start() scrollAmount=3 loop=infinite deplay="0"& ...

  3. Qt 中事件与处理

    一.事件与处理程序在运算过程中发生的一些事情:鼠标单击.键盘的按下...这些的事件的监控与处理在Qt中不是以信号的方式处理的.当这些事件发生时会调用QObject类中的功能函数(虚函数),所有的控件类 ...

  4. 【转】时冲的CSDN:Linux系统各个目录的作用

    请各位移步原文链接:时冲的CSDN 以下仅用于个人梳理,排版方便阅读记忆(原文更优): from my typora: 文章目录 Linux文件系统 LINUX有四种基本文件系统类型: 1.普通文件: ...

  5. cookie实现访问时间查看

    package day01.cookies; import java.io.IOException; import java.net.URLDecoder; import java.net.URLEn ...

  6. HCNP Routing&Switching之OSPF虚连接

    前文我们了解了OSPF的网络类型.帧中继交换机映射以及路由器帧中继映射相关话题,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/15195762.html:今天我 ...

  7. Vue Router路由导航及传参方式

    路由导航及传参方式 一.两种导航方式 ①:声明式导航 <router-link :to="..."> ②:编程式导航 router.push(...) 二.编程式导航参 ...

  8. 自己写一个Map

    Map的实现其实很简单,一个key对应一个value就行 . 本Map是写着玩的,是想告诉初学者我们也可以写一个简单的Map来自己用 代码: public class MyMap<K, V> ...

  9. MySQL——MySQL多实例

    一台服务器上运行多个MySQL服务,不同的业务 多实例思路: 1. 多套配置文件 2. 多套数据 3. 多个socket 4. 多个端口 5. 多个日志文件 6. 多个启动程序

  10. TDSQL(MySQL版)之DB组件升级

    随着数据库产品的更新迭代,修复bug等等,产品避免不了会出现升级的需求.TDSQL(MysqL版)也会有这方面的需求.接下来我就说说如何对现有TDSQL(MySQL版)集群组件进行升级,而不影响业务. ...