【题解】ARC101F Robots and Exits(DP转格路+树状数组优化DP)
【题解】ARC101F Robots and Exits(DP转格路+树状数组优化DP)
先删去所有只能进入一个洞的机器人,这对答案没有贡献
考虑一个机器人只能进入两个洞,且真正的限制条件是操作的前缀\(\min \max\),我们直接按照前缀\(\min \max\)\(DP\)
把前缀\(\min \max\)设成坐标,转成格路问题,现在就变成了平面上有若干点要用一条折线分开这些点使得\(n\)对配对点在平面的两侧。
由于我们要保证方案不重,所以要钦定经过某个配对关系的下面那个点,转移方程是
\]
直接树状数组维护\(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)的更多相关文章
- 【题解】Music Festival(树状数组优化dp)
		
[题解]Music Festival(树状数组优化dp) Gym - 101908F 题意:有\(n\)种节目,每种节目有起始时间和结束时间和权值.同一时刻只能看一个节目(边界不算),在所有种类都看过 ...
 - HDU 6240 Server(2017 CCPC哈尔滨站  K题,01分数规划 + 树状数组优化DP)
		
题目链接 2017 CCPC Harbin Problem K 题意 给定若干物品,每个物品可以覆盖一个区间.现在要覆盖区间$[1, t]$. 求选出来的物品的$\frac{∑a_{i}}{∑b_ ...
 - Codeforces 946G  Almost Increasing Array (树状数组优化DP)
		
题目链接 Educational Codeforces Round 39 Problem G 题意 给定一个序列,求把他变成Almost Increasing Array需要改变的最小元素个数. ...
 - LUOGU P2344 奶牛抗议 (树状数组优化dp)
		
传送门 解题思路 树状数组优化dp,f[i]表示前i个奶牛的分组的个数,那么很容易得出$f[i]=\sum\limits_{1\leq j\leq i}f[j-1]*(sum[i]\ge sum[j- ...
 - Codeforces 909C Python Indentation:树状数组优化dp
		
题目链接:http://codeforces.com/contest/909/problem/C 题意: Python是没有大括号来标明语句块的,而是用严格的缩进来体现. 现在有一种简化版的Pytho ...
 - BZOJ3594: [Scoi2014]方伯伯的玉米田【二维树状数组优化DP】
		
Description 方伯伯在自己的农田边散步,他突然发现田里的一排玉米非常的不美. 这排玉米一共有N株,它们的高度参差不齐. 方伯伯认为单调不下降序列很美,所以他决定先把一些玉米拔高,再把破坏美感 ...
 - Codeforces 629D Babaei and Birthday Cake(树状数组优化dp)
		
题意: 线段树做法 分析: 因为每次都是在当前位置的前缀区间查询最大值,所以可以直接用树状数组优化.比线段树快了12ms~ 代码: #include<cstdio> #include< ...
 - BZOJ 3594: [Scoi2014]方伯伯的玉米田 (二维树状数组优化DP)
		
分析 首先每次增加的区间一定是[i,n][i,n][i,n]的形式.因为如果选择[i,j](j<n)[i,j](j<n)[i,j](j<n)肯定不如把后面的全部一起加111更优. 那 ...
 - 4.9 省选模拟赛 划分序列 二分 结论 树状数组优化dp
		
显然发现可以二分. 对于n<=100暴力dp f[i][j]表示前i个数分成j段对于当前的答案是否可行. 可以发现这个dp是可以被优化的 sum[i]-sum[j]<=mid sum[i] ...
 
随机推荐
- 第四次C++
			
继承与派生 一.什么是继承和派生 所谓继承就是从先辈处得到属性和行为特征.类的继承,是新的类从已有类那里得到已有的特性.从另一个角度来看这个问题,从已有类产生新类的过程就是类的派生.类的继承与派生机制 ...
 - oracle函数 NLS_INITCAP(x[,y])
			
[功能]返回字符串并将字符串的第一个字母变为大写,其它字母小写; [参数]x字符型表达式 [参数]Nls_param可选, 查询数据级的NLS设置:select * from nls_database ...
 - Getting started with the basics of programming exercises_1
			
1.编写一个将输入复制到输出的程序,并将其中连续的多个空格用一个空格代替 使用if 结构: #include<stdio.h> #define NONBLANK 'a'; // repal ...
 - xml path 列转行实例
			
SQL Server2005提供了一个新查询语法——For XML PATH(''),这个语法有什么用呢?想象一下这样一个查询需求:有两个表,班级表A.学生表B,要查询一个班级里有哪些学生?针对这个需 ...
 - hdu 4430 Yukari's Birthday (简单数学 + 二分)
			
Problem - 4430 题意是,给出蜡烛的数量,要求求出r和k,r是蜡烛的层数,k是每一层蜡烛数目的底数. 开始的时候,没有看清题目,其实中间的那根蜡烛是可放可不放的.假设放置中间的那根蜡烛,就 ...
 - 立足GitHub学编程:13个不容错过的Java项目
			
立足GitHub学编程:13个不容错过的Java项目 今天我们将整理一大波干货满满的Java示例代码与能力展示素材. GitHub可谓一座程序开发的大宝库,有些素材值得fork,有些则能帮助我们改进自 ...
 - 简单的Spring Batch示例
			
使用Spring Batch做为批处理框架,可以完成常规的数据量不是特别大的离线计算. 现在写一个简单的入门版示例. 这里默认大家已经掌握了Spring Batch的基本知识,示例只是为了快速上手实践 ...
 - [转]vue - 前置工作 - 目录功能介绍
			
一个DEMOS的完整目录(由于GWF问题,我就不一一打开网站一个个去搜索并且解释了)可以去关注:https://www.cnblogs.com/ye-hcj build build.js(本文来自ht ...
 - Codeforces Round #186 (Div. 2)
			
A. Ilya and Bank Account 模拟. B. Ilya and Queries 前缀和. C. Ilya and Matrix 考虑每个元素的贡献. 边长为\(2^n\)时,贡献为最 ...
 - Java日志框架——JCL
			
JCL,全称为"Jakarta Commons Logging",也可称为"Apache Commons Logging". 一.JCL原理 1.基本原理 JC ...