【题解】ARC101F Robots and Exits(DP转格路+树状数组优化DP)

先删去所有只能进入一个洞的机器人,这对答案没有贡献

考虑一个机器人只能进入两个洞,且真正的限制条件是操作的前缀\(\min \max\),我们直接按照前缀\(\min \max\)\(DP\)

把前缀\(\min \max\)设成坐标,转成格路问题,现在就变成了平面上有若干点要用一条折线分开这些点使得\(n\)对配对点在平面的两侧。

由于我们要保证方案不重,所以要钦定经过某个配对关系的下面那个点,转移方程是

\[f_i=\sum_{x_j<x_i,y_j<y_i}f_j
\]

直接树状数组维护\(DP\)即可

由于我有点赶时间,说的不是很详细(反正没人看),所以挂个连接如果不懂去那里看。【ARC101F】Robots and Exits 树状数组优化DP

//@winlere
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define lowbit(x) ((x)&(-(x))) using namespace std; typedef long long ll;
inline int qr(){
register int ret=0,f=0;
register char c=getchar();
while(c<48||c>57)f|=c==45,c=getchar();
while(c>=48&&c<=57) ret=ret*10+c-48,c=getchar();
return f?-ret:ret;
} const int mod=1e9+7;
const int maxn=5e5+5;
pair < int , int > fal[maxn];
int seg[maxn<<1|1];
int pos[maxn];
vector < int > ve;
int tmp[maxn];
int n,m,ans=1;
int len; inline void add(const int&pos,const int&tag){
for(register int t=pos;t<=len;t+=lowbit(t)) seg[t]=(seg[t]+tag)%mod;
} inline int que(const int&pos){
register int ret=0;
for(register int t=pos;t;t-=lowbit(t)) ret=(ret+seg[t])%mod;
return ret;
} inline int divd(const int&data){
register int l=1,r=m,mid,ret=-1;
do{
mid=(l+r)>>1;
if(pos[mid]<data) l=mid+1,ret=mid;
else r=mid-1;
}while(l<=r);
return ret;
} int main(){
freopen("robot.in","r",stdin);
freopen("robot.out","w",stdout);
n=qr();m=qr();
for(register int t=1;t<=n;++t) tmp[t]=qr();
for(register int t=1;t<=m;++t) pos[t]=qr(); for(register int t=1;t<=n;++t){
if(tmp[t]<pos[1]||tmp[t]>pos[m])continue;
register int k=lower_bound(pos+1,pos+m+1,tmp[t])-pos;
fal[t].second=pos[k]-tmp[t];
k=divd(tmp[t]);
fal[t].first=tmp[t]-pos[k];
ve.push_back(fal[t].second);
}
sort(ve.begin(),ve.end());
ve.resize(unique(ve.begin(),ve.end())-ve.begin());
for(auto t:ve) tmp[++tmp[0]]=t;
for(register int t=1;t<=n;++t){
if(!fal[t].first||!fal[t].second)continue;
fal[t].second=-(lower_bound(tmp+1,tmp+tmp[0]+1,fal[t].second)-tmp);
}
len=m;
sort(fal+1,fal+n+1);
int ed=unique(fal+1,fal+n+1)-fal-1;
for(register int t=1;t<=ed;++t){
if(((!fal[t].second)||(!fal[t].first))) continue;
register int s=que(-fal[t].second-1)+1;
ans=(ans+s)%mod;
add(-fal[t].second,s);
}
printf("%d\n",ans);
return 0;
}

【题解】ARC101F Robots and Exits(DP转格路+树状数组优化DP)的更多相关文章

  1. 【题解】Music Festival(树状数组优化dp)

    [题解]Music Festival(树状数组优化dp) Gym - 101908F 题意:有\(n\)种节目,每种节目有起始时间和结束时间和权值.同一时刻只能看一个节目(边界不算),在所有种类都看过 ...

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

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

  3. Codeforces 946G Almost Increasing Array (树状数组优化DP)

    题目链接   Educational Codeforces Round 39 Problem G 题意  给定一个序列,求把他变成Almost Increasing Array需要改变的最小元素个数. ...

  4. LUOGU P2344 奶牛抗议 (树状数组优化dp)

    传送门 解题思路 树状数组优化dp,f[i]表示前i个奶牛的分组的个数,那么很容易得出$f[i]=\sum\limits_{1\leq j\leq i}f[j-1]*(sum[i]\ge sum[j- ...

  5. Codeforces 909C Python Indentation:树状数组优化dp

    题目链接:http://codeforces.com/contest/909/problem/C 题意: Python是没有大括号来标明语句块的,而是用严格的缩进来体现. 现在有一种简化版的Pytho ...

  6. BZOJ3594: [Scoi2014]方伯伯的玉米田【二维树状数组优化DP】

    Description 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美. 这排玉米一共有N株,它们的高度参差不齐. 方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感 ...

  7. Codeforces 629D Babaei and Birthday Cake(树状数组优化dp)

    题意: 线段树做法 分析: 因为每次都是在当前位置的前缀区间查询最大值,所以可以直接用树状数组优化.比线段树快了12ms~ 代码: #include<cstdio> #include< ...

  8. BZOJ 3594: [Scoi2014]方伯伯的玉米田 (二维树状数组优化DP)

    分析 首先每次增加的区间一定是[i,n][i,n][i,n]的形式.因为如果选择[i,j](j<n)[i,j](j<n)[i,j](j<n)肯定不如把后面的全部一起加111更优. 那 ...

  9. 4.9 省选模拟赛 划分序列 二分 结论 树状数组优化dp

    显然发现可以二分. 对于n<=100暴力dp f[i][j]表示前i个数分成j段对于当前的答案是否可行. 可以发现这个dp是可以被优化的 sum[i]-sum[j]<=mid sum[i] ...

随机推荐

  1. 解决bootStrap selectpicker 下拉栏上方弹出

    最近项目中遇到了一个使用bootStrap selectpicker 进行下拉栏展示的时候出现在元素上方弹出展示的问题,可把我难受坏了,和测试互怼最终以失败告终(人家还是一个娇滴滴的小姑娘),在查了a ...

  2. Pytorch的默认初始化分布 nn.Embedding.weight初始化分布

    一.nn.Embedding.weight初始化分布 nn.Embedding.weight随机初始化方式是标准正态分布  ,即均值$\mu=0$,方差$\sigma=1$的正态分布. 论据1——查看 ...

  3. CREATE OR REPLACE FUNCTION

    CREATE OR REPLACE FUNCTION SF_Taishou_Ksai_Date(v_receiptNum IN CHAR,                                ...

  4. laravel5.6 发送邮件附带邮件时,Unable to open file for reading,报错文件路径问题

    https://stackoverflow.com/questions/48568739/unable-to-open-file-for-reading-swift-ioexception-in-la ...

  5. vue3——vue数据循环渲染

    博客地址 :https://www.cnblogs.com/sandraryan/ vue循环渲染 <!DOCTYPE html> <html lang="en" ...

  6. Jieba分词包(一)——解析主函数cut

    1. 解析主函数cut Jieba分词包的主函数在jieba文件夹下的__init__.py中,在这个py文件中有个cut的函数,这个就是控制着整个jieba分词包的主函数.    cut函数的定义如 ...

  7. JavaScript 全国级省市县联动

    <div class="right_content clearfix"> <h3 class="common_title2">收货地址& ...

  8. Activiti7工作流+SpringBoot

    文章目录 一. Activiti相关概念 1. Activiti介绍 2. 核心类 2.1 ProcessEngine 2.2 服务(Service)类 2.2.1 TaskService 2.2.2 ...

  9. java 两种进程创建方式比较

    A extends Thread: 简单 不能再继承其他类了(Java单继承) 同份资源不共享 A implements Runnable:(推荐) 多个线程共享一个目标资源,适合多线程处理同一份资源 ...

  10. java反斜杠替换

    java replaceAll() 方法要用 4 个反斜杠,表示一个反斜杠 例如 str1="aa\bbb"; str2="aa'bbb"; 要想替换成 str ...